Rev 5803: (jelmer) Add RevisionTree.get_file_revision, in file:///home/pqm/archives/thelove/bzr/%2Btrunk/

Canonical.com Patch Queue Manager pqm at pqm.ubuntu.com
Tue Apr 19 12:55:06 UTC 2011


At file:///home/pqm/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 5803 [merge]
revision-id: pqm at pqm.ubuntu.com-20110419125446-s16r0ck8t1ig6u7n
parent: pqm at pqm.ubuntu.com-20110419043748-qq4lsmc50cckqzp7
parent: jelmer at samba.org-20110419105905-2c4x0senrlyon6vj
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Tue 2011-04-19 12:54:46 +0000
message:
  (jelmer) Add RevisionTree.get_file_revision,
   replacing an existing static method on Tree. 
   This should also make it unnecessary to access the inventory in a couple
   more cases. (Jelmer Vernooij)
modified:
  bzrlib/builtins.py             builtins.py-20050830033751-fc01482b9ca23183
  bzrlib/bundle/bundle_data.py   read_changeset.py-20050619171944-c0d95aa685537640
  bzrlib/fetch.py                fetch.py-20050818234941-26fea6105696365d
  bzrlib/merge.py                merge.py-20050513021216-953b65a438527106
  bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
  bzrlib/revisiontree.py         revisiontree.py-20060724012533-bg8xyryhxd0o0i0h-1
  bzrlib/tests/per_repository/test_commit_builder.py test_commit_builder.py-20060606110838-76e3ra5slucqus81-1
  bzrlib/tests/test_branchbuilder.py test_branchbuilder.p-20070427022007-zlxpqz2lannhk6y8-2
  bzrlib/tests/test_bundle.py    test.py-20050630184834-092aa401ab9f039c
  bzrlib/tests/test_commit_merge.py test_commit_merge.py-20050920084723-819eeeff77907bc5
  bzrlib/tests/test_revisiontree.py test_revisiontree.py-20060615095324-aij44ndxbv1h4c9f-1
  bzrlib/tests/test_subsume.py   test_subsume.py-20060927040024-tsvh4pchajoayymg-1
  bzrlib/transform.py            transform.py-20060105172343-dd99e54394d91687
  bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
  bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
  doc/en/release-notes/bzr-2.4.txt bzr2.4.txt-20110114053217-k7ym9jfz243fddjm-1
=== modified file 'bzrlib/builtins.py'
--- a/bzrlib/builtins.py	2011-04-19 04:37:48 +0000
+++ b/bzrlib/builtins.py	2011-04-19 12:54:46 +0000
@@ -4714,7 +4714,7 @@
             annotate_file_tree(wt, file_id, self.outf, long, all,
                 show_ids=show_ids)
         else:
-            file_version = tree.inventory[file_id].revision
+            file_version = tree.get_file_revision(file_id)
             annotate_file(branch, file_version, file_id, long, all, self.outf,
                           show_ids=show_ids)
 

=== modified file 'bzrlib/bundle/bundle_data.py'
--- a/bzrlib/bundle/bundle_data.py	2010-09-28 18:51:47 +0000
+++ b/bzrlib/bundle/bundle_data.py	2011-04-17 23:06:22 +0000
@@ -661,7 +661,7 @@
         path = self.id2path(file_id)
         if path in self._last_changed:
             return self._last_changed[path]
-        return self.base_tree.inventory[file_id].revision
+        return self.base_tree.get_file_revision(file_id)
 
     def get_size_and_sha1(self, file_id):
         """Return the size and sha1 hash of the given file id.

=== modified file 'bzrlib/fetch.py'
--- a/bzrlib/fetch.py	2011-04-05 01:12:15 +0000
+++ b/bzrlib/fetch.py	2011-04-17 23:06:22 +0000
@@ -317,7 +317,7 @@
                 pass
             else:
                 try:
-                    parent_ids.append(tree.inventory[root_id].revision)
+                    parent_ids.append(tree.get_file_revision(root_id))
                 except errors.NoSuchId:
                     # not in the tree
                     pass

=== modified file 'bzrlib/merge.py'
--- a/bzrlib/merge.py	2011-04-13 14:47:11 +0000
+++ b/bzrlib/merge.py	2011-04-17 23:06:22 +0000
@@ -458,16 +458,13 @@
     @deprecated_method(deprecated_in((2, 1, 0)))
     def file_revisions(self, file_id):
         self.ensure_revision_trees()
-        def get_id(tree, file_id):
-            revision_id = tree.inventory[file_id].revision
-            return revision_id
         if self.this_rev_id is None:
             if self.this_basis_tree.get_file_sha1(file_id) != \
                 self.this_tree.get_file_sha1(file_id):
                 raise errors.WorkingTreeNotRevision(self.this_tree)
 
         trees = (self.this_basis_tree, self.other_tree)
-        return [get_id(tree, file_id) for tree in trees]
+        return [tree.get_file_revision(file_id) for tree in trees]
 
     @deprecated_method(deprecated_in((2, 1, 0)))
     def check_basis(self, check_clean, require_commits=True):

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2011-04-17 18:24:56 +0000
+++ b/bzrlib/repository.py	2011-04-17 23:06:22 +0000
@@ -2865,7 +2865,7 @@
         for revision, tree in parent_trees.iteritems():
             if ie.file_id not in tree:
                 continue
-            parent_id = tree.inventory[ie.file_id].revision
+            parent_id = tree.get_file_revision(ie.file_id)
             if parent_id in text_parents:
                 continue
             text_parents.append((ie.file_id, parent_id))

=== modified file 'bzrlib/revisiontree.py'
--- a/bzrlib/revisiontree.py	2011-04-17 18:24:56 +0000
+++ b/bzrlib/revisiontree.py	2011-04-17 23:06:22 +0000
@@ -56,6 +56,10 @@
         """Return the revision id associated with this tree."""
         return self._revision_id
 
+    def get_file_revision(self, file_id, path=None):
+        """Return the revision id in which a file was last changed."""
+        raise NotImplementedError(self.get_file_revision)
+
     def get_file_text(self, file_id, path=None):
         _, content = list(self.iter_files_bytes([(file_id, None)]))[0]
         return ''.join(content)
@@ -108,6 +112,10 @@
             return ie.text_sha1
         return None
 
+    def get_file_revision(self, file_id, path=None):
+        ie = self._inventory[file_id]
+        return ie.revision
+
     def is_executable(self, file_id, path=None):
         ie = self._inventory[file_id]
         if ie.kind != "file":
@@ -208,7 +216,7 @@
         """See Tree.iter_files_bytes.
 
         This version is implemented on top of Repository.extract_files_bytes"""
-        repo_desired_files = [(f, self.inventory[f].revision, i)
+        repo_desired_files = [(f, self.get_file_revision(f), i)
                               for f, i in desired_files]
         try:
             for result in self._repository.iter_files_bytes(repo_desired_files):
@@ -219,7 +227,7 @@
     def annotate_iter(self, file_id,
                       default_revision=revision.CURRENT_REVISION):
         """See Tree.annotate_iter"""
-        text_key = (file_id, self.inventory[file_id].revision)
+        text_key = (file_id, self.get_file_revision(file_id))
         annotator = self._repository.texts.get_annotator()
         annotations = annotator.annotate_flat(text_key)
         return [(key[-1], line) for key, line in annotations]

=== modified file 'bzrlib/tests/per_repository/test_commit_builder.py'
--- a/bzrlib/tests/per_repository/test_commit_builder.py	2011-04-13 09:45:01 +0000
+++ b/bzrlib/tests/per_repository/test_commit_builder.py	2011-04-17 23:06:22 +0000
@@ -572,8 +572,8 @@
             mini_commit = self.mini_commit
         rev2 = mini_commit(tree, name, name, False, False)
         tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
-        self.assertEqual(rev1, tree1.inventory[file_id].revision)
-        self.assertEqual(rev1, tree2.inventory[file_id].revision)
+        self.assertEqual(rev1, tree1.get_file_revision(file_id))
+        self.assertEqual(rev1, tree2.get_file_revision(file_id))
         expected_graph = {}
         expected_graph[(file_id, rev1)] = ()
         self.assertFileGraph(expected_graph, tree, (file_id, rev1))
@@ -602,8 +602,8 @@
         tree.add(['dir/content'], ['contentid'])
         rev2 = tree.commit('')
         tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
-        self.assertEqual(rev1, tree1.inventory['dirid'].revision)
-        self.assertEqual(rev1, tree2.inventory['dirid'].revision)
+        self.assertEqual(rev1, tree1.get_file_revision('dirid'))
+        self.assertEqual(rev1, tree2.get_file_revision('dirid'))
         file_id = 'dirid'
         expected_graph = {}
         expected_graph[(file_id, rev1)] = ()
@@ -812,8 +812,8 @@
         rev2 = mini_commit(tree, name, tree.id2path(file_id),
             expect_fs_hash=expect_fs_hash)
         tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
-        self.assertEqual(rev1, tree1.inventory[file_id].revision)
-        self.assertEqual(rev2, tree2.inventory[file_id].revision)
+        self.assertEqual(rev1, tree1.get_file_revision(file_id))
+        self.assertEqual(rev2, tree2.get_file_revision(file_id))
         expected_graph = {}
         expected_graph[(file_id, rev1)] = ()
         expected_graph[(file_id, rev2)] = ((file_id, rev1),)
@@ -1073,7 +1073,7 @@
         rev4 = mini_commit(tree1, 'new_' + name, 'new_' + name,
             expect_fs_hash=expect_fs_hash)
         tree3, = self._get_revtrees(tree1, [rev4])
-        self.assertEqual(rev4, tree3.inventory[name + 'id'].revision)
+        self.assertEqual(rev4, tree3.get_file_revision(name + 'id'))
         file_id = name + 'id'
         expected_graph = {}
         expected_graph[(file_id, rev1)] = ()
@@ -1139,7 +1139,7 @@
             rev3 = mini_commit(in_tree, name, 'new_' + name, False,
                 delta_against_basis=changed_in_tree)
             tree3, = self._get_revtrees(in_tree, [rev2])
-            self.assertEqual(rev2, tree3.inventory[name + 'id'].revision)
+            self.assertEqual(rev2, tree3.get_file_revision(name + 'id'))
             file_id = name + 'id'
             expected_graph = {}
             expected_graph[(file_id, rev1)] = ()
@@ -1171,7 +1171,7 @@
         rev3 = mini_commit(tree1, None, 'name', False)
         tree3, = self._get_revtrees(tree1, [rev2])
         # in rev2, name should be only changed in rev2
-        self.assertEqual(rev2, tree3.inventory[file_id].revision)
+        self.assertEqual(rev2, tree3.get_file_revision(file_id))
         expected_graph = {}
         expected_graph[(file_id, rev2)] = ()
         self.assertFileGraph(expected_graph, tree1, (file_id, rev2))

=== modified file 'bzrlib/tests/test_branchbuilder.py'
--- a/bzrlib/tests/test_branchbuilder.py	2011-01-12 01:01:53 +0000
+++ b/bzrlib/tests/test_branchbuilder.py	2011-04-17 23:06:22 +0000
@@ -321,7 +321,7 @@
                              ], d_tree)
         # Because we copied the exact text into *this* tree, the 'c' file
         # should look like it was not modified in the merge
-        self.assertEqual('C-id', d_tree.inventory['c-id'].revision)
+        self.assertEqual('C-id', d_tree.get_file_revision('c-id'))
 
     def test_set_parent_to_null(self):
         builder = self.build_a_rev()

=== modified file 'bzrlib/tests/test_bundle.py'
--- a/bzrlib/tests/test_bundle.py	2011-04-14 07:53:38 +0000
+++ b/bzrlib/tests/test_bundle.py	2011-04-19 10:59:05 +0000
@@ -142,6 +142,9 @@
         result.seek(0,0)
         return result
 
+    def get_file_revision(self, file_id):
+        return self.inventory[file_id].revision
+
     def contents_stats(self, file_id):
         if file_id not in self.contents:
             return None, None

=== modified file 'bzrlib/tests/test_commit_merge.py'
--- a/bzrlib/tests/test_commit_merge.py	2011-01-12 01:01:53 +0000
+++ b/bzrlib/tests/test_commit_merge.py	2011-04-17 23:06:22 +0000
@@ -89,9 +89,8 @@
 
         wty.commit('merge from x', rev_id='y at u-0-2', allow_pointless=False)
         tree = by.repository.revision_tree('y at u-0-2')
-        inv = tree.inventory
-        self.assertEquals(inv['ecks-id'].revision, 'x at u-0-1')
-        self.assertEquals(inv['why-id'].revision, 'y at u-0-1')
+        self.assertEquals(tree.get_file_revision('ecks-id'), 'x at u-0-1')
+        self.assertEquals(tree.get_file_revision('why-id'), 'y at u-0-1')
 
         check.check_dwim(bx.base, False, True, True)
         check.check_dwim(by.base, False, True, True)

=== modified file 'bzrlib/tests/test_revisiontree.py'
--- a/bzrlib/tests/test_revisiontree.py	2011-01-12 01:01:53 +0000
+++ b/bzrlib/tests/test_revisiontree.py	2011-04-17 23:35:01 +0000
@@ -59,6 +59,20 @@
         null_tree = self.t.branch.repository.revision_tree(
             revision.NULL_REVISION)
         self.assertIs(None, null_tree.inventory.root)
+        self.assertIs(None, null_tree.get_root_id())
+
+    def test_get_file_revision_root(self):
+        self.assertEquals(self.rev_id,
+            self.rev_tree.get_file_revision(self.rev_tree.get_root_id()))
+
+    def test_get_file_revision(self):
+        self.build_tree_contents([('a', 'initial')])
+        self.t.add(['a'])
+        revid1 = self.t.commit('add a')
+        revid2 = self.t.commit('another change', allow_pointless=True)
+        tree = self.t.branch.repository.revision_tree(revid2)
+        self.assertEquals(revid1,
+            tree.get_file_revision(tree.path2id('a')))
 
     def test_get_file_mtime_ghost(self):
         file_id = iter(self.rev_tree).next()

=== modified file 'bzrlib/tests/test_subsume.py'
--- a/bzrlib/tests/test_subsume.py	2011-04-15 07:01:22 +0000
+++ b/bzrlib/tests/test_subsume.py	2011-04-17 23:06:22 +0000
@@ -91,9 +91,9 @@
         self.assertEqualDiff(file2_contents,
                              basis_tree.get_file_text('file2-id'))
         self.assertEqual('subtree-1',
-                         basis_tree.inventory['file2-id'].revision)
+                         basis_tree.get_file_revision('file2-id'))
         self.assertEqual('combined-1',
-                         basis_tree.inventory[sub_root_id].revision)
+                         basis_tree.get_file_revision(sub_root_id))
 
     def test_subsume_failure(self):
         base_tree, sub_tree = self.make_trees()

=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py	2011-04-15 07:05:06 +0000
+++ b/bzrlib/transform.py	2011-04-17 23:06:22 +0000
@@ -1967,7 +1967,7 @@
                 yield self._get_repository().revision_tree(revision_id)
 
     def _get_file_revision(self, file_id, vf, tree_revision):
-        parent_keys = [(file_id, self._file_revision(t, file_id)) for t in
+        parent_keys = [(file_id, t.get_file_revision(file_id)) for t in
                        self._iter_parent_trees()]
         vf.add_lines((file_id, tree_revision), parent_keys,
                      self.get_file_lines(file_id))

=== modified file 'bzrlib/tree.py'
--- a/bzrlib/tree.py	2011-04-17 17:49:43 +0000
+++ b/bzrlib/tree.py	2011-04-17 23:06:22 +0000
@@ -433,29 +433,19 @@
             except errors.NoSuchRevisionInTree:
                 yield self.repository.revision_tree(revision_id)
 
-    @staticmethod
-    def _file_revision(revision_tree, file_id):
-        """Determine the revision associated with a file in a given tree."""
-        # FIXME: Shouldn't this be a RevisionTree method?
-        revision_tree.lock_read()
-        try:
-            return revision_tree.inventory[file_id].revision
-        finally:
-            revision_tree.unlock()
-
     def _get_file_revision(self, file_id, vf, tree_revision):
         """Ensure that file_id, tree_revision is in vf to plan the merge."""
 
         if getattr(self, '_repository', None) is None:
             last_revision = tree_revision
-            parent_keys = [(file_id, self._file_revision(t, file_id)) for t in
+            parent_keys = [(file_id, t.get_file_revision(file_id)) for t in
                 self._iter_parent_trees()]
             vf.add_lines((file_id, last_revision), parent_keys,
                          self.get_file_lines(file_id))
             repo = self.branch.repository
             base_vf = repo.texts
         else:
-            last_revision = self._file_revision(self, file_id)
+            last_revision = self.get_file_revision(file_id)
             base_vf = self._repository.texts
         if base_vf not in vf.fallback_versionedfiles:
             vf.fallback_versionedfiles.append(base_vf)

=== modified file 'bzrlib/workingtree_4.py'
--- a/bzrlib/workingtree_4.py	2011-04-09 19:25:42 +0000
+++ b/bzrlib/workingtree_4.py	2011-04-17 23:06:22 +0000
@@ -1636,7 +1636,7 @@
     def annotate_iter(self, file_id,
                       default_revision=_mod_revision.CURRENT_REVISION):
         """See Tree.annotate_iter"""
-        text_key = (file_id, self.inventory[file_id].revision)
+        text_key = (file_id, self.get_file_revision(file_id))
         annotations = self._repository.texts.annotate(text_key)
         return [(key[-1], line) for (key, line) in annotations]
 
@@ -1806,6 +1806,10 @@
             return parent_details[1]
         return None
 
+    @needs_read_lock
+    def get_file_revision(self, file_id):
+        return self.inventory[file_id].revision
+
     def get_file(self, file_id, path=None):
         return StringIO(self.get_file_text(file_id))
 

=== modified file 'doc/en/release-notes/bzr-2.4.txt'
--- a/doc/en/release-notes/bzr-2.4.txt	2011-04-19 04:37:48 +0000
+++ b/doc/en/release-notes/bzr-2.4.txt	2011-04-19 12:54:46 +0000
@@ -151,6 +151,9 @@
   from ``bzrlib.repofmt.pack_repo`` to
   ``bzrlib.repofmt.knitpack_repo``. (Jelmer Vernooij)
 
+* ``RevisionTree`` now has a new method ``get_file_revision``.
+  (Jelmer Vernooij)
+
 * ``WorkingTree`` no longer provides an ``inventory``. Instead,
   all inventory-related functionality is now on the subclass
   ``InventoryWorkingTree`` that all native Bazaar working tree




More information about the bazaar-commits mailing list