mozreview: Add functions to get diff URLs to rb_utils (
bug 1226080); r?glob
Getting a diff URL from a review request or a review request URL is a common
operation.
MozReview-Commit-ID: Fk70PQPxaur
--- a/pylib/mozreview/mozreview/bugzilla/client.py
+++ b/pylib/mozreview/mozreview/bugzilla/client.py
@@ -10,17 +10,21 @@ from urlparse import urlparse, urlunpars
from django.contrib.auth.models import User
from djblets.siteconfig.models import SiteConfiguration
from djblets.util.decorators import simple_decorator
from mozreview.bugzilla.errors import BugzillaError, BugzillaUrlError
from mozreview.bugzilla.models import get_or_create_bugzilla_users
from mozreview.bugzilla.transports import bugzilla_transport
-from mozreview.rb_utils import get_obj_url
+from mozreview.rb_utils import (
+ get_diff_url,
+ get_diff_url_from_rr_url,
+ get_obj_url,
+)
from mozautomation.commitparser import (
replace_reviewers,
strip_commit_metadata,
)
logger = logging.getLogger(__name__)
@@ -93,17 +97,17 @@ class BugzillaAttachmentUpdates(object):
'status': 'X'
}
"""
logger.info('Posting review request %s to bug %d.' %
(review_request.id, self.bug_id))
rr_url = get_obj_url(review_request)
- diff_url = self._get_diff_url(review_request)
+ diff_url = get_diff_url(review_request)
# Build the comment. Only post a comment if the diffset has
# actually changed.
comment = ''
if review_request_draft.get_latest_diffset():
diffset_count = review_request.diffset_history.diffsets.count()
if diffset_count < 1:
# We don't need the first line, since it is also the attachment
@@ -207,34 +211,31 @@ class BugzillaAttachmentUpdates(object):
def get_attachment(self, review_request):
"""Return the attachment for the specified review request.
Returns `None` if an attachment hasn't yet been created for the
review request.
"""
self._update_attachments()
- url = self._get_diff_url(review_request)
+ url = get_diff_url(review_request)
for a in self.attachments:
# Make sure we check for old-style URLs as well.
if not self.bugzilla._rb_attach_url_matches(a['data'], url):
continue
return a
return None
def _update_attachments(self):
if not self.attachments:
self.attachments = self.bugzilla.get_rb_attachments(self.bug_id)
- def _get_diff_url(self, review_request):
- return '%sdiff/#index_header' % get_obj_url(review_request)
-
class Bugzilla(object):
"""
Interface to a Bugzilla system.
At the moment this uses the XMLRPC API. It should probably be converted
to REST at some point.
@@ -373,17 +374,17 @@ class Bugzilla(object):
return [a for a
in self.proxy.Bug.attachments(params)['bugs'][str(bug_id)]
if a['content_type'] == 'text/x-review-board-request']
def _rb_attach_url_matches(self, attach_url, rb_url):
# Make sure we check for old-style URLs as well.
return (attach_url == rb_url or
- '%sdiff/#index_header' % attach_url == rb_url)
+ get_diff_url_from_rr_url(attach_url) == rb_url)
def _get_review_request_attachment(self, bug_id, rb_url):
"""Obtain a Bugzilla attachment for a review request."""
for a in self.get_rb_attachments(bug_id):
if self._rb_attach_url_matches(a.get('data'), rb_url):
return a
return None
--- a/pylib/mozreview/mozreview/rb_utils.py
+++ b/pylib/mozreview/mozreview/rb_utils.py
@@ -18,8 +18,16 @@ def get_obj_url(obj, site=None, siteconf
if not siteconfig:
siteconfig = SiteConfiguration.objects.get_current()
return '%s://%s%s%s' % (
siteconfig.get('site_domain_method'), site.domain,
local_site_reverse('root').rstrip('/'),
obj.get_absolute_url())
+
+
+def get_diff_url_from_rr_url(rr_url):
+ return '%sdiff/#index_header' % rr_url
+
+
+def get_diff_url(review_request):
+ return get_diff_url_from_rr_url(get_obj_url(review_request))
--- a/pylib/mozreview/mozreview/signal_handlers.py
+++ b/pylib/mozreview/mozreview/signal_handlers.py
@@ -83,16 +83,17 @@ from mozreview.messages import (
OBSOLETE_DESCRIPTION,
)
from mozreview.models import (
CommitData,
DiffSetVerification,
get_bugzilla_api_key,
)
from mozreview.rb_utils import (
+ get_diff_url,
get_obj_url,
)
from mozreview.review_helpers import (
get_reviewers_status,
)
from mozreview.signals import (
commit_request_publishing,
)
@@ -540,19 +541,19 @@ def on_review_request_closed_discarded(u
ReviewRequest.DISCARDED,
AUTO_CLOSE_DESCRIPTION,
commit_data=commit_data)
else:
# TODO: Remove this once we properly prevent users from closing
# commit review requests.
b = Bugzilla(get_bugzilla_api_key(user))
bug = int(review_request.get_bug_list()[0])
- diff_url = '%sdiff/#index_header' % get_obj_url(review_request)
attachment_updates = BugzillaAttachmentUpdates(b, bug)
- attachment_updates.obsolete_review_attachments(diff_url)
+ attachment_updates.obsolete_review_attachments(
+ get_diff_url(review_request))
attachment_updates.do_updates()
def on_review_request_closed_submitted(user, review_request, type, **kwargs):
if type != ReviewRequest.SUBMITTED:
return
commit_data = fetch_commit_data(review_request)
@@ -656,17 +657,17 @@ def on_review_publishing(user, review, *
# flag was set, in which case throw an error.
# Ship-its and review flags are allowed only on child commits.
if review.ship_it or review.extra_data.get(REVIEW_FLAG_KEY):
raise ParentShipItError
[b.post_comment(int(bug_id), comment) for bug_id in
review_request.get_bug_list()]
else:
- diff_url = '%sdiff/#index_header' % get_obj_url(review_request)
+ diff_url = get_diff_url(review_request)
bug_id = int(review_request.get_bug_list()[0])
commented = False
flag = review.extra_data.get(REVIEW_FLAG_KEY)
if flag is not None:
commented = b.set_review_flag(bug_id, flag, review.user.email,
diff_url, comment)