You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2015/04/21 16:46:58 UTC
[1/8] allura git commit: [#7866] ticket:754 Make ajax status checking
more DRY
Repository: allura
Updated Branches:
refs/heads/master fb7f2cf13 -> d162d676d
[#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/0be08e5f
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/0be08e5f
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/0be08e5f
Branch: refs/heads/master
Commit: 0be08e5fb7237f54c56c9614238270b923c7abe9
Parents: 76f05fa
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 17 13:20:14 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:15:31 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/0be08e5f/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>
[5/8] allura git commit: [#7866] ticket:754 Rewrite can_merge tests
Posted by br...@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/b76a9492
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/b76a9492
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/b76a9492
Branch: refs/heads/master
Commit: b76a9492d3664e56fe9a9b4f6570f2f439c000e5
Parents: 13ba80e
Author: Igor Bondarenko <je...@gmail.com>
Authored: Sat Apr 18 12:23:37 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:15:32 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/b76a9492/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')
[8/8] allura git commit: [#7866] ticket:758 Don't run can_merge task
when merge is dissabled
Posted by br...@apache.org.
[#7866] ticket:758 Don't run can_merge task when merge is dissabled
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/d162d676
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/d162d676
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/d162d676
Branch: refs/heads/master
Commit: d162d676dfa780eb0dd11de2e60c714b57c78aed
Parents: f32d2c3
Author: Igor Bondarenko <je...@gmail.com>
Authored: Tue Apr 21 08:56:34 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:56:34 2015 +0000
----------------------------------------------------------------------
Allura/allura/model/repository.py | 6 ++++--
Allura/allura/tests/model/test_repo.py | 7 +++++++
2 files changed, 11 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/d162d676/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index a9b07a0..8455395 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -827,13 +827,13 @@ class MergeRequest(VersionedArtifact, ActivityObject):
"""
Returns true if a merge is allowed by system and tool configuration.
"""
- if not c.app.forkable:
+ if not self.app.forkable:
return False
if self.status != 'open':
return False
if asbool(tg.config.get('scm.merge.{}.disabled'.format(self.app.config.tool_name))):
return False
- if not h.has_access(c.app, 'write', user):
+ if not h.has_access(self.app, 'write', user):
return False
if self.app.config.options.get('merge_disabled'):
return False
@@ -864,6 +864,8 @@ class MergeRequest(VersionedArtifact, ActivityObject):
conflicts). If result is unknown yet, returns None and fires a task to
get the result. Caches result for later reuse.
"""
+ if not self.merge_allowed(c.user):
+ return None
if self.status == 'merged':
return True
cached = self.get_can_merge_cache()
http://git-wip-us.apache.org/repos/asf/allura/blob/d162d676/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 d083675..f71ad71 100644
--- a/Allura/allura/tests/model/test_repo.py
+++ b/Allura/allura/tests/model/test_repo.py
@@ -735,6 +735,7 @@ class TestMergeRequest(object):
)
self.mr.app = mock.Mock(forkable=True)
self.mr.app.repo.commit.return_value = mock.Mock(_id='09876')
+ self.mr.merge_allowed = mock.Mock(return_value=True)
def test_can_merge_cache_key(self):
key = self.mr.can_merge_cache_key()
@@ -777,6 +778,12 @@ class TestMergeRequest(object):
assert_equal(self.mr.can_merge(), None)
can_merge_task.post.assert_called_once_with(self.mr._id)
+ @mock.patch('allura.tasks.repo_tasks.can_merge', autospec=True)
+ def test_can_merge_disabled(self, can_merge_task):
+ self.mr.merge_allowed.return_value = False
+ assert_equal(self.mr.can_merge(), None)
+ assert_equal(can_merge_task.post.call_count, 0)
+
@mock.patch('allura.tasks.repo_tasks.merge', autospec=True)
def test_merge(self, merge_task):
self.mr.merge_task_status = lambda: None
[3/8] allura git commit: [#7866] ticket:754 Test can_merge task
Posted by br...@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/f32d2c38
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/f32d2c38
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/f32d2c38
Branch: refs/heads/master
Commit: f32d2c387986eb29a3e53d76f0a0b4e34d7162f6
Parents: b76a949
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Apr 20 10:11:15 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:15:32 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/f32d2c38/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/f32d2c38/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):
[7/8] allura git commit: [#7866] ticket:754 Add tests for can_merge
cache helpers
Posted by br...@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/13ba80ea
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/13ba80ea
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/13ba80ea
Branch: refs/heads/master
Commit: 13ba80eab2acb6934ffb2b9b92e407b46794fbc5
Parents: 17b495b
Author: Igor Bondarenko <je...@gmail.com>
Authored: Sat Apr 18 12:13:49 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:15:32 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/13ba80ea/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(),
[6/8] allura git commit: [#7866] ticket:754 Cache can_merge results
Posted by br...@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/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/master
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();
[4/8] allura git commit: [#7866] ticket:754 Fix error in can_merge
task
Posted by br...@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/93a4230a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/93a4230a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/93a4230a
Branch: refs/heads/master
Commit: 93a4230a87df0785c31faf21a5f7c9e1ccbc17c1
Parents: 0be08e5
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 17 13:43:52 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:15:32 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/93a4230a/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?)
[2/8] allura git commit: [#7866] ticket:754 Refactor code to support
can_merge backgroud task (WIP)
Posted by br...@apache.org.
[#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/76f05fab
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/76f05fab
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/76f05fab
Branch: refs/heads/master
Commit: 76f05fabc43acab1f15416b3dd2423daf34a954b
Parents: fb7f2cf
Author: Igor Bondarenko <je...@gmail.com>
Authored: Fri Apr 17 13:04:14 2015 +0000
Committer: Igor Bondarenko <je...@gmail.com>
Committed: Tue Apr 21 08:15:31 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/76f05fab/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/76f05fab/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/76f05fab/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/76f05fab/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>