Merge lp:~jelmer/brz/follow-tree-references-id2path into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/follow-tree-references-id2path
Merge into: lp:brz
Prerequisite: lp:~jelmer/brz/follow-tree-references-iter-entries-by-dir
Diff against target: 112 lines (+53/-11)
3 files modified
breezy/bzr/workingtree_4.py (+25/-5)
breezy/tests/per_tree/test_ids.py (+24/-0)
breezy/tests/per_workingtree/test_workingtree.py (+4/-6)
To merge this branch: bzr merge lp:~jelmer/brz/follow-tree-references-id2path
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+374163@code.launchpad.net

This proposal supersedes a proposal from 2019-10-15.

Commit message

Add support for tree references in id2path.

Description of the change

Add support for tree references in id2path.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) :
review: Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'breezy/bzr/workingtree_4.py'
2--- breezy/bzr/workingtree_4.py 2019-10-15 19:16:34 +0000
3+++ breezy/bzr/workingtree_4.py 2019-10-15 19:16:34 +0000
4@@ -475,6 +475,16 @@
5 state = self.current_dirstate()
6 entry = self._get_entry(file_id=file_id)
7 if entry == (None, None):
8+ if 'evil' in debug.debug_flags:
9+ trace.mutter_callsite(
10+ 2, "Tree.id2path scans all nested trees.")
11+ for nested_path in self.iter_references():
12+ nested_tree = self.get_nested_tree(nested_path)
13+ try:
14+ return osutils.pathjoin(
15+ nested_path, nested_tree.id2path(file_id))
16+ except errors.NoSuchId:
17+ pass
18 raise errors.NoSuchId(tree=self, file_id=file_id)
19 path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])
20 return path_utf8.decode('utf8')
21@@ -1739,11 +1749,18 @@
22
23 def id2path(self, file_id):
24 "Convert a file-id to a path."
25- entry = self._get_entry(file_id=file_id)
26- if entry == (None, None):
27- raise errors.NoSuchId(tree=self, file_id=file_id)
28- path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])
29- return path_utf8.decode('utf8')
30+ with self.lock_read():
31+ entry = self._get_entry(file_id=file_id)
32+ if entry == (None, None):
33+ for nested_path in self.iter_references():
34+ nested_tree = self.get_nested_tree(nested_path)
35+ try:
36+ return osutils.pathjoin(nested_path, nested_tree.id2path(file_id))
37+ except errors.NoSuchId:
38+ pass
39+ raise errors.NoSuchId(tree=self, file_id=file_id)
40+ path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])
41+ return path_utf8.decode('utf8')
42
43 def get_nested_tree(self, path):
44 with self.lock_read():
45@@ -2075,6 +2092,9 @@
46 with self.lock_read():
47 entry = self._get_entry(path=path)
48 if entry == (None, None):
49+ nested_tree, subpath = self.get_containing_nested_tree(path)
50+ if nested_tree is not None:
51+ return nested_tree.path2id(subpath)
52 return None
53 return entry[0][2]
54
55
56=== modified file 'breezy/tests/per_tree/test_ids.py'
57--- breezy/tests/per_tree/test_ids.py 2019-06-29 13:16:26 +0000
58+++ breezy/tests/per_tree/test_ids.py 2019-10-15 19:16:34 +0000
59@@ -55,6 +55,30 @@
60 self.assertEqual('dir/file', self.tree_a.id2path(b'file-id'))
61 self.assertRaises(errors.NoSuchId, self.tree_a.id2path, b'nonexistant')
62
63+ def skip_if_no_reference(self, tree):
64+ if not getattr(tree, 'supports_tree_reference', lambda: False)():
65+ raise tests.TestNotApplicable('Tree references not supported')
66+
67+ def create_nested(self):
68+ work_tree = self.make_branch_and_tree('wt')
69+ with work_tree.lock_write():
70+ self.skip_if_no_reference(work_tree)
71+ subtree = self.make_branch_and_tree('wt/subtree')
72+ self.build_tree(['wt/subtree/a'])
73+ subtree.add(['a'])
74+ subtree.commit('foo')
75+ work_tree.add_reference(subtree)
76+ tree = self._convert_tree(work_tree)
77+ self.skip_if_no_reference(tree)
78+ return tree, subtree
79+
80+ def test_path2id_nested_tree(self):
81+ tree, subtree = self.create_nested()
82+ self.assertIsNot(None, tree.path2id('subtree'))
83+ self.assertIsNot(None, tree.path2id('subtree/a'))
84+ self.assertEqual('subtree', tree.id2path(tree.path2id('subtree')))
85+ self.assertEqual('subtree/a', tree.id2path(tree.path2id('subtree/a')))
86+
87
88 class Path2IdsTests(TestCaseWithTree):
89
90
91=== modified file 'breezy/tests/per_workingtree/test_workingtree.py'
92--- breezy/tests/per_workingtree/test_workingtree.py 2019-06-29 13:16:26 +0000
93+++ breezy/tests/per_workingtree/test_workingtree.py 2019-10-15 19:16:34 +0000
94@@ -159,14 +159,12 @@
95 self.assertEqual(1, len(result))
96 if tree.has_versioned_directories():
97 self.assertEqual(
98- ('filename', 'V', 'directory', tree.path2id('filename')),
99- (result[0][0], result[0][1], result[0][2],
100- getattr(result[0][3], 'file_id', None)))
101+ ('filename', 'V', 'directory'),
102+ (result[0][0], result[0][1], result[0][2]))
103 else:
104 self.assertEqual(
105- ('filename', '?', 'directory', None),
106- (result[0][0], result[0][1], result[0][2],
107- getattr(result[0][3], 'file_id', None)))
108+ ('filename', '?', 'directory'),
109+ (result[0][0], result[0][1], result[0][2]))
110
111 def test_get_config_stack(self):
112 # Smoke test that all working trees succeed getting a config

Subscribers

People subscribed via source and target branches