64
64
def get_inventory_text(repo, revision_id):
65
65
"""Get the fulltext for the inventory at revision id"""
66
with repo.lock_read():
68
67
return get_text(repo.inventories, (revision_id,))
73
70
class MockTree(object):
92
89
def all_versioned_paths(self):
93
90
return set(self.paths.values())
95
def is_executable(self, path, file_id):
92
def is_executable(self, path):
96
93
# Not all the files are executable.
103
100
return self.make_entry(file_id, self.paths[file_id])
102
def get_entry_by_path(self, path):
103
return self[self.path2id(path)]
105
105
def parent_id(self, file_id):
106
106
parent_dir = os.path.dirname(self.paths[file_id])
107
107
if parent_dir == "":
112
112
for path, file_id in self.ids.items():
113
113
yield path, self[file_id]
115
def kind(self, path, file_id=None):
117
file_id = self.path2id(path)
118
if file_id in self.contents:
115
def kind(self, path):
116
if path in self.contents:
121
119
kind = 'directory'
127
125
if not isinstance(file_id, bytes):
128
126
raise TypeError(file_id)
129
127
name = os.path.basename(path)
130
kind = self.kind(path, file_id)
128
kind = self.kind(path)
131
129
parent_id = self.parent_id(file_id)
132
text_sha_1, text_size = self.contents_stats(path, file_id)
130
text_sha_1, text_size = self.contents_stats(path)
133
131
if kind == 'directory':
134
132
ie = InventoryDirectory(file_id, name, parent_id)
135
133
elif kind == 'file':
152
150
if not isinstance(file_id, bytes):
153
151
raise TypeError(file_id)
154
152
self.add_dir(file_id, path)
155
self.contents[file_id] = contents
153
self.contents[path] = contents
157
155
def path2id(self, path):
158
156
return self.ids.get(path)
163
161
def has_id(self, file_id):
164
162
return self.id2path(file_id) is not None
166
def get_file(self, path, file_id=None):
168
file_id = self.path2id(path)
164
def get_file(self, path):
169
165
result = BytesIO()
171
result.write(self.contents[file_id])
167
result.write(self.contents[path])
173
169
raise errors.NoSuchFile(path)
174
170
result.seek(0, 0)
177
def get_file_revision(self, path, file_id=None):
179
file_id = self.path2id(path)
180
return self.inventory[file_id].revision
173
def get_file_revision(self, path):
174
return self.inventory.get_entry_by_path(path).revision
182
def get_file_size(self, path, file_id=None):
184
file_id = self.path2id(path)
185
return self.inventory[file_id].text_size
176
def get_file_size(self, path):
177
return self.inventory.get_entry_by_path(path).text_size
187
179
def get_file_sha1(self, path, file_id=None):
189
file_id = self.path2id(path)
190
return self.inventory[file_id].text_sha1
180
return self.inventory.get_entry_by_path(path).text_sha1
192
def contents_stats(self, path, file_id):
193
if file_id not in self.contents:
182
def contents_stats(self, path):
183
if path not in self.contents:
194
184
return None, None
195
text_sha1 = osutils.sha_file(self.get_file(path, file_id))
196
return text_sha1, len(self.contents[file_id])
185
text_sha1 = osutils.sha_file(self.get_file(path))
186
return text_sha1, len(self.contents[path])
199
189
class BTreeTester(tests.TestCase):
205
195
mtree.add_dir(b"b", "grandparent/parent")
206
196
mtree.add_file(b"c", "grandparent/parent/file", b"Hello\n")
207
197
mtree.add_dir(b"d", "grandparent/alt_parent")
208
return BundleTree(mtree, ''), mtree
198
return BundleTree(mtree, b''), mtree
210
200
def test_renames(self):
211
201
"""Ensure that file renames have the proper effect on children"""
606
596
for path, status, kind, fileid, entry in base_files:
607
597
# Check that the meta information is the same
608
self.assertEqual(base_tree.get_file_size(path, fileid),
609
to_tree.get_file_size(to_tree.id2path(fileid)))
610
self.assertEqual(base_tree.get_file_sha1(path, fileid),
611
to_tree.get_file_sha1(to_tree.id2path(fileid)))
598
self.assertEqual(base_tree.get_file_size(path),
599
to_tree.get_file_size(to_tree.id2path(fileid)))
600
self.assertEqual(base_tree.get_file_sha1(path),
601
to_tree.get_file_sha1(to_tree.id2path(fileid)))
612
602
# Check that the contents are the same
613
603
# This is pretty expensive
614
604
# self.assertEqual(base_tree.get_file(fileid).read(),
979
969
self.tree1.commit('message', rev_id=b'revid1')
980
970
bundle = self.get_valid_bundle(b'null:', b'revid1')
981
971
tree = self.get_bundle_tree(bundle, b'revid1')
982
root_revision = tree.get_file_revision(u'', tree.get_root_id())
972
root_revision = tree.get_file_revision(u'')
983
973
self.assertEqual(b'revid1', root_revision)
985
975
def test_install_revisions(self):