Rev 3075: (Lukáš Lalinský) Generic bug tracker config: 'bugtracker_XXX_url' in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Tue Dec 4 18:53:34 GMT 2007
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 3075
revision-id:pqm at pqm.ubuntu.com-20071204185324-guhluk76wrccurxj
parent: pqm at pqm.ubuntu.com-20071204035213-2kot5u403spjchen
parent: john at arbash-meinel.com-20071204181151-br85qwsgshso16q5
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Tue 2007-12-04 18:53:24 +0000
message:
(Lukáš Lalinský) Generic bug tracker config: 'bugtracker_XXX_url'
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/bugtracker.py bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
bzrlib/errors.py errors.py-20050309040759-20512168c4e14fbd
bzrlib/tests/test_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
bzrlib/tests/test_errors.py test_errors.py-20060210110251-41aba2deddf936a8
doc/en/user-guide/bug_trackers.txt bug_trackers.txt-20070713223459-khxdlcudraii95uv-1
------------------------------------------------------------
revno: 3035.3.3
revision-id:john at arbash-meinel.com-20071204181151-br85qwsgshso16q5
parent: lalinsky at gmail.com-20071127192740-2dv4oe4fd9hfhbyc
parent: pqm at pqm.ubuntu.com-20071204035213-2kot5u403spjchen
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: jam-integration
timestamp: Tue 2007-12-04 12:11:51 -0600
message:
[merge] bzr.dev 3074
added:
doc/en/tutorials/ docentutorials-20071127235845-bm2lu60bvau1ptmh-1
doc/en/user-guide/annotating_changes.txt annotating_changes.t-20071122141511-0knao2lklsdsvb1q-1
doc/en/user-guide/bazaar_workflows.txt bazaar_workflows.txt-20071114035000-q36a9h57ps06uvnl-1
doc/en/user-guide/best_practice_intro.txt best_practice_intro.-20071123154453-dk2mjhrg1vpjm5w2-1
doc/en/user-guide/branching_a_project.txt branching_a_project.-20071122141511-0knao2lklsdsvb1q-2
doc/en/user-guide/browsing_history.txt browsing_history.txt-20071121073725-0corxykv5irjal00-2
doc/en/user-guide/central_intro.txt central_intro.txt-20071123055134-k5x4ekduci2lbn36-1
doc/en/user-guide/configuring_bazaar.txt configuring_bazaar.t-20071128000722-ncxiua259xwbdbg7-1
doc/en/user-guide/controlling_registration.txt controlling_registra-20071121073725-0corxykv5irjal00-3
doc/en/user-guide/core_concepts.txt core_concepts.txt-20071114035000-q36a9h57ps06uvnl-2
doc/en/user-guide/distributed_intro.txt distributed_intro.tx-20071123154453-dk2mjhrg1vpjm5w2-2
doc/en/user-guide/entering_commands.txt using_bazaar.txt-20071114035000-q36a9h57ps06uvnl-6
doc/en/user-guide/getting_help.txt getting_help.txt-20071128000722-ncxiua259xwbdbg7-2
doc/en/user-guide/images/ images-20071114035000-q36a9h57ps06uvnl-3
doc/en/user-guide/images/workflows_centralized.png workflows_centralize-20071114035000-q36a9h57ps06uvnl-8
doc/en/user-guide/images/workflows_centralized.svg workflows_centralize-20071130043324-bhms0cgyphhq1b2x-1
doc/en/user-guide/images/workflows_gatekeeper.png workflows_gatekeeper-20071114035000-q36a9h57ps06uvnl-9
doc/en/user-guide/images/workflows_gatekeeper.svg workflows_gatekeeper-20071130043324-bhms0cgyphhq1b2x-2
doc/en/user-guide/images/workflows_localcommit.png workflows_localcommi-20071114035000-q36a9h57ps06uvnl-10
doc/en/user-guide/images/workflows_localcommit.svg workflows_localcommi-20071130043324-bhms0cgyphhq1b2x-3
doc/en/user-guide/images/workflows_peer.png workflows_peer.png-20071114035000-q36a9h57ps06uvnl-11
doc/en/user-guide/images/workflows_peer.svg workflows_peer.svg-20071130043324-bhms0cgyphhq1b2x-4
doc/en/user-guide/images/workflows_pqm.png workflows_pqm.png-20071114035000-q36a9h57ps06uvnl-12
doc/en/user-guide/images/workflows_pqm.svg workflows_pqm.svg-20071130043324-bhms0cgyphhq1b2x-5
doc/en/user-guide/images/workflows_shared.png workflows_shared.png-20071114035000-q36a9h57ps06uvnl-13
doc/en/user-guide/images/workflows_shared.svg workflows_shared.svg-20071130043324-bhms0cgyphhq1b2x-6
doc/en/user-guide/images/workflows_single.png workflows_single.png-20071114035000-q36a9h57ps06uvnl-14
doc/en/user-guide/images/workflows_single.svg workflows_single.svg-20071130043324-bhms0cgyphhq1b2x-7
doc/en/user-guide/installing_bazaar.txt installing_bazaar.tx-20071114035000-q36a9h57ps06uvnl-4
doc/en/user-guide/introducing_bazaar.txt introducing_bazaar.t-20071114035000-q36a9h57ps06uvnl-5
doc/en/user-guide/merging_changes.txt merging_changes.txt-20071122141511-0knao2lklsdsvb1q-3
doc/en/user-guide/organizing_branches.txt organizing_branches.-20071123154453-dk2mjhrg1vpjm5w2-3
doc/en/user-guide/partner_intro.txt partner_workflow.txt-20071122141511-0knao2lklsdsvb1q-4
doc/en/user-guide/publishing_a_branch.txt publishing_a_branch.-20071123055134-k5x4ekduci2lbn36-2
doc/en/user-guide/recording_changes.txt recording_changes.tx-20071121073725-0corxykv5irjal00-4
doc/en/user-guide/releasing_a_project.txt releasing_a_project.-20071121073725-0corxykv5irjal00-5
doc/en/user-guide/resolving_conflicts.txt resolving_conflicts.-20071122141511-0knao2lklsdsvb1q-5
doc/en/user-guide/reusing_a_checkout.txt reusing_a_checkout.t-20071123055134-k5x4ekduci2lbn36-3
doc/en/user-guide/reviewing_changes.txt reviewing_changes.tx-20071121073725-0corxykv5irjal00-6
doc/en/user-guide/sending_changes.txt sending_changes.txt-20071123154453-dk2mjhrg1vpjm5w2-4
doc/en/user-guide/solo_intro.txt solo_workflow.txt-20071121073725-0corxykv5irjal00-7
doc/en/user-guide/starting_a_project.txt starting_a_project.t-20071121073725-0corxykv5irjal00-8
doc/en/user-guide/undoing_mistakes.txt undoing_mistakes.txt-20071121092300-8fyacngt1w98e5mp-1
doc/en/user-guide/using_checkouts.txt using_checkouts.txt-20071123055134-k5x4ekduci2lbn36-4
doc/en/user-guide/using_gatekeepers.txt using_gatekeepers.tx-20071123154453-dk2mjhrg1vpjm5w2-5
doc/en/user-guide/working_offline_central.txt working_offline_cent-20071123055134-k5x4ekduci2lbn36-5
doc/en/user-guide/writing_a_plugin.txt writing_a_plugin.txt-20071114035000-q36a9h57ps06uvnl-7
renamed:
doc/en/user-guide/centralized_workflow.txt => doc/en/tutorials/centralized_workflow.txt centralized_workflow-20060830194948-kspf52565xvgrlil-1
doc/en/user-guide/tutorial.txt => doc/en/tutorials/tutorial.txt tutorial.txt-20050804190939-9dcbba2ef053bc84
modified:
Makefile Makefile-20050805140406-d96e3498bb61c5bb
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/branch.py branch.py-20050309040759-e4baf4e0d046576e
bzrlib/builtins.py builtins.py-20050830033751-fc01482b9ca23183
bzrlib/bundle/serializer/v4.py v10.py-20070611062757-5ggj7k18s9dej0fr-1
bzrlib/bzrdir.py bzrdir.py-20060131065624-156dfea39c4387cb
bzrlib/check.py check.py-20050309040759-f3a679400c06bcc1
bzrlib/commit.py commit.py-20050511101309-79ec1a0168e0e825
bzrlib/debug.py debug.py-20061102062349-vdhrw9qdpck8cl35-1
bzrlib/diff.py diff.py-20050309040759-26944fbbf2ebbf36
bzrlib/errors.py errors.py-20050309040759-20512168c4e14fbd
bzrlib/graph.py graph_walker.py-20070525030359-y852guab65d4wtn0-1
bzrlib/help_topics.py help_topics.py-20060920210027-rnim90q9e0bwxvy4-1
bzrlib/index.py index.py-20070712131115-lolkarso50vjr64s-1
bzrlib/inventory.py inventory.py-20050309040759-6648b84ca2005b37
bzrlib/knit.py knit.py-20051212171256-f056ac8f0fbe1bd9
bzrlib/log.py log.py-20050505065812-c40ce11702fe5fb1
bzrlib/mail_client.py mail_client.py-20070809192806-vuxt3t19srtpjpdn-1
bzrlib/merge.py merge.py-20050513021216-953b65a438527106
bzrlib/plugin.py plugin.py-20050622060424-829b654519533d69
bzrlib/plugins/launchpad/__init__.py __init__.py-20060315182712-2d5feebd2a1032dc
bzrlib/reconcile.py reweave_inventory.py-20051108164726-1e5e0934febac06e
bzrlib/reconfigure.py reconfigure.py-20070908040425-6ykgo7escxhyrg9p-1
bzrlib/remote.py remote.py-20060720103555-yeeg2x51vn0rbtdp-1
bzrlib/repofmt/pack_repo.py pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
bzrlib/repository.py rev_storage.py-20051111201905-119e9401e46257e3
bzrlib/revision.py revision.py-20050309040759-e77802c08f3999d5
bzrlib/smart/medium.py medium.py-20061103051856-rgu2huy59fkz902q-1
bzrlib/tests/HTTPTestUtil.py HTTPTestUtil.py-20050914180604-247d3aafb7a43343
bzrlib/tests/HttpServer.py httpserver.py-20061012142527-m1yxdj1xazsf8d7s-1
bzrlib/tests/__init__.py selftest.py-20050531073622-8d0e3c8845c97a64
bzrlib/tests/blackbox/test_commit.py test_commit.py-20060212094538-ae88fc861d969db0
bzrlib/tests/blackbox/test_log.py test_log.py-20060112090212-78f6ea560c868e24
bzrlib/tests/blackbox/test_merge.py test_merge.py-20060323225809-9bc0459c19917f41
bzrlib/tests/blackbox/test_reconfigure.py test_reconfigure.py-20070908173426-khfo5fi2rgzgtwj3-1
bzrlib/tests/blackbox/test_remove.py test_remove.py-20060530011439-fika5rm84lon0goe-1
bzrlib/tests/blackbox/test_send.py test_bundle.py-20060616222707-c21c8b7ea5ef57b1
bzrlib/tests/branch_implementations/test_create_checkout.py test_create_checkout-20070322193723-n2wkp1g03r0404di-1
bzrlib/tests/branch_implementations/test_pull.py test_pull.py-20060410103942-83c35b26657414fc
bzrlib/tests/bzrdir_implementations/test_bzrdir.py test_bzrdir.py-20060131065642-0ebeca5e30e30866
bzrlib/tests/interrepository_implementations/__init__.py __init__.py-20060220054744-baf49a1f88f17b1a
bzrlib/tests/interrepository_implementations/test_interrepository.py test_interrepository.py-20060220061411-1ec13fa99e5e3eee
bzrlib/tests/repository_implementations/__init__.py __init__.py-20060131092037-9564957a7d4a841b
bzrlib/tests/repository_implementations/test_check.py test_check.py-20070824124512-38g4d135gcqxo4zb-1
bzrlib/tests/repository_implementations/test_reconcile.py test_reconcile.py-20060223022332-572ef70a3288e369
bzrlib/tests/repository_implementations/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
bzrlib/tests/test_ancestry.py test_ancestry.py-20050913023709-69768e94848312c6
bzrlib/tests/test_bzrdir.py test_bzrdir.py-20060131065654-deba40eef51cf220
bzrlib/tests/test_diff.py testdiff.py-20050727164403-d1a3496ebb12e339
bzrlib/tests/test_errors.py test_errors.py-20060210110251-41aba2deddf936a8
bzrlib/tests/test_graph.py test_graph_walker.py-20070525030405-enq4r60hhi9xrujc-1
bzrlib/tests/test_http.py testhttp.py-20051018020158-b2eef6e867c514d9
bzrlib/tests/test_knit.py test_knit.py-20051212171302-95d4c00dd5f11f2b
bzrlib/tests/test_log.py testlog.py-20050728115707-1a514809d7d49309
bzrlib/tests/test_mail_client.py test_mail_client.py-20070809192806-vuxt3t19srtpjpdn-2
bzrlib/tests/test_merge.py testmerge.py-20050905070950-c1b5aa49ff911024
bzrlib/tests/test_reconfigure.py test_reconfigure.py-20070908040425-6ykgo7escxhyrg9p-2
bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
bzrlib/tests/test_revision.py testrevision.py-20050804210559-46f5e1eb67b01289
bzrlib/tests/test_switch.py test_switch.py-20071116011000-v5lnw7d2wkng9eux-2
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/tests/test_versionedfile.py test_versionedfile.py-20060222045249-db45c9ed14a1c2e5
bzrlib/tests/tree_implementations/test_inv.py test_inv.py-20070312023226-0cdvk5uwhutis9vg-1
bzrlib/tests/workingtree_implementations/test_remove.py test_remove.py-20070413183901-rvnp85rtc0q0sclp-1
bzrlib/tests/workingtree_implementations/test_workingtree.py test_workingtree.py-20060203003124-817757d3e31444fb
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
bzrlib/transport/http/__init__.py http_transport.py-20050711212304-506c5fd1059ace96
bzrlib/transport/http/_pycurl.py pycurlhttp.py-20060110060940-4e2a705911af77a6
bzrlib/transport/http/_urllib.py _urlgrabber.py-20060113083826-0bbf7d992fbf090c
bzrlib/transport/http/_urllib2_wrappers.py _urllib2_wrappers.py-20060913231729-ha9ugi48ktx481ao-1
bzrlib/transport/http/response.py _response.py-20060613154423-a2ci7hd4iw5c7fnt-1
bzrlib/transport/ssh.py ssh.py-20060824042150-0s9787kng6zv1nwq-1
bzrlib/tree.py tree.py-20050309040759-9d5f2496be663e77
bzrlib/versionedfile.py versionedfile.py-20060222045106-5039c71ee3b65490
bzrlib/workingtree.py workingtree.py-20050511021032-29b6ec0a681e02e3
bzrlib/workingtree_4.py workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
doc/developers/performance-contributing.txt performancecontribut-20070621063612-ac4zhhagjzkr21qp-1
doc/en/mini-tutorial/index.txt index.txt-20070813141352-2u64ooqzo0or4hss-2
doc/en/user-guide/authentication_conf.txt authentication_conf.-20071104135035-glfv0ri355tyg1nf-1
doc/en/user-guide/bug_trackers.txt bug_trackers.txt-20070713223459-khxdlcudraii95uv-1
doc/en/user-guide/configuration.txt configuration.txt-20060314161707-868350809502af01
doc/en/user-guide/conflicts.txt conflicts.txt-20070723221841-ns3jvwxdb4okn6fk-1
doc/en/user-guide/hooks.txt hooks.txt-20070829200551-7nr6e5a1io6x78uf-1
doc/en/user-guide/http_smart_server.txt fastcgi.txt-20061005091552-rz8pva0olkxv0sd8-3
doc/en/user-guide/index.txt index.txt-20060622101119-tgwtdci8z769bjb9-2
doc/en/user-guide/plugins.txt plugins.txt-20060314145616-525099a747f3ffdd
doc/en/user-guide/server.txt server.txt-20060913044801-h939fvbwzz39gf7g-1
doc/en/user-guide/setting_up_email.txt setting_up_email.txt-20060314161707-fd242c8944346173
doc/en/user-guide/shared_repository_layouts.txt shared_repository_la-20070502152030-bagewuqs18ns24o7-1
doc/en/user-guide/specifying_revisions.txt specifying_revisions.txt-20060314161707-19deb139101bea33
doc/en/user-guide/using_aliases.txt using_aliases.txt-20060314161707-c21d27fa2939e039
doc/en/user-guide/version_info.txt version_info.txt-20060921215543-gju6o5xdic8w25np-1
doc/index.txt index.txt-20070813101924-07gd9i9d2jt124bf-1
tools/win32/bzr.iss.cog bzr.iss.cog-20060622100836-b3yup582rt3y0nvm-5
doc/en/tutorials/tutorial.txt tutorial.txt-20050804190939-9dcbba2ef053bc84
------------------------------------------------------------
revno: 3035.3.2
revision-id:lalinsky at gmail.com-20071127192740-2dv4oe4fd9hfhbyc
parent: lalinsky at gmail.com-20071127184753-e2m2b5lnb00x7nx2
committer: Lukáš Lalinský <lalinsky at gmail.com>
branch nick: generic-bugtracker
timestamp: Tue 2007-11-27 20:27:40 +0100
message:
Add tests for InvalidBugTrackerURL.
modified:
bzrlib/bugtracker.py bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
bzrlib/tests/test_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
bzrlib/tests/test_errors.py test_errors.py-20060210110251-41aba2deddf936a8
------------------------------------------------------------
revno: 3035.3.1
revision-id:lalinsky at gmail.com-20071127184753-e2m2b5lnb00x7nx2
parent: pqm at pqm.ubuntu.com-20071127101459-zcdf4aia34927kt0
committer: Lukáš Lalinský <lalinsky at gmail.com>
branch nick: generic-bugtracker
timestamp: Tue 2007-11-27 19:47:53 +0100
message:
Generic bug tracker configuration.
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/bugtracker.py bugtracker.py-20070410073305-vu1vu1qosjurg8kb-1
bzrlib/errors.py errors.py-20050309040759-20512168c4e14fbd
bzrlib/tests/test_bugtracker.py test_bugtracker.py-20070410073305-vu1vu1qosjurg8kb-2
doc/en/user-guide/bug_trackers.txt bug_trackers.txt-20070713223459-khxdlcudraii95uv-1
=== modified file 'NEWS'
--- a/NEWS 2007-12-04 03:52:13 +0000
+++ b/NEWS 2007-12-04 18:11:51 +0000
@@ -12,6 +12,11 @@
* ``bzr commit`` now doesn't print the revision number twice. (Matt
Nordhoff, #172612)
+ * New configuration option ``bugtracker_<tracker_abbrevation>_url`` to
+ define locations of bug trackers that are not directly supported by
+ bzr or a plugin. The URL will be treated as a template and ``{id}``
+ placeholders will be replaced by specific bug IDs. (Lukáš Lalinský)
+
* Support logging single merge revisions with short and line log formatters.
(Kent Gibson)
=== modified file 'bzrlib/bugtracker.py'
--- a/bzrlib/bugtracker.py 2007-04-23 05:59:29 +0000
+++ b/bzrlib/bugtracker.py 2007-11-27 19:27:40 +0000
@@ -171,3 +171,24 @@
tracker_registry.register(
'bugzilla',
URLParametrizedIntegerBugTracker('bugzilla', 'show_bug.cgi?id='))
+
+
+class GenericBugTracker(URLParametrizedIntegerBugTracker):
+ """Generic bug tracker specified by an URL template."""
+
+ def __init__(self):
+ super(GenericBugTracker, self).__init__('bugtracker', None)
+
+ def get(self, abbreviation, branch):
+ self._abbreviation = abbreviation
+ return super(GenericBugTracker, self).get(abbreviation, branch)
+
+ def _get_bug_url(self, bug_id):
+ """Given a validated bug_id, return the bug's web page's URL."""
+ if '{id}' not in self._base_url:
+ raise errors.InvalidBugTrackerURL(self._abbreviation,
+ self._base_url)
+ return self._base_url.replace('{id}', str(bug_id))
+
+
+tracker_registry.register('generic', GenericBugTracker())
=== modified file 'bzrlib/errors.py'
--- a/bzrlib/errors.py 2007-11-30 07:45:56 +0000
+++ b/bzrlib/errors.py 2007-12-04 18:11:51 +0000
@@ -2299,6 +2299,16 @@
self.reason = reason
+class InvalidBugTrackerURL(BzrError):
+
+ _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
+ "contain {id}: %(url)s")
+
+ def __init__(self, abbreviation, url):
+ self.abbreviation = abbreviation
+ self.url = url
+
+
class UnknownBugTrackerAbbreviation(BzrError):
_fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
=== modified file 'bzrlib/tests/test_bugtracker.py'
--- a/bzrlib/tests/test_bugtracker.py 2007-04-23 05:59:29 +0000
+++ b/bzrlib/tests/test_bugtracker.py 2007-11-27 19:27:40 +0000
@@ -104,6 +104,21 @@
self.assertEqual('http://bugs.com/show_bug.cgi?id=1234',
tracker.get_bug_url('1234'))
+ def test_generic_registered(self):
+ branch = self.make_branch('some_branch')
+ config = branch.get_config()
+ config.set_user_option('bugtracker_foo_url', 'http://bugs.com/{id}/view.html')
+ tracker = bugtracker.tracker_registry.get_tracker('foo', branch)
+ self.assertEqual('http://bugs.com/1234/view.html',
+ tracker.get_bug_url('1234'))
+
+ def test_generic_incorrect_url(self):
+ branch = self.make_branch('some_branch')
+ config = branch.get_config()
+ config.set_user_option('bugtracker_foo_url', 'http://bugs.com/view.html')
+ tracker = bugtracker.tracker_registry.get_tracker('foo', branch)
+ self.assertRaises(errors.InvalidBugTrackerURL, tracker.get_bug_url, '1234')
+
class TestUniqueIntegerBugTracker(TestCaseWithMemoryTransport):
=== modified file 'bzrlib/tests/test_errors.py'
--- a/bzrlib/tests/test_errors.py 2007-11-29 22:24:49 +0000
+++ b/bzrlib/tests/test_errors.py 2007-12-04 18:11:51 +0000
@@ -409,6 +409,13 @@
"Unable to create symlink u'\\xb5' on this platform",
str(err))
+ def test_incorrect_url(self):
+ err = errors.InvalidBugTrackerURL('foo', 'http://bug.com/')
+ self.assertEquals(
+ ("The URL for bug tracker \"foo\" doesn't contain {id}: "
+ "http://bug.com/"),
+ str(err))
+
class PassThroughError(errors.BzrError):
=== modified file 'doc/en/user-guide/bug_trackers.txt'
--- a/doc/en/user-guide/bug_trackers.txt 2007-11-27 21:34:11 +0000
+++ b/doc/en/user-guide/bug_trackers.txt 2007-12-04 18:11:51 +0000
@@ -12,7 +12,7 @@
When you make a commit you can assiociate it with a bug by using the
``--fixes`` option of ``commit``. For example::
- $ bzr commit --fixes 12345 -m "Properly close the connection on errors"
+ $ bzr commit --fixes project:12345 -m "Properly close the connection"
This will set a revision property on the revision that is committed
which contains the URI at which more information on the bug can be found.
@@ -65,6 +65,23 @@
would allow ``bzr commit --fixes twisted:1234`` to mark Twisted's bug 1234 as
fixed.
+bugtracker_<tracker_abbrevation>_url
+------------------------------------
+If present, the location of a generic bug tracker instance referred to by
+<tracker_abbreviation>. The location must contain an ``{id}`` placeholder,
+which will be replaced by a specific bug ID. This option can then be used
+together with ``bzr commit --fixes`` to mark bugs in that tracker as being
+fixed by that commit. For example::
+
+ bugtracker_python_url = http://bugs.python.org/issue{id}
+
+would allow ``bzr commit --fixes python:1234`` to mark bug 1234 in Python's
+Roundup bug tracker as fixed, or::
+
+ bugtracker_cpan_url = http://rt.cpan.org/Public/Bug/Display.html?id={id}
+
+for CPAN's RT bug tracker.
+
Limitations of the system
-------------------------
More information about the bazaar-commits
mailing list