674
674
elif entry.kind == "symlink":
675
675
tt.create_symlink(entry.target, trans_id)
676
676
elif entry.kind == "directory":
677
tt.create_directory()
677
tt.create_directory(trans_id)
680
680
def revert(working_tree, target_tree):
681
681
tt = TreeTransform(working_tree)
683
delta = compare_trees(target_tree, working_tree)
685
for path, file_id, kind in delta.added:
686
trans_id = tt.get_tree_path_id(path)
687
tt.unversion_file(trans_id)
689
for path, file_id, kind in delta.removed:
690
entry = target_tree.inventory[file_id]
684
def get_trans_id(file_id):
692
parent_id = new_ids[entry.parent_id]
686
return trans_id[file_id]
694
parent_id = tt.get_id_tree(entry.parent_id)
695
trans_id = tt.get_id_tree(file_id)
697
new_ids[entry.file_id] = new_by_entry(tt, entry, parent_id,
688
return tt.get_id_tree(file_id)
690
for file_id in topology_sorted_ids(target_tree):
691
if file_id == target_tree.inventory.root:
693
if file_id not in working_tree:
694
entry = target_tree.inventory[file_id]
695
parent_id = get_trans_id(entry.parent_id)
696
e_trans_id = new_by_entry(tt, entry, parent_id, target_tree)
697
trans_id[file_id] = e_trans_id
700
create_by_entry(tt, entry, target_tree, trans_id)
701
if tt.final_parent(trans_id) != parent_id or\
702
tt.final_name(trans_id) != entry.name:
703
tt.adjust_path(entry.name, parent_id, trans_id)
705
for path, file_id, kind, text_modified, meta_modified in delta.modified:
706
trans_id = tt.get_id_tree(file_id)
707
if text_modified is True:
708
tt.delete_contents(trans_id)
699
e_trans_id = get_trans_id(file_id)
709
700
entry = target_tree.inventory[file_id]
710
create_by_entry(tt, entry, target_tree, trans_id)
711
elif meta_modified is True:
713
entry = target_tree.inventory[file_id]
714
tt.set_executability(entry.executable, trans_id)
701
if tt.final_name(e_trans_id) != entry.name:
704
parent_id = tt.final_parent(e_trans_id)
705
parent_file_id = tt.final_file_id(parent_id)
706
if parent_file_id != entry.parent_id:
711
parent_file_id = get_trans_id(entry.parent_id)
712
tt.adjust_path(entry.name, parent_file_id, e_trans_id)
713
cur_entry = working_tree.inventory[file_id]
714
cur_entry._read_tree_state(working_tree.id2path(file_id),
716
if entry.kind != cur_entry.kind:
717
contents_mod, meta_mod = (True, False)
719
contents_mod, meta_mod = entry.detect_changes(cur_entry)
721
tt.delete_contents(e_trans_id)
722
create_by_entry(tt, entry, target_tree, e_trans_id)
724
tt.set_executability(entry.executable)
725
for file_id in working_tree:
726
if file_id not in target_tree and file_id != target_tree.inventory.root:
727
tt.unversion(tt.get_id_tree(file_id))
728
resolve_conflicts(tt)
733
def resolve_conflicts(tt):
734
for conflict in tt.find_conflicts():
735
if conflict[0] == 'duplicate id':
736
tt.unversion_file(conflict[1])