451
450
del self._new_id[trans_id]
452
451
del self._r_new_id[file_id]
455
"""Determine the paths of all new and changed files"""
453
def new_paths(self, filesystem_only=False):
454
"""Determine the paths of all new and changed files.
456
:param filesystem_only: if True, only calculate values for files
457
that require renames or execute bit changes.
457
fp = FinalPaths(self)
458
for id_set in (self._new_name, self._new_parent, self._new_contents,
459
self._new_id, self._new_executability):
461
id_sets = (self._needs_rename, self._new_executability)
463
id_sets = (self._new_name, self._new_parent, self._new_contents,
464
self._new_id, self._new_executability)
465
for id_set in id_sets:
460
466
new_ids.update(id_set)
461
new_paths = [(fp.get_path(t), t) for t in new_ids]
467
return sorted(FinalPaths(self).get_paths(new_ids))
465
469
def tree_kind(self, trans_id):
466
470
"""Determine the file kind in the working tree.
1257
1269
That is, create any files that need to be created, and restore from
1258
1270
limbo any files that needed renaming. This must be done in strict
1259
1271
parent-to-child order.
1273
If inventory_delta is None, no inventory delta is calculated, and
1274
no list of modified paths is returned.
1261
new_paths = self.new_paths()
1276
new_paths = self.new_paths(filesystem_only=(inventory_delta is None))
1262
1277
modified_paths = []
1263
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1264
1278
completed_new = []
1279
new_path_file_ids = dict((t, self.final_file_id(t)) for p, t in
1281
if inventory_delta is not None:
1282
entries = self._tree.iter_entries_by_dir(
1283
new_path_file_ids.values())
1284
old_paths = dict((e.file_id, p) for p, e in entries)
1285
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1266
1287
for num, (path, trans_id) in enumerate(new_paths):
1267
1288
new_entry = None
1268
child_pb.update('adding file', num, len(new_paths))
1269
if trans_id in self._new_contents or \
1270
self.path_changed(trans_id):
1271
full_path = self._tree.abspath(path)
1272
if trans_id in self._needs_rename:
1290
child_pb.update('adding file', num, len(new_paths))
1291
full_path = self._tree.abspath(path)
1292
if trans_id in self._needs_rename:
1294
mover.rename(self._limbo_name(trans_id), full_path)
1296
# We may be renaming a dangling inventory id
1297
if e.errno != errno.ENOENT:
1300
self.rename_count += 1
1301
if inventory_delta is not None:
1302
if (trans_id in self._new_contents or
1303
self.path_changed(trans_id)):
1304
if trans_id in self._new_contents:
1305
modified_paths.append(full_path)
1306
completed_new.append(trans_id)
1307
file_id = new_path_file_ids[trans_id]
1308
if file_id is not None and (trans_id in self._new_id or
1309
trans_id in self._new_name or
1310
trans_id in self._new_parent
1311
or trans_id in self._new_executability):
1274
mover.rename(self._limbo_name(trans_id), full_path)
1276
# We may be renaming a dangling inventory id
1277
if e.errno != errno.ENOENT:
1313
kind = self.final_kind(trans_id)
1315
kind = self._tree.stored_kind(file_id)
1316
parent_trans_id = self.final_parent(trans_id)
1317
parent_file_id = new_path_file_ids.get(parent_trans_id)
1318
if parent_file_id is None:
1319
parent_file_id = self.final_file_id(
1321
if trans_id in self._new_reference_revision:
1322
new_entry = inventory.TreeReference(
1324
self._new_name[trans_id],
1325
self.final_file_id(self._new_parent[trans_id]),
1326
None, self._new_reference_revision[trans_id])
1280
self.rename_count += 1
1281
if trans_id in self._new_contents:
1282
modified_paths.append(full_path)
1283
completed_new.append(trans_id)
1284
file_id = self.final_file_id(trans_id)
1285
if file_id is not None and (trans_id in self._new_id or
1286
trans_id in self._new_name or trans_id in self._new_parent
1287
or trans_id in self._new_executability):
1289
kind = self.final_kind(trans_id)
1291
kind = self._tree.stored_kind(file_id)
1292
if trans_id in self._new_reference_revision:
1293
new_entry = inventory.TreeReference(
1294
self.final_file_id(trans_id),
1295
self._new_name[trans_id],
1296
self.final_file_id(self._new_parent[trans_id]),
1297
None, self._new_reference_revision[trans_id])
1299
new_entry = inventory.make_entry(kind,
1300
self.final_name(trans_id),
1301
self.final_file_id(self.final_parent(trans_id)),
1302
self.final_file_id(trans_id))
1304
old_path = self._tree.id2path(new_entry.file_id)
1305
except errors.NoSuchId:
1307
inventory_delta.append((old_path, path, new_entry.file_id,
1328
new_entry = inventory.make_entry(kind,
1329
self.final_name(trans_id),
1330
parent_file_id, file_id)
1331
old_path = old_paths.get(new_entry.file_id)
1332
inventory_delta.append(
1333
(old_path, path, new_entry.file_id, new_entry))
1310
1335
if trans_id in self._new_executability:
1311
1336
self._set_executability(path, new_entry, trans_id)
1313
1338
child_pb.finished()
1314
for trans_id in completed_new:
1315
del self._new_contents[trans_id]
1339
if inventory_delta is None:
1340
self._new_contents.clear()
1342
for trans_id in completed_new:
1343
del self._new_contents[trans_id]
1316
1344
return modified_paths
1663
1705
tt.delete_contents(tt.trans_id_tree_path(tree_path))
1664
1706
if kind == 'directory':
1665
1707
reparent = True
1666
if entry.parent_id not in file_trans_id:
1667
raise AssertionError(
1668
'entry %s parent id %r is not in file_trans_id %r'
1669
% (entry, entry.parent_id, file_trans_id))
1670
1708
parent_id = file_trans_id[entry.parent_id]
1671
1709
if entry.kind == 'file':
1672
1710
# We *almost* replicate new_by_entry, so that we can defer
1673
1711
# getting the file text, and get them all at once.
1674
1712
trans_id = tt.create_path(entry.name, parent_id)
1675
1713
file_trans_id[file_id] = trans_id
1676
tt.version_file(entry.file_id, trans_id)
1677
executable = tree.is_executable(entry.file_id, tree_path)
1678
if executable is not None:
1714
tt.version_file(file_id, trans_id)
1715
executable = tree.is_executable(file_id, tree_path)
1679
1717
tt.set_executability(executable, trans_id)
1680
deferred_contents.append((entry.file_id, trans_id))
1718
deferred_contents.append((file_id, trans_id))
1682
1720
file_trans_id[file_id] = new_by_entry(tt, entry, parent_id,
1834
1876
tt.set_executability(entry.executable, trans_id)
1837
@deprecated_function(zero_fifteen)
1838
def find_interesting(working_tree, target_tree, filenames):
1839
"""Find the ids corresponding to specified filenames.
1841
Deprecated: Please use tree1.paths2ids(filenames, [tree2]).
1843
working_tree.lock_read()
1845
target_tree.lock_read()
1847
return working_tree.paths2ids(filenames, [target_tree])
1849
target_tree.unlock()
1851
working_tree.unlock()
1854
@deprecated_function(zero_ninety)
1855
def change_entry(tt, file_id, working_tree, target_tree,
1856
trans_id_file_id, backups, trans_id, by_parent):
1857
"""Replace a file_id's contents with those from a target tree."""
1858
if file_id is None and target_tree is None:
1859
# skip the logic altogether in the deprecation test
1861
e_trans_id = trans_id_file_id(file_id)
1862
entry = target_tree.inventory[file_id]
1863
has_contents, contents_mod, meta_mod, = _entry_changes(file_id, entry,
1866
mode_id = e_trans_id
1869
tt.delete_contents(e_trans_id)
1871
parent_trans_id = trans_id_file_id(entry.parent_id)
1872
backup_name = get_backup_name(entry, by_parent,
1873
parent_trans_id, tt)
1874
tt.adjust_path(backup_name, parent_trans_id, e_trans_id)
1875
tt.unversion_file(e_trans_id)
1876
e_trans_id = tt.create_path(entry.name, parent_trans_id)
1877
tt.version_file(file_id, e_trans_id)
1878
trans_id[file_id] = e_trans_id
1879
create_by_entry(tt, entry, target_tree, e_trans_id, mode_id=mode_id)
1880
create_entry_executability(tt, entry, e_trans_id)
1883
tt.set_executability(entry.executable, e_trans_id)
1884
if tt.final_name(e_trans_id) != entry.name:
1887
parent_id = tt.final_parent(e_trans_id)
1888
parent_file_id = tt.final_file_id(parent_id)
1889
if parent_file_id != entry.parent_id:
1894
parent_trans_id = trans_id_file_id(entry.parent_id)
1895
tt.adjust_path(entry.name, parent_trans_id, e_trans_id)
1898
1879
def get_backup_name(entry, by_parent, parent_trans_id, tt):
1899
1880
return _get_backup_name(entry.name, by_parent, parent_trans_id, tt)