14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
from __future__ import absolute_import
44
When making a commit, metadata about bugs fixed by that change can be
46
"""When making a commit, metadata about bugs fixed by that change can be
45
47
recorded by using the ``--fixes`` option. For each bug marked as fixed, an
46
48
entry is included in the 'bugs' revision property stating '<url> <status>'.
47
49
(The only ``status`` value currently supported is ``fixed.``)
222
216
tracker = tracker_type.get(abbreviated_bugtracker_name, branch)
223
217
if tracker is not None:
225
raise UnknownBugTrackerAbbreviation(
226
abbreviated_bugtracker_name, branch)
219
raise UnknownBugTrackerAbbreviation(abbreviated_bugtracker_name,
228
222
def help_topic(self, topic):
229
223
return _bugs_help
274
268
self.base_url = base_url
276
270
def get(self, abbreviated_bugtracker_name, branch):
277
"""Returns the tracker if the abbreviation matches, otherwise ``None``.
271
"""Returns the tracker if the abbreviation matches. Returns None
279
273
if abbreviated_bugtracker_name != self.abbreviation:
285
279
return self.base_url + str(bug_id)
288
class ProjectIntegerBugTracker(IntegerBugTracker):
289
"""A bug tracker that exists in one place only with per-project ids.
291
If you have one of these trackers then register an instance passing in an
292
abbreviated name for the bug tracker and a base URL. The bug ids are
293
appended directly to the URL.
296
def __init__(self, abbreviated_bugtracker_name, base_url):
297
self.abbreviation = abbreviated_bugtracker_name
298
self._base_url = base_url
300
def get(self, abbreviated_bugtracker_name, branch):
301
"""Returns the tracker if the abbreviation matches, otherwise ``None``.
303
if abbreviated_bugtracker_name != self.abbreviation:
307
def check_bug_id(self, bug_id):
309
(project, bug_id) = bug_id.rsplit('/', 1)
311
raise MalformedBugIdentifier(bug_id, "Expected format: project/id")
315
raise MalformedBugIdentifier(bug_id, "Bug id must be an integer")
317
def _get_bug_url(self, bug_id):
318
(project, bug_id) = bug_id.rsplit('/', 1)
319
"""Return the URL for bug_id."""
320
if '{id}' not in self._base_url:
321
raise InvalidBugTrackerURL(self._abbreviation, self._base_url)
322
if '{project}' not in self._base_url:
323
raise InvalidBugTrackerURL(self._abbreviation, self._base_url)
324
return self._base_url.replace(
325
'{project}', project).replace('{id}', str(bug_id))
328
282
tracker_registry.register(
329
283
'launchpad', UniqueIntegerBugTracker('lp', 'https://launchpad.net/bugs/'))
333
287
'debian', UniqueIntegerBugTracker('deb', 'http://bugs.debian.org/'))
336
tracker_registry.register(
337
'gnome', UniqueIntegerBugTracker(
338
'gnome', 'http://bugzilla.gnome.org/show_bug.cgi?id='))
341
tracker_registry.register(
342
'github', ProjectIntegerBugTracker(
343
'github', 'https://github.com/{project}/issues/{id}'))
290
tracker_registry.register('gnome',
291
UniqueIntegerBugTracker('gnome',
292
'http://bugzilla.gnome.org/show_bug.cgi?id='))
346
295
class URLParametrizedBugTracker(BugTracker):
418
ALLOWED_BUG_STATUSES = {FIXED, RELATED}
365
ALLOWED_BUG_STATUSES = {FIXED}
421
368
def encode_fixes_bug_urls(bug_urls):
422
369
"""Get the revision property value for a commit that fixes bugs.
424
:param bug_urls: An iterable of (escaped URL, tag) tuples. These normally
371
:param bug_urls: An iterable of escaped URLs to bugs. These normally
425
372
come from `get_bug_url`.
426
373
:return: A string that will be set as the 'bugs' property of a revision
427
374
as part of a commit.
430
for (url, tag) in bug_urls:
432
raise InvalidBugUrl(url)
433
lines.append('%s %s' % (url, tag))
434
return '\n'.join(lines)
437
def decode_bug_urls(bug_text):
438
"""Decode a bug property text.
440
:param bug_text: Contents of a bugs property
441
:return: iterator over (url, status) tuples
443
for line in bug_text.splitlines():
445
url, status = line.split(None, 2)
447
raise InvalidLineInBugsProperty(line)
448
if status not in ALLOWED_BUG_STATUSES:
449
raise InvalidBugStatus(status)
376
return '\n'.join(('%s %s' % (url, FIXED)) for url in bug_urls)