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.
1253
1269
That is, create any files that need to be created, and restore from
1254
1270
limbo any files that needed renaming. This must be done in strict
1255
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.
1257
new_paths = self.new_paths()
1276
new_paths = self.new_paths(filesystem_only=(inventory_delta is None))
1258
1277
modified_paths = []
1259
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1260
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()
1262
1287
for num, (path, trans_id) in enumerate(new_paths):
1263
1288
new_entry = None
1264
child_pb.update('adding file', num, len(new_paths))
1265
if trans_id in self._new_contents or \
1266
self.path_changed(trans_id):
1267
full_path = self._tree.abspath(path)
1268
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):
1270
mover.rename(self._limbo_name(trans_id), full_path)
1272
# We may be renaming a dangling inventory id
1273
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])
1276
self.rename_count += 1
1277
if trans_id in self._new_contents:
1278
modified_paths.append(full_path)
1279
completed_new.append(trans_id)
1280
file_id = self.final_file_id(trans_id)
1281
if file_id is not None and (trans_id in self._new_id or
1282
trans_id in self._new_name or trans_id in self._new_parent
1283
or trans_id in self._new_executability):
1285
kind = self.final_kind(trans_id)
1287
kind = self._tree.stored_kind(file_id)
1288
if trans_id in self._new_reference_revision:
1289
new_entry = inventory.TreeReference(
1290
self.final_file_id(trans_id),
1291
self._new_name[trans_id],
1292
self.final_file_id(self._new_parent[trans_id]),
1293
None, self._new_reference_revision[trans_id])
1295
new_entry = inventory.make_entry(kind,
1296
self.final_name(trans_id),
1297
self.final_file_id(self.final_parent(trans_id)),
1298
self.final_file_id(trans_id))
1300
old_path = self._tree.id2path(new_entry.file_id)
1301
except errors.NoSuchId:
1303
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))
1306
1335
if trans_id in self._new_executability:
1307
1336
self._set_executability(path, new_entry, trans_id)
1309
1338
child_pb.finished()
1310
for trans_id in completed_new:
1311
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]
1312
1344
return modified_paths
1659
1705
tt.delete_contents(tt.trans_id_tree_path(tree_path))
1660
1706
if kind == 'directory':
1661
1707
reparent = True
1662
if entry.parent_id not in file_trans_id:
1663
raise AssertionError(
1664
'entry %s parent id %r is not in file_trans_id %r'
1665
% (entry, entry.parent_id, file_trans_id))
1666
1708
parent_id = file_trans_id[entry.parent_id]
1667
1709
if entry.kind == 'file':
1668
1710
# We *almost* replicate new_by_entry, so that we can defer
1669
1711
# getting the file text, and get them all at once.
1670
1712
trans_id = tt.create_path(entry.name, parent_id)
1671
1713
file_trans_id[file_id] = trans_id
1672
tt.version_file(entry.file_id, trans_id)
1673
executable = tree.is_executable(entry.file_id, tree_path)
1674
if executable is not None:
1714
tt.version_file(file_id, trans_id)
1715
executable = tree.is_executable(file_id, tree_path)
1675
1717
tt.set_executability(executable, trans_id)
1676
deferred_contents.append((entry.file_id, trans_id))
1718
deferred_contents.append((file_id, trans_id))
1678
1720
file_trans_id[file_id] = new_by_entry(tt, entry, parent_id,