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)
1002
1002
to_executable = False
1003
1003
return to_name, to_parent, to_kind, to_executable
1005
def _iter_changes(self):
1006
"""Produce output in the same format as Tree._iter_changes.
1005
def iter_changes(self):
1006
"""Produce output in the same format as Tree.iter_changes.
1008
1008
Will produce nonsensical results if invoked while inventory/filesystem
1009
1009
conflicts (as reported by TreeTransform.find_conflicts()) are present.
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:
1389
1372
def unlock(self):
1392
def _iter_changes(self, from_tree, include_unchanged=False,
1375
def iter_changes(self, from_tree, include_unchanged=False,
1393
1376
specific_files=None, pb=None, extra_trees=None,
1394
1377
require_versioned=True, want_unversioned=False):
1395
"""See InterTree._iter_changes.
1378
"""See InterTree.iter_changes.
1397
1380
This implementation does not support include_unchanged, specific_files,
1398
1381
or want_unversioned. extra_trees, require_versioned, and pb are
1406
1389
raise ValueError('specific_files is not supported')
1407
1390
if want_unversioned:
1408
1391
raise ValueError('want_unversioned is not supported')
1409
return self._transform._iter_changes()
1392
return self._transform.iter_changes()
1411
1394
def kind(self, file_id):
1412
1395
trans_id = self._transform.trans_id_file_id(file_id)
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)
1624
1608
if accelerator_tree is None:
1625
1609
new_desired_files = desired_files
1627
iter = accelerator_tree._iter_changes(tree, include_unchanged=True)
1611
iter = accelerator_tree.iter_changes(tree, include_unchanged=True)
1628
1612
unchanged = dict((f, p[1]) for (f, p, c, v, d, n, k, e)
1629
1613
in iter if not (c or e[0] != e[1]))
1630
1614
new_desired_files = []
1660
1644
by_parent = tt.by_parent()
1661
1645
for child in by_parent[old_parent]:
1662
1646
tt.adjust_path(tt.final_name(child), new_parent, child)
1647
return by_parent[old_parent]
1664
1649
def _content_match(tree, entry, file_id, kind, target_path):
1665
1650
if entry.kind != kind:
1872
1857
if change_reporter:
1873
1858
change_reporter = delta._ChangeReporter(
1874
1859
unversioned_filter=working_tree.is_ignored)
1875
delta.report_changes(tt._iter_changes(), change_reporter)
1860
delta.report_changes(tt.iter_changes(), change_reporter)
1876
1861
for conflict in conflicts:
1877
1862
warning(conflict)
1878
1863
pp.next_phase()
1888
1873
def _alter_files(working_tree, target_tree, tt, pb, specific_files,
1890
1875
merge_modified = working_tree.merge_modified()
1891
change_list = target_tree._iter_changes(working_tree,
1876
change_list = target_tree.iter_changes(working_tree,
1892
1877
specific_files=specific_files, pb=pb)
1893
1878
if target_tree.inventory.root is None:
1894
1879
skip_root = True
2035
2020
new_conflicts.add(('deleting parent', 'Not deleting',
2037
2022
except KeyError:
2038
tt.create_directory(trans_id)
2039
new_conflicts.add((c_type, 'Created directory', trans_id))
2041
2025
tt.final_name(trans_id)
2042
2026
except NoFinalPath:
2043
2027
if path_tree is not None:
2044
2028
file_id = tt.final_file_id(trans_id)
2030
file_id = tt.inactive_file_id(trans_id)
2045
2031
entry = path_tree.inventory[file_id]
2046
parent_trans_id = tt.trans_id_file_id(entry.parent_id)
2047
tt.adjust_path(entry.name, parent_trans_id, trans_id)
2032
# special-case the other tree root (move its
2033
# children to current root)
2034
if entry.parent_id is None:
2036
moved = _reparent_transform_children(
2037
tt, trans_id, tt.root)
2039
new_conflicts.add((c_type, 'Moved to root',
2042
parent_trans_id = tt.trans_id_file_id(
2044
tt.adjust_path(entry.name, parent_trans_id,
2047
tt.create_directory(trans_id)
2048
new_conflicts.add((c_type, 'Created directory', trans_id))
2048
2049
elif c_type == 'unversioned parent':
2049
tt.version_file(tt.inactive_file_id(conflict[1]), conflict[1])
2050
file_id = tt.inactive_file_id(conflict[1])
2051
# special-case the other tree root (move its children instead)
2052
if path_tree and file_id in path_tree:
2053
if path_tree.inventory[file_id].parent_id is None:
2055
tt.version_file(file_id, conflict[1])
2050
2056
new_conflicts.add((c_type, 'Versioned directory', conflict[1]))
2051
2057
elif c_type == 'non-directory parent':
2052
2058
parent_id = conflict[1]
2056
2062
new_parent_id = tt.new_directory(parent_name + '.new',
2057
2063
parent_parent, parent_file_id)
2058
2064
_reparent_transform_children(tt, parent_id, new_parent_id)
2059
tt.unversion_file(parent_id)
2065
if parent_file_id is not None:
2066
tt.unversion_file(parent_id)
2060
2067
new_conflicts.add((c_type, 'Created directory', new_parent_id))
2061
2068
return new_conflicts