Rev 6418: (jelmer) Fix -r argument for 'bzr version-info' to actually use specified in file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

Patch Queue Manager pqm at pqm.ubuntu.com
Tue Jan 3 14:12:06 UTC 2012


At file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 6418 [merge]
revision-id: pqm at pqm.ubuntu.com-20120103141205-ietjvfpwrl368osv
parent: pqm at pqm.ubuntu.com-20120103134701-89oywjghb5zo0k2k
parent: jelmer at samba.org-20120103130844-2vccdsj9k4c69p99
committer: Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Tue 2012-01-03 14:12:05 +0000
message:
  (jelmer) Fix -r argument for 'bzr version-info' to actually use specified
   tree everywhere. (Jelmer Vernooij)
modified:
  bzrlib/cmd_version_info.py     __init__.py-20051228204928-697d01fdca29c99b
  bzrlib/tests/blackbox/test_version_info.py test_bb_version_info.py-20051228204928-91711c6559d952f7
  bzrlib/tests/test_version_info.py test_version_info.py-20051228204928-2c364e30b702b41b
  bzrlib/version_info_formats/__init__.py generate_version_info.py-20051228204928-8358edabcddcd97e
=== modified file 'bzrlib/cmd_version_info.py'
--- a/bzrlib/cmd_version_info.py	2011-12-19 13:23:58 +0000
+++ b/bzrlib/cmd_version_info.py	2011-12-30 12:52:54 +0000
@@ -107,11 +107,11 @@
         if format is None:
             format = version_info_formats.format_registry.get()
 
-        wt = None
         try:
             wt = workingtree.WorkingTree.open_containing(location)[0]
         except errors.NoWorkingTree:
             b = branch.Branch.open(location)
+            wt = None
         else:
             b = wt.branch
 

=== modified file 'bzrlib/tests/blackbox/test_version_info.py'
--- a/bzrlib/tests/blackbox/test_version_info.py	2011-10-31 15:49:35 +0000
+++ b/bzrlib/tests/blackbox/test_version_info.py	2011-12-30 13:02:27 +0000
@@ -18,10 +18,10 @@
 
 import os
 
-from bzrlib.revision import NULL_REVISION
 from bzrlib.tests import TestCaseWithTransport
 from bzrlib.version_info_formats import VersionInfoBuilder
 
+
 class TestVersionInfo(TestCaseWithTransport):
 
     def test_invalid_format(self):
@@ -163,16 +163,16 @@
 
     def test_non_ascii(self):
         """Test that we can output non-ascii data"""
-        
+
         commit_message = u'Non-ascii message with character not in latin-1: \u1234'
-        
+
         tree = self.make_branch_and_tree('.')
         self.build_tree(['a_file'])
         tree.add('a_file')
         tree.commit(commit_message)
         out, err = self.run_bzr(
             ['version-info', '--include-history'], encoding='latin-1')
-        
+
         self.assertContainsString(out, commit_message.encode('utf-8'))
 
     def test_revision(self):

=== modified file 'bzrlib/tests/test_version_info.py'
--- a/bzrlib/tests/test_version_info.py	2011-06-14 17:01:15 +0000
+++ b/bzrlib/tests/test_version_info.py	2012-01-03 13:08:44 +0000
@@ -35,7 +35,7 @@
 from bzrlib.version_info_formats.format_python import PythonVersionInfoBuilder
 
 
-class TestVersionInfo(TestCaseWithTransport):
+class VersionInfoTestCase(TestCaseWithTransport):
 
     def create_branch(self):
         wt = self.make_branch_and_tree('branch')
@@ -72,6 +72,9 @@
 
         return wt
 
+
+class TestVersionInfoRio(VersionInfoTestCase):
+
     def test_rio_null(self):
         wt = self.make_branch_and_tree('branch')
 
@@ -91,32 +94,37 @@
         val = sio.getvalue()
         self.assertContainsRe(val, 'revno: 1.1.1')
 
-    def test_rio_version_text(self):
+    def regen_text(self, wt, **kwargs):
+        sio = StringIO()
+        builder = RioVersionInfoBuilder(wt.branch, working_tree=wt, **kwargs)
+        builder.generate(sio)
+        val = sio.getvalue()
+        return val
+
+    def test_simple(self):
         wt = self.create_branch()
 
-        def regen(**kwargs):
-            sio = StringIO()
-            builder = RioVersionInfoBuilder(wt.branch, working_tree=wt,
-                                            **kwargs)
-            builder.generate(sio)
-            val = sio.getvalue()
-            return val
-
-        val = regen()
+        val = self.regen_text(wt)
         self.assertContainsRe(val, 'build-date:')
         self.assertContainsRe(val, 'date:')
         self.assertContainsRe(val, 'revno: 3')
         self.assertContainsRe(val, 'revision-id: r3')
 
-        val = regen(check_for_clean=True)
+    def test_clean(self):
+        wt = self.create_branch()
+        val = self.regen_text(wt, check_for_clean=True)
         self.assertContainsRe(val, 'clean: True')
 
+    def test_no_clean(self):
+        wt = self.create_branch()
         self.build_tree(['branch/c'])
-        val = regen(check_for_clean=True)
+        val = self.regen_text(wt, check_for_clean=True)
         self.assertContainsRe(val, 'clean: False')
-        os.remove('branch/c')
-
-        val = regen(include_revision_history=True)
+
+    def test_history(self):
+        wt = self.create_branch()
+
+        val = self.regen_text(wt, include_revision_history=True)
         self.assertContainsRe(val, 'id: r1')
         self.assertContainsRe(val, 'message: a')
         self.assertContainsRe(val, 'id: r2')
@@ -124,6 +132,15 @@
         self.assertContainsRe(val, 'id: r3')
         self.assertContainsRe(val, 'message: \xc3\xa52') # utf8 encoding '\xe5'
 
+    def regen(self, wt, **kwargs):
+        sio = StringIO()
+        builder = RioVersionInfoBuilder(wt.branch, working_tree=wt, **kwargs)
+        builder.generate(sio)
+        sio.seek(0)
+        stanzas = list(read_stanzas(sio))
+        self.assertEqual(1, len(stanzas))
+        return stanzas[0]
+
     def test_rio_version_hook(self):
         def update_stanza(rev, stanza):
             stanza.add('bla', 'bloe')
@@ -131,86 +148,93 @@
             'revision', update_stanza, None)
         wt = self.create_branch()
 
-        def regen(**kwargs):
-            sio = StringIO()
-            builder = RioVersionInfoBuilder(wt.branch, working_tree=wt,
-                                            **kwargs)
-            builder.generate(sio)
-            sio.seek(0)
-            stanzas = list(read_stanzas(sio))
-            self.assertEqual(1, len(stanzas))
-            return stanzas[0]
-
-        stanza = regen()
+        stanza = self.regen(wt)
         self.assertEqual(['bloe'], stanza.get_all('bla'))
 
-    def test_rio_version(self):
+    def get_one_stanza(self, stanza, key):
+        new_stanzas = list(read_stanzas(StringIO(stanza[key].encode('utf8'))))
+        self.assertEqual(1, len(new_stanzas))
+        return new_stanzas[0]
+
+    def test_build_date(self):
         wt = self.create_branch()
-
-        def regen(**kwargs):
-            sio = StringIO()
-            builder = RioVersionInfoBuilder(wt.branch, working_tree=wt,
-                                            **kwargs)
-            builder.generate(sio)
-            sio.seek(0)
-            stanzas = list(read_stanzas(sio))
-            self.assertEqual(1, len(stanzas))
-            return stanzas[0]
-
-        def get_one_stanza(stanza, key):
-            new_stanzas = list(read_stanzas(
-                                StringIO(stanza[key].encode('utf8'))))
-            self.assertEqual(1, len(new_stanzas))
-            return new_stanzas[0]
-
-        stanza = regen()
+        stanza = self.regen(wt)
         self.assertTrue('date' in stanza)
         self.assertTrue('build-date' in stanza)
         self.assertEqual(['3'], stanza.get_all('revno'))
         self.assertEqual(['r3'], stanza.get_all('revision-id'))
 
-        stanza = regen(check_for_clean=True)
-        self.assertEqual(['True'], stanza.get_all('clean'))
-
+    def test_not_clean(self):
+        wt = self.create_branch()
         self.build_tree(['branch/c'])
-        stanza = regen(check_for_clean=True, include_file_revisions=True)
+        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
         self.assertEqual(['False'], stanza.get_all('clean'))
 
+    def test_file_revisions(self):
+        wt = self.create_branch()
+        self.build_tree(['branch/c'])
+        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
         # This assumes it's being run against a tree that does not update the
         # root revision on every commit.
-        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
+        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
         self.assertEqual(['', 'a', 'b', 'c'], file_rev_stanza.get_all('path'))
         self.assertEqual(['r1', 'r3', 'r2', 'unversioned'],
             file_rev_stanza.get_all('revision'))
-        os.remove('branch/c')
 
-        stanza = regen(include_revision_history=True)
-        revision_stanza = get_one_stanza(stanza, 'revisions')
+    def test_revision_history(self):
+        wt = self.create_branch()
+        stanza = self.regen(wt, include_revision_history=True)
+        revision_stanza = self.get_one_stanza(stanza, 'revisions')
         self.assertEqual(['r1', 'r2', 'r3'], revision_stanza.get_all('id'))
         self.assertEqual(['a', 'b', u'\xe52'], revision_stanza.get_all('message'))
         self.assertEqual(3, len(revision_stanza.get_all('date')))
 
+    def test_file_revisions_with_rename(self):
         # a was modified, so it should show up modified again
+        wt = self.create_branch()
         self.build_tree(['branch/a', 'branch/c'])
         wt.add('c')
         wt.rename_one('b', 'd')
-        stanza = regen(check_for_clean=True, include_file_revisions=True)
-        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
+        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
+        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
         self.assertEqual(['', 'a', 'b', 'c', 'd'],
                           file_rev_stanza.get_all('path'))
         self.assertEqual(['r1', 'modified', 'renamed to d', 'new',
                           'renamed from b'],
                          file_rev_stanza.get_all('revision'))
 
+    def test_file_revisions_with_removal(self):
+        wt = self.create_branch()
+        self.build_tree(['branch/a', 'branch/c'])
+        wt.add('c')
+        wt.rename_one('b', 'd')
+
         wt.commit('modified', rev_id='r4')
+
         wt.remove(['c', 'd'])
         os.remove('branch/d')
-        stanza = regen(check_for_clean=True, include_file_revisions=True)
-        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
+        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
+        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
         self.assertEqual(['', 'a', 'c', 'd'], file_rev_stanza.get_all('path'))
         self.assertEqual(['r1', 'r4', 'unversioned', 'removed'],
                          file_rev_stanza.get_all('revision'))
 
+    def test_revision(self):
+        wt = self.create_branch()
+        self.build_tree(['branch/a', 'branch/c'])
+        wt.add('c')
+        wt.rename_one('b', 'd')
+
+        stanza = self.regen(wt, check_for_clean=True,
+            include_file_revisions=True, revision_id=wt.last_revision())
+        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
+        self.assertEqual(['', 'a', 'b'], file_rev_stanza.get_all('path'))
+        self.assertEqual(['r1', 'r3', 'r2'],
+                         file_rev_stanza.get_all('revision'))
+
+
+class PythonVersionInfoTests(VersionInfoTestCase):
+
     def test_python_null(self):
         wt = self.make_branch_and_tree('branch')
 
@@ -231,45 +255,45 @@
         val = sio.getvalue()
         self.assertContainsRe(val, "'revno': '1.1.1'")
 
+    def regen(self, wt, **kwargs):
+        """Create a test module, import and return it"""
+        outf = open('test_version_information.py', 'wb')
+        try:
+            builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt,
+                                               **kwargs)
+            builder.generate(outf)
+        finally:
+            outf.close()
+        module_info = imp.find_module('test_version_information',
+                                      [os.getcwdu()])
+        tvi = imp.load_module('tvi', *module_info)
+        # Make sure the module isn't cached
+        sys.modules.pop('tvi', None)
+        sys.modules.pop('test_version_information', None)
+        # Delete the compiled versions, because we are generating
+        # a new file fast enough that python doesn't detect it
+        # needs to recompile, and using sleep() just makes the
+        # test slow
+        if os.path.exists('test_version_information.pyc'):
+            os.remove('test_version_information.pyc')
+        if os.path.exists('test_version_information.pyo'):
+            os.remove('test_version_information.pyo')
+        return tvi
+
     def test_python_version(self):
         wt = self.create_branch()
 
-        def regen(**kwargs):
-            """Create a test module, import and return it"""
-            outf = open('test_version_information.py', 'wb')
-            try:
-                builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt,
-                                                   **kwargs)
-                builder.generate(outf)
-            finally:
-                outf.close()
-            module_info = imp.find_module('test_version_information',
-                                          [os.getcwdu()])
-            tvi = imp.load_module('tvi', *module_info)
-            # Make sure the module isn't cached
-            sys.modules.pop('tvi', None)
-            sys.modules.pop('test_version_information', None)
-            # Delete the compiled versions, because we are generating
-            # a new file fast enough that python doesn't detect it
-            # needs to recompile, and using sleep() just makes the
-            # test slow
-            if os.path.exists('test_version_information.pyc'):
-                os.remove('test_version_information.pyc')
-            if os.path.exists('test_version_information.pyo'):
-                os.remove('test_version_information.pyo')
-            return tvi
-
-        tvi = regen()
+        tvi = self.regen(wt)
         self.assertEqual('3', tvi.version_info['revno'])
         self.assertEqual('r3', tvi.version_info['revision_id'])
         self.assertTrue(tvi.version_info.has_key('date'))
         self.assertEqual(None, tvi.version_info['clean'])
 
-        tvi = regen(check_for_clean=True)
+        tvi = self.regen(wt, check_for_clean=True)
         self.assertEqual(True, tvi.version_info['clean'])
 
         self.build_tree(['branch/c'])
-        tvi = regen(check_for_clean=True, include_file_revisions=True)
+        tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
         self.assertEqual(False, tvi.version_info['clean'])
         self.assertEqual(['', 'a', 'b', 'c'],
                          sorted(tvi.file_revisions.keys()))
@@ -278,7 +302,7 @@
         self.assertEqual('unversioned', tvi.file_revisions['c'])
         os.remove('branch/c')
 
-        tvi = regen(include_revision_history=True)
+        tvi = self.regen(wt, include_revision_history=True)
 
         rev_info = [(rev, message) for rev, message, timestamp, timezone
                                    in tvi.revisions]
@@ -288,7 +312,7 @@
         self.build_tree(['branch/a', 'branch/c'])
         wt.add('c')
         wt.rename_one('b', 'd')
-        tvi = regen(check_for_clean=True, include_file_revisions=True)
+        tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
         self.assertEqual(['', 'a', 'b', 'c', 'd'],
                           sorted(tvi.file_revisions.keys()))
         self.assertEqual('modified', tvi.file_revisions['a'])
@@ -299,13 +323,16 @@
         wt.commit('modified', rev_id='r4')
         wt.remove(['c', 'd'])
         os.remove('branch/d')
-        tvi = regen(check_for_clean=True, include_file_revisions=True)
+        tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
         self.assertEqual(['', 'a', 'c', 'd'],
                           sorted(tvi.file_revisions.keys()))
         self.assertEqual('r4', tvi.file_revisions['a'])
         self.assertEqual('unversioned', tvi.file_revisions['c'])
         self.assertEqual('removed', tvi.file_revisions['d'])
 
+
+class CustomVersionInfoTests(VersionInfoTestCase):
+
     def test_custom_null(self):
         sio = StringIO()
         wt = self.make_branch_and_tree('branch')
@@ -328,32 +355,41 @@
         builder.generate(sio)
         self.assertEquals("1.1.1 revid: o2", sio.getvalue())
 
-    def test_custom_version_text(self):
+    def regen(self, wt, tpl, **kwargs):
+        sio = StringIO()
+        builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
+                                           template=tpl, **kwargs)
+        builder.generate(sio)
+        val = sio.getvalue()
+        return val
+
+    def test_build_date(self):
         wt = self.create_branch()
 
-        def regen(tpl, **kwargs):
-            sio = StringIO()
-            builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
-                                               template=tpl, **kwargs)
-            builder.generate(sio)
-            val = sio.getvalue()
-            return val
-
-        val = regen('build-date: "{build_date}"\ndate: "{date}"')
+        val = self.regen(wt, 'build-date: "{build_date}"\ndate: "{date}"')
         self.assertContainsRe(val, 'build-date: "[0-9-+: ]+"')
         self.assertContainsRe(val, 'date: "[0-9-+: ]+"')
 
-        val = regen('revno: {revno}')
+    def test_revno(self):
+        wt = self.create_branch()
+        val = self.regen(wt, 'revno: {revno}')
         self.assertEqual(val, 'revno: 3')
 
-        val = regen('revision-id: {revision_id}')
+    def test_revision_id(self):
+        wt = self.create_branch()
+        val = self.regen(wt, 'revision-id: {revision_id}')
         self.assertEqual(val, 'revision-id: r3')
 
-        val = regen('clean: {clean}', check_for_clean=True)
+    def test_clean(self):
+        wt = self.create_branch()
+        val = self.regen(wt, 'clean: {clean}', check_for_clean=True)
         self.assertEqual(val, 'clean: 1')
 
+    def test_not_clean(self):
+        wt = self.create_branch()
+
         self.build_tree(['branch/c'])
-        val = regen('clean: {clean}', check_for_clean=True)
+        val = self.regen(wt, 'clean: {clean}', check_for_clean=True)
         self.assertEqual(val, 'clean: 0')
         os.remove('branch/c')
 

=== modified file 'bzrlib/version_info_formats/__init__.py'
--- a/bzrlib/version_info_formats/__init__.py	2011-12-19 13:23:58 +0000
+++ b/bzrlib/version_info_formats/__init__.py	2011-12-30 13:02:27 +0000
@@ -70,7 +70,6 @@
         :param revision_id: Revision id to print version for (optional)
         """
         self._branch = branch
-        self._working_tree = working_tree
         self._check = check_for_clean
         self._include_history = include_revision_history
         self._include_file_revs = include_file_revisions
@@ -80,19 +79,27 @@
         self._file_revisions = {}
         self._revision_id = revision_id
 
+        if self._revision_id is None:
+            self._tree = working_tree
+            self._working_tree = working_tree
+        else:
+            self._tree = self._branch.repository.revision_tree(self._revision_id)
+            # the working tree is not relevant if an explicit revision was specified
+            self._working_tree = None
+
     def _extract_file_revisions(self):
         """Extract the working revisions for all files"""
 
         # Things seem clean if we never look :)
         self._clean = True
 
-        if self._working_tree is not None:
+        if self._working_tree is self._tree:
             basis_tree = self._working_tree.basis_tree()
             # TODO: jam 20070215 The working tree should actually be locked at
             #       a higher level, but this will do for now.
             self._working_tree.lock_read()
         else:
-            basis_tree = self._branch.basis_tree()
+            basis_tree = self._branch.repository.revision_tree(self._revision_id)
 
         basis_tree.lock_read()
         try:
@@ -100,7 +107,7 @@
             for info in basis_tree.list_files(include_root=True):
                 self._file_revisions[info[0]] = info[-1].revision
 
-            if not self._check or self._working_tree is None:
+            if not self._check or self._working_tree is not self._tree:
                 return
 
             delta = self._working_tree.changes_from(basis_tree,
@@ -140,11 +147,7 @@
     def _iter_revision_history(self):
         """Find the messages for all revisions in history."""
 
-        # Unfortunately, there is no WorkingTree.revision_history
-        if self._working_tree is not None:
-            last_rev = self._working_tree.last_revision()
-        else:
-            last_rev = self._branch.last_revision()
+        last_rev = self._get_revision_id()
 
         repository =  self._branch.repository
         repository.lock_read()




More information about the bazaar-commits mailing list