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/21 11:33:39 UTC

[12/14] allura git commit: [#7866] ticket:754 Cache can_merge results

[#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/17b495be
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/17b495be
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/17b495be

Branch: refs/heads/ib/7866
Commit: 17b495be4a4f35d83c0d06298b7eb49521884ad0
Parents: 93a4230
Author: Igor Bondarenko <je...@gmail.com>
Authored: Sat Apr 18 11:34:27 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:15:32 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/17b495be/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/17b495be/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/17b495be/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/17b495be/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();