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