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