65
67
raise NotImplementedError(self.get_file_revision)
67
69
def get_file_text(self, file_id, path=None):
68
_, content = list(self.iter_files_bytes([(file_id, None)]))[0]
69
return ''.join(content)
70
for (identifier, content) in self.iter_files_bytes([(file_id, None)]):
71
ret = "".join(content)
71
74
def get_file(self, file_id, path=None):
72
75
return StringIO(self.get_file_text(file_id))
100
103
self._inventory = inv
102
105
def get_file_mtime(self, file_id, path=None):
103
ie = self._inventory[file_id]
106
inv, inv_file_id = self._unpack_file_id(file_id)
107
ie = inv[inv_file_id]
105
109
revision = self._repository.get_revision(ie.revision)
106
110
except errors.NoSuchRevision:
108
112
return revision.timestamp
110
114
def get_file_size(self, file_id):
111
return self._inventory[file_id].text_size
115
inv, inv_file_id = self._unpack_file_id(file_id)
116
return inv[inv_file_id].text_size
113
118
def get_file_sha1(self, file_id, path=None, stat_value=None):
114
ie = self._inventory[file_id]
119
inv, inv_file_id = self._unpack_file_id(file_id)
120
ie = inv[inv_file_id]
115
121
if ie.kind == "file":
116
122
return ie.text_sha1
119
125
def get_file_revision(self, file_id, path=None):
120
ie = self._inventory[file_id]
126
inv, inv_file_id = self._unpack_file_id(file_id)
127
ie = inv[inv_file_id]
121
128
return ie.revision
123
130
def is_executable(self, file_id, path=None):
124
ie = self._inventory[file_id]
131
inv, inv_file_id = self._unpack_file_id(file_id)
132
ie = inv[inv_file_id]
125
133
if ie.kind != "file":
127
135
return ie.executable
129
137
def has_filename(self, filename):
130
return bool(self.inventory.path2id(filename))
138
return bool(self.path2id(filename))
132
140
def list_files(self, include_root=False, from_dir=None, recursive=True):
133
141
# The only files returned by this are those from the version
135
142
if from_dir is None:
136
143
from_dir_id = None
144
inv = self.root_inventory
138
from_dir_id = inv.path2id(from_dir)
146
inv, from_dir_id = self._path2inv_file_id(from_dir)
139
147
if from_dir_id is None:
140
148
# Directory not versioned
147
155
yield path, 'V', entry.kind, entry.file_id, entry
149
157
def get_symlink_target(self, file_id, path=None):
150
ie = self._inventory[file_id]
158
inv, inv_file_id = self._unpack_file_id(file_id)
159
ie = inv[inv_file_id]
151
160
# Inventories store symlink targets in unicode
152
161
return ie.symlink_target
154
163
def get_reference_revision(self, file_id, path=None):
155
return self.inventory[file_id].reference_revision
164
inv, inv_file_id = self._unpack_file_id(file_id)
165
return inv[inv_file_id].reference_revision
157
167
def get_root_id(self):
158
if self.inventory.root:
159
return self.inventory.root.file_id
168
if self.root_inventory.root:
169
return self.root_inventory.root.file_id
161
171
def kind(self, file_id):
162
return self._inventory[file_id].kind
172
inv, inv_file_id = self._unpack_file_id(file_id)
173
return inv[inv_file_id].kind
164
175
def path_content_summary(self, path):
165
176
"""See Tree.path_content_summary."""
166
id = self.inventory.path2id(path)
177
inv, file_id = self._path2inv_file_id(path)
168
179
return ('missing', None, None, None)
169
entry = self._inventory[id]
170
181
kind = entry.kind
171
182
if kind == 'file':
172
183
return (kind, entry.text_size, entry.executable, entry.text_sha1)
215
225
def iter_files_bytes(self, desired_files):
216
226
"""See Tree.iter_files_bytes.
218
This version is implemented on top of Repository.extract_files_bytes"""
228
This version is implemented on top of Repository.iter_files_bytes"""
219
229
repo_desired_files = [(f, self.get_file_revision(f), i)
220
230
for f, i in desired_files]
222
232
for result in self._repository.iter_files_bytes(repo_desired_files):
224
234
except errors.RevisionNotPresent, e:
225
raise errors.NoSuchFile(e.revision_id)
235
raise errors.NoSuchFile(e.file_id)
227
237
def annotate_iter(self, file_id,
228
238
default_revision=revision.CURRENT_REVISION):
232
242
annotations = annotator.annotate_flat(text_key)
233
243
return [(key[-1], line) for key, line in annotations]
245
def __eq__(self, other):
248
if isinstance(other, InventoryRevisionTree):
249
return (self.root_inventory == other.root_inventory)
252
def __ne__(self, other):
253
return not (self == other)
256
raise ValueError('not hashable')
236
259
class InterCHKRevisionTree(tree.InterTree):
237
260
"""Fast path optimiser for RevisionTrees with CHK inventories."""
242
265
and isinstance(target, RevisionTree)):
244
267
# Only CHK inventories have id_to_entry attribute
245
source.inventory.id_to_entry
246
target.inventory.id_to_entry
268
source.root_inventory.id_to_entry
269
target.root_inventory.id_to_entry
248
271
except AttributeError:
267
290
# to CHKInventory.iter_changes and do a better job there -- vila
269
292
changed_file_ids = set()
270
for result in self.target.inventory.iter_changes(self.source.inventory):
293
# FIXME: nested tree support
294
for result in self.target.root_inventory.iter_changes(
295
self.source.root_inventory):
271
296
if specific_file_ids is not None:
272
297
file_id = result[0]
273
298
if file_id not in specific_file_ids:
290
315
# Now walk the whole inventory, excluding the already yielded
317
# FIXME: Support nested trees
292
318
changed_file_ids = set(changed_file_ids)
293
for relpath, entry in self.target.inventory.iter_entries():
319
for relpath, entry in self.target.root_inventory.iter_entries():
294
320
if (specific_file_ids is not None
295
321
and not entry.file_id in specific_file_ids):