Rev 3514: Implement aliases for remembered locations (abentley) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Mon Jun 30 06:55:44 BST 2008
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 3514
revision-id:pqm at pqm.ubuntu.com-20080630055535-42tx43kb228k4p94
parent: pqm at pqm.ubuntu.com-20080627225315-j2xpbsvjyya1s97y
parent: aaron at aaronbentley.com-20080630052747-p93i1jak2l2vg48x
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2008-06-30 06:55:35 +0100
message:
Implement aliases for remembered locations (abentley)
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
bzrlib/directory_service.py directory_service.py-20080305221044-vr2mkvlsk8jypa2y-1
bzrlib/errors.py errors.py-20050309040759-20512168c4e14fbd
bzrlib/tests/test_directory_service.py test_directory_servi-20080305221044-vr2mkvlsk8jypa2y-2
------------------------------------------------------------
revno: 3512.2.4
revision-id:aaron at aaronbentley.com-20080630052747-p93i1jak2l2vg48x
parent: aaron at aaronbentley.com-20080626060649-ntrr0jfchizpbkfm
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: alias.lookup
timestamp: Mon 2008-06-30 01:27:47 -0400
message:
Fix spacing
modified:
bzrlib/directory_service.py directory_service.py-20080305221044-vr2mkvlsk8jypa2y-1
------------------------------------------------------------
revno: 3512.2.3
revision-id:aaron at aaronbentley.com-20080626060649-ntrr0jfchizpbkfm
parent: aaron at aaronbentley.com-20080626060336-jawagd0ir0l6gurr
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: alias.lookup
timestamp: Thu 2008-06-26 02:06:49 -0400
message:
Update NEWS
modified:
NEWS NEWS-20050323055033-4e00b5db738777ff
------------------------------------------------------------
revno: 3512.2.2
revision-id:aaron at aaronbentley.com-20080626060336-jawagd0ir0l6gurr
parent: aaron at aaronbentley.com-20080626051031-ylyzlwa3t41dd3it
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: alias.lookup
timestamp: Thu 2008-06-26 02:03:36 -0400
message:
Add :push and :this
modified:
bzrlib/directory_service.py directory_service.py-20080305221044-vr2mkvlsk8jypa2y-1
bzrlib/tests/test_directory_service.py test_directory_servi-20080305221044-vr2mkvlsk8jypa2y-2
------------------------------------------------------------
revno: 3512.2.1
revision-id:aaron at aaronbentley.com-20080626051031-ylyzlwa3t41dd3it
parent: pqm at pqm.ubuntu.com-20080626004245-dnw85so4xqg8r9hy
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: alias.lookup
timestamp: Thu 2008-06-26 01:10:31 -0400
message:
Add support for branch-associated locations
modified:
bzrlib/directory_service.py directory_service.py-20080305221044-vr2mkvlsk8jypa2y-1
bzrlib/errors.py errors.py-20050309040759-20512168c4e14fbd
bzrlib/tests/test_directory_service.py test_directory_servi-20080305221044-vr2mkvlsk8jypa2y-2
=== modified file 'NEWS'
--- a/NEWS 2008-06-26 00:17:06 +0000
+++ b/NEWS 2008-06-26 06:06:49 +0000
@@ -14,6 +14,9 @@
to stdout; also ``tar`` and ``tbz2``.
(Martin Pool)
+ * Remembered locations can be specified by aliases, e.g. :parent, :public,
+ :submit. (Aaron Bentley)
+
* The smart protocol now has improved support for setting branches'
revision info directly. This makes operations like push
faster. The new request method name is
=== modified file 'bzrlib/directory_service.py'
--- a/bzrlib/directory_service.py 2008-03-07 13:49:07 +0000
+++ b/bzrlib/directory_service.py 2008-06-30 05:27:47 +0000
@@ -20,7 +20,8 @@
to true URLs. Examples include lp:urls and per-user location aliases.
"""
-from bzrlib import registry
+from bzrlib import errors, registry
+from bzrlib.branch import Branch
class DirectoryServiceRegistry(registry.Registry):
"""This object maintains and uses a list of directory services.
@@ -52,3 +53,34 @@
return service().look_up(name, url)
directories = DirectoryServiceRegistry()
+
+
+class AliasDirectory(object):
+ """Directory lookup for locations associated with a branch.
+
+ :parent, :submit, :public, :push, :this, and :bound are currently
+ supported. On error, a subclass of DirectoryLookupFailure will be raised.
+ """
+
+ def look_up(self, name, url):
+ branch = Branch.open_containing('.')[0]
+ lookups = {
+ 'parent': branch.get_parent,
+ 'submit': branch.get_submit_branch,
+ 'public': branch.get_public_branch,
+ 'bound': branch.get_bound_location,
+ 'push': branch.get_push_location,
+ 'this': lambda: branch.base
+ }
+ try:
+ method = lookups[url[1:]]
+ except KeyError:
+ raise errors.InvalidLocationAlias(url)
+ else:
+ result = method()
+ if result is None:
+ raise errors.UnsetLocationAlias(url)
+ return result
+
+directories.register(':', AliasDirectory,
+ 'Easy access to remembered branch locations')
=== modified file 'bzrlib/errors.py'
--- a/bzrlib/errors.py 2008-05-30 10:57:24 +0000
+++ b/bzrlib/errors.py 2008-06-26 05:10:31 +0000
@@ -2731,6 +2731,28 @@
BzrError.__init__(self, alias_name=alias_name)
+class DirectoryLookupFailure(BzrError):
+ """Base type for lookup errors."""
+
+ pass
+
+
+class InvalidLocationAlias(DirectoryLookupFailure):
+
+ _fmt = '"%(alias_name)s" is not a valid location alias.'
+
+ def __init__(self, alias_name):
+ DirectoryLookupFailure.__init__(self, alias_name=alias_name)
+
+
+class UnsetLocationAlias(DirectoryLookupFailure):
+
+ _fmt = 'No %(alias_name)s location assigned.'
+
+ def __init__(self, alias_name):
+ DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
+
+
class CannotBindAddress(BzrError):
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
=== modified file 'bzrlib/tests/test_directory_service.py'
--- a/bzrlib/tests/test_directory_service.py 2008-03-06 14:12:45 +0000
+++ b/bzrlib/tests/test_directory_service.py 2008-06-26 06:03:36 +0000
@@ -16,8 +16,9 @@
"""Test directory service implementation"""
+from bzrlib import errors
from bzrlib.directory_service import DirectoryServiceRegistry, directories
-from bzrlib.tests import TestCase
+from bzrlib.tests import TestCase, TestCaseWithTransport
from bzrlib.transport import get_transport
@@ -49,3 +50,48 @@
directories.register('foo:', FooService, 'Map foo URLs to http urls')
self.addCleanup(lambda: directories.remove('foo:'))
self.assertEqual('file:///foobar/', get_transport('foo:bar').base)
+
+
+class TestAliasDirectory(TestCaseWithTransport):
+
+ def test_lookup_parent(self):
+ branch = self.make_branch('.')
+ branch.set_parent('http://a')
+ self.assertEqual('http://a', directories.dereference(':parent'))
+
+ def test_lookup_submit(self):
+ branch = self.make_branch('.')
+ branch.set_submit_branch('http://b')
+ self.assertEqual('http://b', directories.dereference(':submit'))
+
+ def test_lookup_public(self):
+ branch = self.make_branch('.')
+ branch.set_public_branch('http://c')
+ self.assertEqual('http://c', directories.dereference(':public'))
+
+ def test_lookup_bound(self):
+ branch = self.make_branch('.')
+ branch.set_bound_location('http://d')
+ self.assertEqual('http://d', directories.dereference(':bound'))
+
+ def test_lookup_push(self):
+ branch = self.make_branch('.')
+ branch.set_push_location('http://e')
+ self.assertEqual('http://e', directories.dereference(':push'))
+
+ def test_lookup_this(self):
+ branch = self.make_branch('.')
+ self.assertEqual(branch.base, directories.dereference(':this'))
+
+ def test_lookup_badname(self):
+ branch = self.make_branch('.')
+ e = self.assertRaises(errors.InvalidLocationAlias,
+ directories.dereference, ':booga')
+ self.assertEqual('":booga" is not a valid location alias.',
+ str(e))
+
+ def test_lookup_badvalue(self):
+ branch = self.make_branch('.')
+ e = self.assertRaises(errors.UnsetLocationAlias,
+ directories.dereference, ':parent')
+ self.assertEqual('No parent location assigned.', str(e))
More information about the bazaar-commits
mailing list