You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by je...@apache.org on 2015/04/20 12:45:39 UTC

[1/7] allura git commit: [#7866] ticket:754 Refactor code to support can_merge backgroud task (WIP)

Repository: allura
Updated Branches:
  refs/heads/ib/7866 [created] 49298f0c6


[#7866] ticket:754 Refactor code to support can_merge backgroud task (WIP)


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/866db97a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/866db97a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/866db97a

Branch: refs/heads/ib/7866
Commit: 866db97a8613db7106a8f399f48634b445ccae8d
Parents: 3ff1ade
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 17 13:04:14 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Fri Apr 17 13:04:14 2015 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/repository.py         |   8 +-
 Allura/allura/model/repository.py               |  34 ++++--
 Allura/allura/tasks/repo_tasks.py               |   9 +-
 Allura/allura/templates/repo/merge_request.html | 113 +++++++++++++------
 4 files changed, 118 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/866db97a/Allura/allura/controllers/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index b36449c..07a522b 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -366,7 +366,9 @@ class MergeRequestController(object):
         return dict(
             downstream_app=downstream_app,
             req=self.req,
-            status=self.req.merge_task_status(),
+            can_merge=self.req.can_merge(),
+            can_merge_status=self.req.can_merge_task_status(),
+            merge_status=self.req.merge_task_status(),
             page=page,
             limit=limit,
             count=self.req.discussion_thread.post_count)
@@ -454,6 +456,10 @@ class MergeRequestController(object):
     def merge_task_status(self):
         return {'status': self.req.merge_task_status()}
 
+    @expose('json:')
+    def can_merge_task_status(self):
+        return {'status': self.req.can_merge_task_status()}
+
 
 class RefsController(object):
 

http://git-wip-us.apache.org/repos/asf/allura/blob/866db97a/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 8083e17..35d2870 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -838,20 +838,23 @@ class MergeRequest(VersionedArtifact, ActivityObject):
             return False
         return True
 
+    def can_merge_cache(self, source_hash, target_hash):
+        """
+        Returns True/False or None in case of cache miss.
+        """
+        return None
+
     def can_merge(self):
         """
         Returns true if you can merge cleanly (no conflicts)
         """
-        if not self.app.forkable:
-            return False
-        try:
-            result = self.app.repo.can_merge(self)
-        except:
-            log.exception(
-                "Can't determine if merge request %s can be merged",
-                self.url())
-            return False
-        return result
+        cached = self.can_merge_cache(None, None)
+        if cached is not None:
+            return cached
+        in_progress = self.can_merge_task_status() in ['ready', 'busy']
+        if self.app.forkable and not in_progress:
+            from allura.tasks import repo_tasks
+            repo_tasks.can_merge.post(self._id)
 
     def merge(self):
         in_progress = self.merge_task_status() in ['ready', 'busy']
@@ -870,6 +873,17 @@ class MergeRequest(VersionedArtifact, ActivityObject):
             return task.state
         return None
 
+    def can_merge_task_status(self):
+        task = MonQTask.query.find({
+            'state': {'$in': ['busy', 'complete', 'error', 'ready']},  # needed to use index
+            'task_name': 'allura.tasks.repo_tasks.can_merge',
+            'args': [self._id],
+            'time_queue': {'$gt': datetime.utcnow() - timedelta(days=1)}, # constrain on index further
+        }).sort('_id', -1).limit(1).first()
+        if task:
+            return task.state
+        return None
+
 
 # Basic commit information
 # One of these for each commit in the physical repo on disk. The _id is the

http://git-wip-us.apache.org/repos/asf/allura/blob/866db97a/Allura/allura/tasks/repo_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index e873694..d16755c 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -158,8 +158,15 @@ def tarball(revision, path):
 @task
 def merge(merge_request_id):
     from allura import model as M
-    log = logging.getLogger(__name__)
     mr = M.MergeRequest.query.get(_id=merge_request_id)
     mr.app.repo.merge(mr)
     mr.status = 'merged'
     session(mr).flush(mr)
+
+
+@task
+def can_merge(merge_request_id):
+    from allura import model as M
+    mr = M.MergeRequest.query.get(_id=merge_request_id)
+    result = self.app.repo.can_merge(self)
+    # TODO: set cache

http://git-wip-us.apache.org/repos/asf/allura/blob/866db97a/Allura/allura/templates/repo/merge_request.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/merge_request.html b/Allura/allura/templates/repo/merge_request.html
index 928a0db..99bcdec 100644
--- a/Allura/allura/templates/repo/merge_request.html
+++ b/Allura/allura/templates/repo/merge_request.html
@@ -34,8 +34,8 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
 
 {% block content %}
   <div class="grid-19">
-    <div id="task_status">
-      {% if status == 'complete' %}
+    <div id="merge_task_status" class="task_status">
+      {% if merge_status == 'complete' %}
         <h2 class="complete">Merged</h2>
       {% else %}
         <img src="{{g.forge_static('images/spinner.gif')}}" class="spinner" style="display:none"/>
@@ -44,6 +44,13 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
         <h2 class="fail">Something went wrong. Please, merge manually</h2>
       {% endif %}
     </div>
+    <div id="can_merge_task_status" class="task_status">
+      {% if can_merge_status != 'complete' %}
+        <img src="{{g.forge_static('images/spinner.gif')}}" class="spinner" style="display:none"/>
+        <h2 class="busy ready">Checking if merge is possible...</h2>
+        <h2 class="fail">Something went wrong. Please, merge manually</h2>
+      {% endif %}
+    </div>
   </div>
 
   {% if req.downstream_repo %}
@@ -58,20 +65,19 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
     <div>{{g.markdown.convert(req.description)}}</div>
 
     {% if req.merge_allowed(c.user) %}
-      {% set can_merge = req.can_merge() %}
       <div class="grid-19">
         <form action="merge" method="POST">
           {{ lib.csrf_token() }}
-          <input type="submit" value="Merge"{% if not can_merge or status in ('ready', 'busy') %}disabled="disabled"{% endif %}>
-          {% if can_merge %}
-            <div class="merge-ok">
-              Merge request has no conflicts. You can merge automatically.
-            </div>
-          {% else %}
-            <div class="merge-conflicts">
-              Merge request has conflicts. Follow manual instructions below to merge.
-            </div>
-          {% endif %}
+          <input id="merge-btn" type="submit" value="Merge"{% if not can_merge or merge_status in ('ready', 'busy') %}disabled="disabled"{% endif %}>
+          <div class="merge-help-text can-merge-in-progress" {% if can_merge == None %}style="display: block;"{% endif %}>
+            Checking if merge is possible...
+          </div>
+          <div class="merge-help-text merge-ok" {% if can_merge == True %}style="display: block;"{% endif %}>
+            Merge request has no conflicts. You can merge automatically.
+          </div>
+          <div class="merge-help-text merge-conflicts" {% if can_merge == False %}style="display: block;"{% endif %}>
+            Merge request has conflicts. Follow manual instructions below to merge.
+          </div>
         </form>
       </div>
     {% endif %}
@@ -87,7 +93,7 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
       <div class="grid-19">
         <textarea style="width:80%; height:60px;" readonly>{{ c.app.repo.merge_command(req) | safe }}</textarea>
       </div>
-      {% if status not in ('ready', 'busy') %}
+      {% if merge_status not in ('ready', 'busy') %}
         {{ c.mr_dispose_form.display(action="save", value=dict(status=req.status)) }}
         <br style="clear:both">
       {% endif %}
@@ -122,15 +128,17 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
 
 {% block extra_css %}
 <style type="text/css">
+  .merge-help-text { display: none; }
   .merge-ok { color: green; }
   .merge-conflicts { color: red; }
-
-  #task_status { margin: 0 10px; }
-  #task_status h2 { display: none; }
-  #task_status .{{ status }} { display: inline-block; }
-  #task_status h2.complete { color: #C6D880; }
-  #task_status h2.busy, #task_status h2.busy { color: #003565; }
-  #task_status h2.fail { color: #f33; }
+  .can-merge-in-progress { color: grey; }
+
+  .task_status { margin: 0 10px; }
+  .task_status h2 { display: none; }
+  .task_status .{{ merge_status }} { display: inline-block; }
+  .task_status h2.complete { color: #C6D880; }
+  .task_status h2.busy, .task_status h2.busy { color: #003565; }
+  .task_status h2.fail { color: #f33; }
 </style>
 {% endblock %}
 
@@ -138,35 +146,72 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
 {{ super() }}
 <script type="text/javascript">
 $(function() {
-    {% if status in ('ready', 'busy') %}
-        $('.spinner').show();
+    {% if merge_status in ('ready', 'busy') %}
+        $('#merge_task_status > .spinner').show();
         var delay = 500;
-        function check_status() {
+        function check_merge_status() {
           $.get("{{request.path.rstrip('/') + '/merge_task_status'}}", function(data) {
                 if (data.status === 'complete') {
-                    $('.spinner').hide();
-                    $('#task_status h2').hide();
-                    $('#task_status h2.complete').show();
+                    $('#merge_task_status > .spinner').hide();
+                    $('#merge_task_status h2').hide();
+                    $('#merge_task_status h2.complete').show();
                     location.reload();
                 } else {
                     if (data.status === 'ready' || data.status === 'busy') {
                         // keep waiting
-                        $('#task_status h2').hide();
-                        $('#task_status h2.busy').show();
+                        $('#merge_task_status h2').hide();
+                        $('#merge_task_status h2.busy').show();
+                    } else {
+                        // something went wrong
+                        $('#merge_task_status > .spinner').hide();
+                        $('#merge_task_status h2').hide();
+                        $('#merge_task_status h2.fail').show();
+                    }
+                    if (delay < 60000){
+                        delay = delay * 2;
+                    }
+                    window.setTimeout(check_merge_status, delay);
+                }
+            });
+        }
+        window.setTimeout(check_merge_status, delay);
+    {% endif %}
+
+    {% if can_merge_status in ('ready', 'busy') %}
+        $('#can_merge_task_status > .spinner').show();
+        var delay = 500;
+        function check_can_merge_status() {
+          $.get("{{request.path.rstrip('/') + '/can_merge_task_status'}}", function(data) {
+                if (data.status === 'complete') {
+                    $('#can_merge_task_status > .spinner').hide();
+                    $('#can_merge_task_status h2').hide();
+                    // TODO: check if actually can merge and show appropriate message
+                    $('.merge-help-text').hide();
+                    $('.merge-ok').show();
+                    $('.merge-btn').prop('disabled', false);
+                } else {
+                    if (data.status === 'ready' || data.status === 'busy') {
+                        // keep waiting
+                        $('#can_merge_task_status h2').hide();
+                        $('#can_merge_task_status h2.busy').show();
+                        $('.merge-help-text').hide();
+                        $('.can-merge-in-progress').show();
                     } else {
                         // something went wrong
-                        $('.spinner').hide();
-                        $('#task_status h2').hide();
-                        $('#task_status h2.fail').show();
+                        $('#can_merge_task_status > .spinner').hide();
+                        $('#can_merge_task_status h2').hide();
+                        $('#merge_task_status h2.fail').show();
+                        $('.merge-help-text').hide();
+                        $('.merge-conflicts').show();
                     }
                     if (delay < 60000){
                         delay = delay * 2;
                     }
-                    window.setTimeout(check_status, delay);
+                    window.setTimeout(check_can_merge_status, delay);
                 }
             });
         }
-        window.setTimeout(check_status, delay);
+        window.setTimeout(check_can_merge_status, delay);
     {% endif %}
 });
 </script>


[6/7] allura git commit: [#7866] ticket:754 Rewrite can_merge tests

Posted by je...@apache.org.
[#7866] ticket:754 Rewrite can_merge tests


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/ee6f0bb8
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/ee6f0bb8
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/ee6f0bb8

Branch: refs/heads/ib/7866
Commit: ee6f0bb8facc6499442f1181e192e0e6668582d2
Parents: 7b60d50
Author: Igor Bondarenko <je...@gmail.com>
Authored: Sat Apr 18 12:23:37 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Sat Apr 18 12:23:37 2015 +0000

----------------------------------------------------------------------
 Allura/allura/tests/model/test_repo.py | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/ee6f0bb8/Allura/allura/tests/model/test_repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_repo.py b/Allura/allura/tests/model/test_repo.py
index 54a30a6..d083675 100644
--- a/Allura/allura/tests/model/test_repo.py
+++ b/Allura/allura/tests/model/test_repo.py
@@ -760,15 +760,22 @@ class TestMergeRequest(object):
         self.mr.set_can_merge_cache(False)
         assert_equal(self.mr.can_merge_cache, {key: True, '123-123': False})
 
-    def test_can_merge(self):
-        assert_equal(self.mr.can_merge(),
-                     self.mr.app.repo.can_merge.return_value)
-        self.mr.app.repo.can_merge.assert_called_once_with(self.mr)
+    def test_can_merge_merged(self):
+        self.mr.status = 'merged'
+        assert_equal(self.mr.can_merge(), True)
 
-        self.mr.app.reset_mock()
-        self.mr.app.forkable = False
+    @mock.patch('allura.tasks.repo_tasks.can_merge', autospec=True)
+    def test_can_merge_cached(self, can_merge_task):
+        self.mr.set_can_merge_cache(False)
         assert_equal(self.mr.can_merge(), False)
-        assert_equal(self.mr.app.repo.can_merge.called, False)
+        self.mr.set_can_merge_cache(True)
+        assert_equal(self.mr.can_merge(), True)
+        assert_equal(can_merge_task.post.call_count, 0)
+
+    @mock.patch('allura.tasks.repo_tasks.can_merge', autospec=True)
+    def test_can_merge_not_cached(self, can_merge_task):
+        assert_equal(self.mr.can_merge(), None)
+        can_merge_task.post.assert_called_once_with(self.mr._id)
 
     @mock.patch('allura.tasks.repo_tasks.merge', autospec=True)
     def test_merge(self, merge_task):
@@ -788,3 +795,11 @@ class TestMergeRequest(object):
         assert_equal(self.mr.merge_task_status(), 'ready')
         M.MonQTask.run_ready()
         assert_equal(self.mr.merge_task_status(), 'complete')
+
+    def test_can_merge_task_status(self):
+        from allura.tasks import repo_tasks
+        assert_equal(self.mr.can_merge_task_status(), None)
+        repo_tasks.can_merge.post(self.mr._id)
+        assert_equal(self.mr.can_merge_task_status(), 'ready')
+        M.MonQTask.run_ready()
+        assert_equal(self.mr.can_merge_task_status(), 'complete')


[4/7] allura git commit: [#7866] ticket:754 Cache can_merge results

Posted by je...@apache.org.
[#7866] ticket:754 Cache can_merge results


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/b6c4d6b2
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/b6c4d6b2
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/b6c4d6b2

Branch: refs/heads/ib/7866
Commit: b6c4d6b245d8eca7ba5cdf99996c11533291c4c5
Parents: 9e95883
Author: Igor Bondarenko <je...@gmail.com>
Authored: Sat Apr 18 11:34:27 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Sat Apr 18 11:34:27 2015 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/repository.py         |  5 ++++
 Allura/allura/model/repository.py               | 28 ++++++++++++++++----
 Allura/allura/tasks/repo_tasks.py               |  4 ++-
 Allura/allura/templates/repo/merge_request.html | 15 ++++++++---
 4 files changed, 42 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/b6c4d6b2/Allura/allura/controllers/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index 07a522b..ce38b2b 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -460,6 +460,11 @@ class MergeRequestController(object):
     def can_merge_task_status(self):
         return {'status': self.req.can_merge_task_status()}
 
+    @expose('json:')
+    def can_merge_result(self):
+        """Return result from the cache. Used by js, after task was completed."""
+        return {'can_merge': self.req.can_merge()}
+
 
 class RefsController(object):
 

http://git-wip-us.apache.org/repos/asf/allura/blob/b6c4d6b2/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 35d2870..a9b07a0 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -737,6 +737,7 @@ class MergeRequest(VersionedArtifact, ActivityObject):
     created = FieldProperty(datetime, if_missing=datetime.utcnow)
     summary = FieldProperty(str)
     description = FieldProperty(str)
+    can_merge_cache = FieldProperty({str: bool})
 
     @property
     def activity_name(self):
@@ -838,17 +839,34 @@ class MergeRequest(VersionedArtifact, ActivityObject):
             return False
         return True
 
-    def can_merge_cache(self, source_hash, target_hash):
+    def can_merge_cache_key(self):
         """
-        Returns True/False or None in case of cache miss.
+        Returns key for can_merge_cache constructed from current
+        source & target branch commits.
         """
-        return None
+        source_hash = self.downstream.commit_id
+        target_hash = self.app.repo.commit(self.target_branch)._id
+        key = '{}-{}'.format(source_hash, target_hash)
+        return key
+
+    def get_can_merge_cache(self):
+        """Returns True/False or None in case of cache miss."""
+        key = self.can_merge_cache_key()
+        return self.can_merge_cache.get(key)
+
+    def set_can_merge_cache(self, val):
+        key = self.can_merge_cache_key()
+        self.can_merge_cache[key] = val
 
     def can_merge(self):
         """
-        Returns true if you can merge cleanly (no conflicts)
+        Returns boolean indicating if automatic merge is possible (no
+        conflicts). If result is unknown yet, returns None and fires a task to
+        get the result. Caches result for later reuse.
         """
-        cached = self.can_merge_cache(None, None)
+        if self.status == 'merged':
+            return True
+        cached = self.get_can_merge_cache()
         if cached is not None:
             return cached
         in_progress = self.can_merge_task_status() in ['ready', 'busy']

http://git-wip-us.apache.org/repos/asf/allura/blob/b6c4d6b2/Allura/allura/tasks/repo_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index 8191b54..614b4b0 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -169,4 +169,6 @@ def can_merge(merge_request_id):
     from allura import model as M
     mr = M.MergeRequest.query.get(_id=merge_request_id)
     result = mr.app.repo.can_merge(mr)
-    # TODO: set cache (or inside repo's can_merge?)
+    source_hash = mr.downstream.commit_id
+    target_hash = mr.app.repo.commit(mr.target_branch)._id
+    mr.set_can_merge_cache(result)

http://git-wip-us.apache.org/repos/asf/allura/blob/b6c4d6b2/Allura/allura/templates/repo/merge_request.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/merge_request.html b/Allura/allura/templates/repo/merge_request.html
index 37830b8..f87a894 100644
--- a/Allura/allura/templates/repo/merge_request.html
+++ b/Allura/allura/templates/repo/merge_request.html
@@ -201,12 +201,19 @@ $(function() {
     {% elif can_merge_status in ('ready', 'busy') %}
       var spinner = '#can_merge_task_status > .spinner';
       var url = "{{request.path.rstrip('/') + '/can_merge_task_status'}}";
+      var can_merge_result_url = "{{request.path.rstrip('/') + '/can_merge_result'}}";
       function on_complete() {
         $('#can_merge_task_status h2').hide();
-        // TODO: check if actually can merge and show appropriate message
-        $('.merge-help-text').hide();
-        $('.merge-ok').show();
-        $('#merge-btn').prop('disabled', false);
+        $.get(can_merge_result_url, function(data) {
+          $('.merge-help-text').hide();
+          if (data.can_merge) {
+            $('.merge-ok').show();
+            $('#merge-btn').prop('disabled', false);
+          } else {
+            $('.merge-conflicts').show();
+            $('#merge-btn').prop('disabled', true);
+          }
+        });
       }
       function on_progress() {
         $('#can_merge_task_status h2').hide();


[2/7] allura git commit: [#7866] ticket:754 Make ajax status checking more DRY

Posted by je...@apache.org.
[#7866] ticket:754 Make ajax status checking more DRY


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/9406558e
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/9406558e
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/9406558e

Branch: refs/heads/ib/7866
Commit: 9406558ee3ee466ef232c69e8fade10b0ed555e7
Parents: 866db97
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 17 13:20:14 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Fri Apr 17 13:42:29 2015 +0000

----------------------------------------------------------------------
 Allura/allura/templates/repo/merge_request.html | 144 ++++++++++---------
 1 file changed, 77 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/9406558e/Allura/allura/templates/repo/merge_request.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/merge_request.html b/Allura/allura/templates/repo/merge_request.html
index 99bcdec..37830b8 100644
--- a/Allura/allura/templates/repo/merge_request.html
+++ b/Allura/allura/templates/repo/merge_request.html
@@ -133,11 +133,12 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
   .merge-conflicts { color: red; }
   .can-merge-in-progress { color: grey; }
 
+  #merge_task_status .{{ merge_status }} { display: inline-block; }
+  #can_merge_task_status .{{ can_merge_status }} { display: inline-block; }
   .task_status { margin: 0 10px; }
   .task_status h2 { display: none; }
-  .task_status .{{ merge_status }} { display: inline-block; }
   .task_status h2.complete { color: #C6D880; }
-  .task_status h2.busy, .task_status h2.busy { color: #003565; }
+  .task_status h2.busy { color: #003565; }
   .task_status h2.fail { color: #f33; }
 </style>
 {% endblock %}
@@ -146,72 +147,81 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
 {{ super() }}
 <script type="text/javascript">
 $(function() {
-    {% if merge_status in ('ready', 'busy') %}
-        $('#merge_task_status > .spinner').show();
-        var delay = 500;
-        function check_merge_status() {
-          $.get("{{request.path.rstrip('/') + '/merge_task_status'}}", function(data) {
-                if (data.status === 'complete') {
-                    $('#merge_task_status > .spinner').hide();
-                    $('#merge_task_status h2').hide();
-                    $('#merge_task_status h2.complete').show();
-                    location.reload();
-                } else {
-                    if (data.status === 'ready' || data.status === 'busy') {
-                        // keep waiting
-                        $('#merge_task_status h2').hide();
-                        $('#merge_task_status h2.busy').show();
-                    } else {
-                        // something went wrong
-                        $('#merge_task_status > .spinner').hide();
-                        $('#merge_task_status h2').hide();
-                        $('#merge_task_status h2.fail').show();
-                    }
-                    if (delay < 60000){
-                        delay = delay * 2;
-                    }
-                    window.setTimeout(check_merge_status, delay);
-                }
-            });
-        }
-        window.setTimeout(check_merge_status, delay);
-    {% endif %}
+    function make_status_watcher(spinner_selector, status_url, on_complete, on_progress, on_error) {
+      var delay = 500;
+      var delay_threshold = 60000;
+
+      var check_status = function() {
+        $.get(status_url, function(data) {
+          if (data.status === 'complete') {
+            $(spinner).hide();
+            on_complete();
+          } else {
+            if (data.status === 'ready' || data.status === 'busy') {
+              on_progress();
+            } else {
+              $(spinner).hide();
+              on_error();
+            }
+            if (delay < delay_threshold) {
+              delay = delay * 2;
+            }
+            window.setTimeout(check_status, delay);
+          }
+        });
+      }
+
+      var start = function() {
+        $(spinner_selector).show();
+        window.setTimeout(check_status, delay);
+      }
+
+      return start;
+    }
 
-    {% if can_merge_status in ('ready', 'busy') %}
-        $('#can_merge_task_status > .spinner').show();
-        var delay = 500;
-        function check_can_merge_status() {
-          $.get("{{request.path.rstrip('/') + '/can_merge_task_status'}}", function(data) {
-                if (data.status === 'complete') {
-                    $('#can_merge_task_status > .spinner').hide();
-                    $('#can_merge_task_status h2').hide();
-                    // TODO: check if actually can merge and show appropriate message
-                    $('.merge-help-text').hide();
-                    $('.merge-ok').show();
-                    $('.merge-btn').prop('disabled', false);
-                } else {
-                    if (data.status === 'ready' || data.status === 'busy') {
-                        // keep waiting
-                        $('#can_merge_task_status h2').hide();
-                        $('#can_merge_task_status h2.busy').show();
-                        $('.merge-help-text').hide();
-                        $('.can-merge-in-progress').show();
-                    } else {
-                        // something went wrong
-                        $('#can_merge_task_status > .spinner').hide();
-                        $('#can_merge_task_status h2').hide();
-                        $('#merge_task_status h2.fail').show();
-                        $('.merge-help-text').hide();
-                        $('.merge-conflicts').show();
-                    }
-                    if (delay < 60000){
-                        delay = delay * 2;
-                    }
-                    window.setTimeout(check_can_merge_status, delay);
-                }
-            });
-        }
-        window.setTimeout(check_can_merge_status, delay);
+    {% if merge_status in ('ready', 'busy') %}
+      var spinner = '#merge_task_status > .spinner';
+      var url = "{{request.path.rstrip('/') + '/merge_task_status'}}";
+      function on_complete() {
+        $('#merge_task_status h2').hide();
+        $('#merge_task_status h2.complete').show();
+        location.reload();
+      }
+      function on_progress() {
+        $('#merge_task_status h2').hide();
+        $('#merge_task_status h2.busy').show();
+      }
+      function on_error() {
+        $('#merge_task_status h2').hide();
+        $('#merge_task_status h2.fail').show();
+      }
+      var start_watcher = make_status_watcher(spinner, url, on_complete, on_progress, on_error);
+      start_watcher();
+
+    {% elif can_merge_status in ('ready', 'busy') %}
+      var spinner = '#can_merge_task_status > .spinner';
+      var url = "{{request.path.rstrip('/') + '/can_merge_task_status'}}";
+      function on_complete() {
+        $('#can_merge_task_status h2').hide();
+        // TODO: check if actually can merge and show appropriate message
+        $('.merge-help-text').hide();
+        $('.merge-ok').show();
+        $('#merge-btn').prop('disabled', false);
+      }
+      function on_progress() {
+        $('#can_merge_task_status h2').hide();
+        $('#can_merge_task_status h2.busy').show();
+        $('.merge-help-text').hide();
+        $('.can-merge-in-progress').show();
+      }
+      function on_error() {
+        $('#can_merge_task_status h2').hide();
+        $('#can_merge_task_status h2.fail').show();
+        $('.merge-help-text').hide();
+        $('.merge-conflicts').show();
+      }
+      var start_watcher = make_status_watcher(spinner, url, on_complete, on_progress, on_error);
+      start_watcher();
     {% endif %}
 });
 </script>


[7/7] allura git commit: [#7866] ticket:754 Test can_merge task

Posted by je...@apache.org.
[#7866] ticket:754 Test can_merge task


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/49298f0c
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/49298f0c
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/49298f0c

Branch: refs/heads/ib/7866
Commit: 49298f0c6feecd61556bddbb5923a0c7174df435
Parents: ee6f0bb
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Apr 20 10:11:15 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Mon Apr 20 10:11:15 2015 +0000

----------------------------------------------------------------------
 Allura/allura/tasks/repo_tasks.py | 2 --
 Allura/allura/tests/test_tasks.py | 9 +++++++++
 2 files changed, 9 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/49298f0c/Allura/allura/tasks/repo_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index 614b4b0..e44ea94 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -169,6 +169,4 @@ def can_merge(merge_request_id):
     from allura import model as M
     mr = M.MergeRequest.query.get(_id=merge_request_id)
     result = mr.app.repo.can_merge(mr)
-    source_hash = mr.downstream.commit_id
-    target_hash = mr.app.repo.commit(mr.target_branch)._id
     mr.set_can_merge_cache(result)

http://git-wip-us.apache.org/repos/asf/allura/blob/49298f0c/Allura/allura/tests/test_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_tasks.py b/Allura/allura/tests/test_tasks.py
index d822229..4ad311c 100644
--- a/Allura/allura/tests/test_tasks.py
+++ b/Allura/allura/tests/test_tasks.py
@@ -75,6 +75,15 @@ class TestRepoTasks(unittest.TestCase):
         session.assert_called_once_with(mr)
         session.return_value.flush.assert_called_once_with(mr)
 
+    @mock.patch.object(M, 'MergeRequest', autospec=True)
+    def test_can_merge(self, MR):
+        mr = M.MergeRequest(_id='_id')
+        MR.query.get.return_value = mr
+        repo_tasks.can_merge(mr._id)
+        mr.app.repo.can_merge.assert_called_once_with(mr)
+        val = mr.app.repo.can_merge.return_value
+        mr.set_can_merge_cache.assert_called_once_with(val)
+
 
 class TestEventTasks(unittest.TestCase):
 


[3/7] allura git commit: [#7866] ticket:754 Fix error in can_merge task

Posted by je...@apache.org.
[#7866] ticket:754 Fix error in can_merge task


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/9e958830
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/9e958830
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/9e958830

Branch: refs/heads/ib/7866
Commit: 9e958830e8d956e527ea6ab5fb1e493a8c002462
Parents: 9406558
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 17 13:43:52 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Fri Apr 17 13:43:52 2015 +0000

----------------------------------------------------------------------
 Allura/allura/tasks/repo_tasks.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/9e958830/Allura/allura/tasks/repo_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index d16755c..8191b54 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -168,5 +168,5 @@ def merge(merge_request_id):
 def can_merge(merge_request_id):
     from allura import model as M
     mr = M.MergeRequest.query.get(_id=merge_request_id)
-    result = self.app.repo.can_merge(self)
-    # TODO: set cache
+    result = mr.app.repo.can_merge(mr)
+    # TODO: set cache (or inside repo's can_merge?)


[5/7] allura git commit: [#7866] ticket:754 Add tests for can_merge cache helpers

Posted by je...@apache.org.
[#7866] ticket:754 Add tests for can_merge cache helpers


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/7b60d506
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/7b60d506
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/7b60d506

Branch: refs/heads/ib/7866
Commit: 7b60d5068c91eda95af4a44b11b1a5af13e0ecaa
Parents: b6c4d6b
Author: Igor Bondarenko <je...@gmail.com>
Authored: Sat Apr 18 12:13:49 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Sat Apr 18 12:13:49 2015 +0000

----------------------------------------------------------------------
 Allura/allura/tests/model/test_repo.py | 30 ++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/7b60d506/Allura/allura/tests/model/test_repo.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/model/test_repo.py b/Allura/allura/tests/model/test_repo.py
index 8b406da..54a30a6 100644
--- a/Allura/allura/tests/model/test_repo.py
+++ b/Allura/allura/tests/model/test_repo.py
@@ -729,8 +729,36 @@ class TestMergeRequest(object):
     def setUp(self):
         setup_basic_test()
         setup_global_objects()
-        self.mr = M.MergeRequest(app_config=mock.Mock(_id=ObjectId()))
+        self.mr = M.MergeRequest(
+            app_config=mock.Mock(_id=ObjectId()),
+            downstream={'commit_id': '12345'},
+        )
         self.mr.app = mock.Mock(forkable=True)
+        self.mr.app.repo.commit.return_value = mock.Mock(_id='09876')
+
+    def test_can_merge_cache_key(self):
+        key = self.mr.can_merge_cache_key()
+        assert_equal(key, '12345-09876')
+
+    def test_get_can_merge_cache(self):
+        key = self.mr.can_merge_cache_key()
+        assert_equal(self.mr.get_can_merge_cache(), None)
+        self.mr.can_merge_cache[key] = True
+        assert_equal(self.mr.get_can_merge_cache(), True)
+
+        self.mr.can_merge_cache_key = lambda: '123-123'
+        self.mr.can_merge_cache['123-123'] = False
+        assert_equal(self.mr.get_can_merge_cache(), False)
+
+    def test_set_can_merge_cache(self):
+        key = self.mr.can_merge_cache_key()
+        assert_equal(self.mr.can_merge_cache, {})
+        self.mr.set_can_merge_cache(True)
+        assert_equal(self.mr.can_merge_cache, {key: True})
+
+        self.mr.can_merge_cache_key = lambda: '123-123'
+        self.mr.set_can_merge_cache(False)
+        assert_equal(self.mr.can_merge_cache, {key: True, '123-123': False})
 
     def test_can_merge(self):
         assert_equal(self.mr.can_merge(),