450
450
del self._new_id[trans_id]
451
451
del self._r_new_id[file_id]
454
"""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.
456
fp = FinalPaths(self)
457
for id_set in (self._new_name, self._new_parent, self._new_contents,
458
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:
459
466
new_ids.update(id_set)
460
new_paths = [(fp.get_path(t), t) for t in new_ids]
467
return sorted(FinalPaths(self).get_paths(new_ids))
464
469
def tree_kind(self, trans_id):
465
470
"""Determine the file kind in the working tree.
1252
1269
That is, create any files that need to be created, and restore from
1253
1270
limbo any files that needed renaming. This must be done in strict
1254
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.
1256
new_paths = self.new_paths()
1276
new_paths = self.new_paths(filesystem_only=(inventory_delta is None))
1257
1277
modified_paths = []
1258
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1259
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()
1261
1287
for num, (path, trans_id) in enumerate(new_paths):
1262
1288
new_entry = None
1263
child_pb.update('adding file', num, len(new_paths))
1264
if trans_id in self._new_contents or \
1265
self.path_changed(trans_id):
1266
full_path = self._tree.abspath(path)
1267
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):
1269
mover.rename(self._limbo_name(trans_id), full_path)
1271
# We may be renaming a dangling inventory id
1272
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])
1275
self.rename_count += 1
1276
if trans_id in self._new_contents:
1277
modified_paths.append(full_path)
1278
completed_new.append(trans_id)
1279
file_id = self.final_file_id(trans_id)
1280
if file_id is not None and (trans_id in self._new_id or
1281
trans_id in self._new_name or trans_id in self._new_parent
1282
or trans_id in self._new_executability):
1284
kind = self.final_kind(trans_id)
1286
kind = self._tree.stored_kind(file_id)
1287
if trans_id in self._new_reference_revision:
1288
new_entry = inventory.TreeReference(
1289
self.final_file_id(trans_id),
1290
self._new_name[trans_id],
1291
self.final_file_id(self._new_parent[trans_id]),
1292
None, self._new_reference_revision[trans_id])
1294
new_entry = inventory.make_entry(kind,
1295
self.final_name(trans_id),
1296
self.final_file_id(self.final_parent(trans_id)),
1297
self.final_file_id(trans_id))
1299
old_path = self._tree.id2path(new_entry.file_id)
1300
except errors.NoSuchId:
1302
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))
1305
1335
if trans_id in self._new_executability:
1306
1336
self._set_executability(path, new_entry, trans_id)
1308
1338
child_pb.finished()
1309
for trans_id in completed_new:
1310
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]
1311
1344
return modified_paths
1658
1705
tt.delete_contents(tt.trans_id_tree_path(tree_path))
1659
1706
if kind == 'directory':
1660
1707
reparent = True
1661
if entry.parent_id not in file_trans_id:
1662
raise AssertionError(
1663
'entry %s parent id %r is not in file_trans_id %r'
1664
% (entry, entry.parent_id, file_trans_id))
1665
1708
parent_id = file_trans_id[entry.parent_id]
1666
1709
if entry.kind == 'file':
1667
1710
# We *almost* replicate new_by_entry, so that we can defer
1668
1711
# getting the file text, and get them all at once.
1669
1712
trans_id = tt.create_path(entry.name, parent_id)
1670
1713
file_trans_id[file_id] = trans_id
1671
tt.version_file(entry.file_id, trans_id)
1672
executable = tree.is_executable(entry.file_id, tree_path)
1673
if executable is not None:
1714
tt.version_file(file_id, trans_id)
1715
executable = tree.is_executable(file_id, tree_path)
1674
1717
tt.set_executability(executable, trans_id)
1675
deferred_contents.append((entry.file_id, trans_id))
1718
deferred_contents.append((file_id, trans_id))
1677
1720
file_trans_id[file_id] = new_by_entry(tt, entry, parent_id,