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(),