Rev 4419: Clean up 'bzr revision-info' to support revision not in the branch history. in http://bazaar.launchpad.net/~jameinel/bzr/tree_opt

John Arbash Meinel john at arbash-meinel.com
Fri Jun 5 14:38:15 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr/tree_opt

------------------------------------------------------------
revno: 4419
revision-id: john at arbash-meinel.com-20090605133754-ngayy8f8eyop1nn7
parent: john at arbash-meinel.com-20090605132617-7kx1smlz82ktg5ej
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: tree_opt
timestamp: Fri 2009-06-05 08:37:54 -0500
message:
  Clean up 'bzr revision-info' to support revision not in the branch history.
-------------- next part --------------
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2009-06-05 13:26:17 +0000
+++ b/bzrlib/builtins.py	2009-06-05 13:37:54 +0000
@@ -514,31 +514,41 @@
     def run(self, revision=None, directory=u'.', tree=False,
             revision_info_list=[]):
 
-        revs = []
-        if revision is not None:
-            revs.extend(revision)
-        if revision_info_list is not None:
-            for rev in revision_info_list:
-                revs.append(RevisionSpec.from_string(rev))
-
-        b = Branch.open_containing(directory)[0]
-
-        if len(revs) == 0:
-            if tree:
-                wt = WorkingTree.open_containing(directory)[0]
-                revs.append(RevisionSpec.from_string('revid:' + \
-                    wt._last_revision()))
+        try:
+            wt = WorkingTree.open_containing(directory)[0]
+            b = wt.branch
+            wt.lock_read()
+        except (errors.NoWorkingTree, errors.NotLocalUrl):
+            wt = None
+            b = Branch.open_containing(directory)[0]
+            b.lock_read()
+        try:
+            revision_ids = []
+            if revision is not None:
+                revision_ids.extend(rev.as_revision_id(b) for rev in revision)
+            if revision_info_list is not None:
+                for rev_str in revision_info_list:
+                    rev_spec = RevisionSpec.from_string(rev_str)
+                    revision_ids.append(rev_spec.as_revision_id(b))
+            # No arguments supplied, default to the last revision
+            if len(revision_ids) == 0:
+                if tree:
+                    revision_ids.append(wt.last_revision())
+                else:
+                    revision_ids.append(b.last_revision())
+
+            for revision_id in revision_ids:
+                try:
+                    dotted_revno = b.revision_id_to_dotted_revno(revision_id)
+                    revno = '.'.join(str(i) for i in dotted_revno)
+                except errors.NoSuchRevision:
+                    revno = '???'
+                print '%4s %s' % (revno, revision_id)
+        finally:
+            if wt is None:
+                b.unlock()
             else:
-                revs.append(RevisionSpec.from_string('-1'))
-
-        for rev in revs:
-            revision_id = rev.as_revision_id(b)
-            try:
-                revno = '%4d' % (b.revision_id_to_revno(revision_id))
-            except errors.NoSuchRevision:
-                dotted_map = b.get_revision_id_to_revno_map()
-                revno = '.'.join(str(i) for i in dotted_map[revision_id])
-            print '%s %s' % (revno, revision_id)
+                wt.unlock()
 
 
 class cmd_add(Command):

=== modified file 'bzrlib/tests/blackbox/test_revision_info.py'
--- a/bzrlib/tests/blackbox/test_revision_info.py	2009-06-05 13:20:35 +0000
+++ b/bzrlib/tests/blackbox/test_revision_info.py	2009-06-05 13:37:54 +0000
@@ -100,3 +100,15 @@
         # tree
         self.check_output('   2 a at r-0-2\n', 'revision-info -d checkout')
         self.check_output('   1 a at r-0-1\n', 'revision-info --tree -d checkout')
+
+    def test_revision_info_not_in_history(self):
+        builder = self.make_branch_builder('branch')
+        builder.start_series()
+        builder.build_snapshot('A-id', None, [
+            ('add', ('', 'root-id', 'directory', None))])
+        builder.build_snapshot('B-id', ['A-id'], [])
+        builder.build_snapshot('C-id', ['A-id'], [])
+        builder.finish_series()
+        self.check_output('   1 A-id\n ??? B-id\n   2 C-id\n',
+                          'revision-info -d branch'
+                          ' revid:A-id revid:B-id revid:C-id')



More information about the bazaar-commits mailing list