250
250
This reflects only files that already exist, not ones that will be
251
251
added by transactions.
253
path = self._tree.inventory.id2path(inventory_id)
253
path = self._tree.id2path(inventory_id)
254
254
return self.trans_id_tree_path(path)
256
256
def trans_id_file_id(self, file_id):
771
771
removed_tree_ids = set((self.tree_file_id(trans_id) for trans_id in
772
772
self._removed_id))
773
active_tree_ids = set((f for f in self._tree.inventory if
774
f not in removed_tree_ids))
773
all_ids = self._tree.all_file_ids()
774
active_tree_ids = all_ids.difference(removed_tree_ids)
775
775
for trans_id, file_id in self._new_id.iteritems():
776
776
if file_id in active_tree_ids:
777
777
old_trans_id = self.trans_id_tree_file_id(file_id)
1198
1197
child_pb.update('Apply phase', 0, 2)
1199
self._apply_removals(inv, inventory_delta, mover)
1198
self._apply_removals(inventory_delta, mover)
1200
1199
child_pb.update('Apply phase', 1, 2)
1201
modified_paths = self._apply_insertions(inv, inventory_delta,
1200
modified_paths = self._apply_insertions(inventory_delta, mover)
1204
1202
mover.rollback()
1212
1210
self.finalize()
1213
1211
return _TransformResults(modified_paths, self.rename_count)
1215
def _apply_removals(self, inv, inventory_delta, mover):
1213
def _apply_removals(self, inventory_delta, mover):
1216
1214
"""Perform tree operations that remove directory/inventory names.
1218
1216
That is, delete files that are to be deleted, and put any files that
1244
1242
file_id = self._tree.get_root_id()
1246
1244
file_id = self.tree_file_id(trans_id)
1247
if file_id is not None:
1248
inventory_delta.append((path, None, file_id, None))
1245
assert file_id is not None
1246
# File-id isn't really being deleted, just moved
1247
if file_id in self._r_new_id:
1249
inventory_delta.append((path, None, file_id, None))
1250
1251
child_pb.finished()
1252
def _apply_insertions(self, inv, inventory_delta, mover):
1253
def _apply_insertions(self, inventory_delta, mover):
1253
1254
"""Perform tree operations that insert directory/inventory names.
1255
1256
That is, create any files that need to be created, and restore from
1264
1265
for num, (path, trans_id) in enumerate(new_paths):
1265
1266
new_entry = None
1266
1267
child_pb.update('adding file', num, len(new_paths))
1268
kind = self._new_contents[trans_id]
1270
kind = contents = None
1271
1268
if trans_id in self._new_contents or \
1272
1269
self.path_changed(trans_id):
1273
1270
full_path = self._tree.abspath(path)
1283
1280
if trans_id in self._new_contents:
1284
1281
modified_paths.append(full_path)
1285
1282
completed_new.append(trans_id)
1287
if trans_id in self._new_id:
1289
kind = file_kind(self._tree.abspath(path))
1283
file_id = self.final_file_id(trans_id)
1284
if file_id is not None and (trans_id in self._new_id or
1285
trans_id in self._new_name or trans_id in self._new_parent
1286
or trans_id in self._new_executability):
1288
kind = self.final_kind(trans_id)
1290
kind = self._tree.stored_kind(file_id)
1290
1291
if trans_id in self._new_reference_revision:
1291
1292
new_entry = inventory.TreeReference(
1292
self._new_id[trans_id],
1293
self.final_file_id(trans_id),
1293
1294
self._new_name[trans_id],
1294
1295
self.final_file_id(self._new_parent[trans_id]),
1295
1296
None, self._new_reference_revision[trans_id])
1297
1298
new_entry = inventory.make_entry(kind,
1298
1299
self.final_name(trans_id),
1299
1300
self.final_file_id(self.final_parent(trans_id)),
1300
self._new_id[trans_id])
1302
if trans_id in self._new_name or trans_id in\
1303
self._new_parent or\
1304
trans_id in self._new_executability:
1305
file_id = self.final_file_id(trans_id)
1306
if file_id is not None:
1307
entry = inv[file_id]
1308
new_entry = entry.copy()
1310
if trans_id in self._new_name or trans_id in\
1312
if new_entry is not None:
1313
new_entry.name = self.final_name(trans_id)
1314
parent = self.final_parent(trans_id)
1315
parent_id = self.final_file_id(parent)
1316
new_entry.parent_id = parent_id
1301
self.final_file_id(trans_id))
1303
old_path = self._tree.id2path(new_entry.file_id)
1304
except errors.NoSuchId:
1306
inventory_delta.append((old_path, path, new_entry.file_id,
1318
1309
if trans_id in self._new_executability:
1319
1310
self._set_executability(path, new_entry, trans_id)
1320
if new_entry is not None:
1321
if new_entry.file_id in inv:
1322
old_path = inv.id2path(new_entry.file_id)
1325
inventory_delta.append((old_path, path,
1329
1312
child_pb.finished()
1330
1313
for trans_id in completed_new:
1521
1504
def _build_tree(tree, wt, accelerator_tree, hardlink):
1522
1505
"""See build_tree."""
1523
if len(wt.inventory) > 1: # more than just a root
1524
raise errors.WorkingTreeAlreadyPopulated(base=wt.basedir)
1506
for num, _unused in enumerate(wt.all_file_ids()):
1507
if num > 0: # more than just a root
1508
raise errors.WorkingTreeAlreadyPopulated(base=wt.basedir)
1525
1509
file_trans_id = {}
1526
1510
top_pb = bzrlib.ui.ui_factory.nested_progress_bar()
1527
1511
pp = ProgressPhase("Build phase", 2, top_pb)
2056
2040
new_parent_id = tt.new_directory(parent_name + '.new',
2057
2041
parent_parent, parent_file_id)
2058
2042
_reparent_transform_children(tt, parent_id, new_parent_id)
2059
tt.unversion_file(parent_id)
2043
if parent_file_id is not None:
2044
tt.unversion_file(parent_id)
2060
2045
new_conflicts.add((c_type, 'Created directory', new_parent_id))
2061
2046
return new_conflicts