/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

New approach to revert

Show diffs side-by-side

added added

removed removed

Lines of Context:
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)
678
678
 
679
679
 
680
680
def revert(working_tree, target_tree):
681
681
    tt = TreeTransform(working_tree)
682
682
    try:
683
 
        delta = compare_trees(target_tree, working_tree)
684
 
        new_ids = {}
685
 
        for path, file_id, kind in delta.added:
686
 
            trans_id = tt.get_tree_path_id(path)
687
 
            tt.unversion_file(trans_id)
688
 
 
689
 
        for path, file_id, kind in delta.removed:
690
 
            entry = target_tree.inventory[file_id]
 
683
        trans_id = {}
 
684
        def get_trans_id(file_id):
691
685
            try:
692
 
                parent_id = new_ids[entry.parent_id]
 
686
                return trans_id[file_id]
693
687
            except KeyError:
694
 
                parent_id = tt.get_id_tree(entry.parent_id)
695
 
            trans_id = tt.get_id_tree(file_id)
696
 
            if trans_id is None:
697
 
                new_ids[entry.file_id] = new_by_entry(tt, entry, parent_id, 
698
 
                                                      target_tree)
 
688
                return tt.get_id_tree(file_id)
 
689
 
 
690
        for file_id in topology_sorted_ids(target_tree):
 
691
            if file_id == target_tree.inventory.root:
 
692
                continue
 
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
699
698
            else:
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)
704
 
 
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:
712
 
                if kind == "file":
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:
 
702
                    adjust_path  = True
 
703
                else:
 
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:
 
707
                        adjust_path = True
 
708
                    else:
 
709
                        adjust_path = False
 
710
                if adjust_path:
 
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),
 
715
                                           working_tree)
 
716
                if entry.kind != cur_entry.kind:
 
717
                    contents_mod, meta_mod = (True, False)
 
718
                else:
 
719
                    contents_mod, meta_mod = entry.detect_changes(cur_entry)
 
720
                if contents_mod:
 
721
                    tt.delete_contents(e_trans_id)
 
722
                    create_by_entry(tt, entry, target_tree, e_trans_id)
 
723
                elif meta_mod:
 
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)
715
729
        tt.apply()
716
730
    finally:
717
731
        tt.finalize()
 
732
 
 
733
def resolve_conflicts(tt):
 
734
    for conflict in tt.find_conflicts():
 
735
        if conflict[0] == 'duplicate id':
 
736
            tt.unversion_file(conflict[1])