/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

Enhanced conflict resolution.

Show diffs side-by-side

added added

removed removed

Lines of Context:
240
240
            by_parent[parent_id].add(trans_id)
241
241
        return by_parent
242
242
 
 
243
    def path_changed(self, trans_id):
 
244
        return trans_id in self._new_name or trans_id in self._new_parent
 
245
 
243
246
    def find_conflicts(self):
244
247
        """Find any violations of inventory or filesystem invariants"""
245
248
        if self.__done is True:
470
473
                del inv[self.get_tree_file_id(trans_id)]
471
474
            elif trans_id in self._new_name or trans_id in self._new_parent:
472
475
                file_id = self.get_tree_file_id(trans_id)
473
 
                limbo_inv[trans_id] = inv[file_id]
474
 
                del inv[file_id]
 
476
                if file_id is not None:
 
477
                    limbo_inv[trans_id] = inv[file_id]
 
478
                    del inv[file_id]
475
479
 
476
480
    def _apply_insertions(self, inv, limbo_inv):
477
481
        """Perform tree operations that insert directory/inventory names.
798
802
    finally:
799
803
        tt.finalize()
800
804
 
 
805
 
801
806
def resolve_conflicts(tt):
802
 
    for conflict in tt.find_conflicts():
 
807
    """Make many conflict-resolution attempts, but die if they fail"""
 
808
    for n in range(10):
 
809
        conflicts = tt.find_conflicts()
 
810
        if len(conflicts) == 0:
 
811
            return
 
812
        conflict_pass(tt, conflicts)
 
813
    raise MalformedTransaction(conflicts)
 
814
 
 
815
 
 
816
def conflict_pass(tt, conflicts):
 
817
    for conflict in conflicts:
803
818
        if conflict[0] == 'duplicate id':
804
819
            tt.unversion_file(conflict[1])
 
820
        if conflict[0] == 'duplicate':
 
821
            # files that were renamed take precedence
 
822
            new_name = tt.final_name(conflict[1])+'.moved'
 
823
            final_parent = tt.final_parent(conflict[1])
 
824
            if tt.path_changed(conflict[1]):
 
825
                tt.adjust_path(new_name, final_parent, conflict[2])
 
826
            else:
 
827
                tt.adjust_path(new_name, final_parent, conflict[1])