~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weave.py

  • Committer: Martin Pool
  • Date: 2006-03-06 11:20:10 UTC
  • mfrom: (1593 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1611.
  • Revision ID: mbp@sourcefrog.net-20060306112010-17c0170dde5d1eea
[merge] large merge to sync with bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
279
279
 
280
280
        # if we abort after here the (in-memory) weave will be corrupt because only
281
281
        # some fields are updated
 
282
        # XXX: FIXME implement a succeed-or-fail of the rest of this routine.
 
283
        #      - Robert Collins 20060226
282
284
        self._parents.append(parents[:])
283
285
        self._sha1s.append(sha1)
284
286
        self._names.append(name)
318
320
        # another small special case: a merge, producing the same text
319
321
        # as auto-merge
320
322
        if text == basis_lines:
321
 
            return new_version            
 
323
            return new_version
322
324
 
323
325
        # add a sentinal, because we can also match against the final line
324
326
        basis_lineno.append(len(self._weave))
746
748
 
747
749
 
748
750
 
749
 
    def weave_merge(self, plan):
 
751
    def weave_merge(self, plan, a_marker='<<<<<<< \n', b_marker='>>>>>>> \n'):
750
752
        lines_a = []
751
753
        lines_b = []
752
754
        ch_a = ch_b = False
768
770
                elif lines_a == lines_b:
769
771
                    for l in lines_a: yield l
770
772
                else:
771
 
                    yield '<<<<<<<\n'
 
773
                    yield a_marker
772
774
                    for l in lines_a: yield l
773
775
                    yield '=======\n'
774
776
                    for l in lines_b: yield l
775
 
                    yield '>>>>>>>\n'
 
777
                    yield b_marker
776
778
 
777
779
                del lines_a[:]
778
780
                del lines_b[:]
819
821
        # two loops so that we do not change ourselves before verifying it
820
822
        # will be ok
821
823
        # work through in index order to make sure we get all dependencies
 
824
        names_to_join = []
 
825
        processed = 0
822
826
        for other_idx, name in enumerate(other._names):
823
827
            self._check_version_consistent(other, other_idx, name)
 
828
            sha1 = other._sha1s[other_idx]
 
829
 
 
830
            processed += 1
 
831
 
 
832
            if name in self._name_map:
 
833
                idx = self.lookup(name)
 
834
                n1 = set(map(other.idx_to_name, other._parents[other_idx]))
 
835
                n2 = set(map(self.idx_to_name, self._parents[idx]))
 
836
                if sha1 ==  self._sha1s[idx] and n1 == n2:
 
837
                        continue
 
838
 
 
839
            names_to_join.append((other_idx, name))
824
840
 
825
841
        if pb and not msg:
826
842
            msg = 'weave join'
827
843
 
828
844
        merged = 0
829
 
        processed = 0
830
845
        time0 = time.time( )
831
 
        for other_idx, name in enumerate(other._names):
 
846
        for other_idx, name in names_to_join:
832
847
            # TODO: If all the parents of the other version are already
833
848
            # present then we can avoid some work by just taking the delta
834
849
            # and adjusting the offsets.
835
850
            new_parents = self._imported_parents(other, other_idx)
836
851
            sha1 = other._sha1s[other_idx]
837
852
 
838
 
            processed += 1
839
 
 
840
 
            if name in self._name_map:
841
 
                idx = self.lookup(name)
842
 
                n1 = set(map(other.idx_to_name, other._parents[other_idx]))
843
 
                n2 = set(map(self.idx_to_name, self._parents[idx]))
844
 
                if sha1 ==  self._sha1s[idx] and n1 == n2:
845
 
                        continue
 
853
            merged += 1
846
854
 
847
855
            if pb:
848
 
                pb.update(msg, other_idx, len(other._names))
 
856
                pb.update(msg, merged, len(names_to_join))
849
857
           
850
 
            merged += 1
851
858
            lines = other.get_lines(other_idx)
852
859
            self.add(name, new_parents, lines, sha1)
853
860
 
854
861
        mutter("merged = %d, processed = %d, file_id=%s; deltat=%d"%(
855
 
                merged,processed,self._weave_name, time.time( )-time0))
856
 
 
857
 
 
858
 
 
 
862
                merged, processed, self._weave_name, time.time( )-time0))
859
863
 
860
864
    def _imported_parents(self, other, other_idx):
861
865
        """Return list of parents in self corresponding to indexes in other."""