~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/knit.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-07-19 16:09:34 UTC
  • mfrom: (2520.4.135 bzr.mpbundle)
  • Revision ID: pqm@pqm.ubuntu.com-20070719160934-d51fyijw69oto88p
Add new bundle and merge-directive formats

Show diffs side-by-side

added added

removed removed

Lines of Context:
153
153
    def copy(self):
154
154
        return KnitContent(self._lines[:])
155
155
 
 
156
    @staticmethod
 
157
    def get_line_delta_blocks(knit_delta, source, target):
 
158
        """Extract SequenceMatcher.get_matching_blocks() from a knit delta"""
 
159
        target_len = len(target)
 
160
        s_pos = 0
 
161
        t_pos = 0
 
162
        for s_begin, s_end, t_len, new_text in knit_delta:
 
163
            true_n = s_begin - s_pos
 
164
            n = true_n
 
165
            if n > 0:
 
166
                # knit deltas do not provide reliable info about whether the
 
167
                # last line of a file matches, due to eol handling.
 
168
                if source[s_pos + n -1] != target[t_pos + n -1]:
 
169
                    n-=1
 
170
                if n > 0:
 
171
                    yield s_pos, t_pos, n
 
172
            t_pos += t_len + true_n
 
173
            s_pos = s_end
 
174
        n = target_len - t_pos
 
175
        if n > 0:
 
176
            if source[s_pos + n -1] != target[t_pos + n -1]:
 
177
                n-=1
 
178
            if n > 0:
 
179
                yield s_pos, t_pos, n
 
180
        yield s_pos + (target_len - t_pos), target_len, 0
 
181
 
156
182
 
157
183
class _KnitFactory(object):
158
184
    """Base factory for creating content objects."""
519
545
                                current_values[3],
520
546
                                new_parents)
521
547
 
 
548
    def _extract_blocks(self, version_id, source, target):
 
549
        if self._index.get_method(version_id) != 'line-delta':
 
550
            return None
 
551
        parent, sha1, noeol, delta = self.get_delta(version_id)
 
552
        return KnitContent.get_line_delta_blocks(delta, source, target)
 
553
 
522
554
    def get_delta(self, version_id):
523
555
        """Get a delta for constructing version from some other version."""
524
556
        version_id = osutils.safe_revision_id(version_id)
554
586
        return dict(graph_items)
555
587
 
556
588
    def get_sha1(self, version_id):
 
589
        return self.get_sha1s([version_id])[0]
 
590
 
 
591
    def get_sha1s(self, version_ids):
557
592
        """See VersionedFile.get_sha1()."""
558
 
        version_id = osutils.safe_revision_id(version_id)
559
 
        record_map = self._get_record_map([version_id])
560
 
        method, content, digest, next = record_map[version_id]
561
 
        return digest 
 
593
        version_ids = [osutils.safe_revision_id(v) for v in version_ids]
 
594
        record_map = self._get_record_map(version_ids)
 
595
        # record entry 2 is the 'digest'.
 
596
        return [record_map[v][2] for v in version_ids]
562
597
 
563
598
    @staticmethod
564
599
    def get_suffixes():
812
847
        text_map, content_map = self._get_content_maps(version_ids)
813
848
        return [text_map[v] for v in version_ids]
814
849
 
 
850
    _get_lf_split_line_list = get_line_list
 
851
 
815
852
    def _get_content_maps(self, version_ids):
816
853
        """Produce maps of text and KnitContents
817
854