522
524
for parent_id in parents:
523
525
merge_content = self._get_content(parent_id, parent_texts)
524
seq = KnitSequenceMatcher(None, merge_content.text(), content.text())
526
seq = patiencediff.PatienceSequenceMatcher(
527
None, merge_content.text(), content.text())
525
528
if delta_seq is None:
526
529
# setup a delta seq to reuse.
538
541
reference_content = self._get_content(parents[0], parent_texts)
539
542
new_texts = content.text()
540
543
old_texts = reference_content.text()
541
delta_seq = KnitSequenceMatcher(None, old_texts, new_texts)
544
delta_seq = patiencediff.PatienceSequenceMatcher(
545
None, old_texts, new_texts)
542
546
return self._make_line_delta(delta_seq, content)
544
548
def _make_line_delta(self, delta_seq, new_content):
798
802
text_map[version_id] = text
799
803
return text_map, final_content
801
def iter_lines_added_or_present_in_versions(self, version_ids=None):
805
def iter_lines_added_or_present_in_versions(self, version_ids=None,
802
807
"""See VersionedFile.iter_lines_added_or_present_in_versions()."""
803
808
if version_ids is None:
804
809
version_ids = self.versions()
811
pb = progress.DummyProgress()
805
812
# we don't care about inclusions, the caller cares.
806
813
# but we need to setup a list of records to visit.
807
814
# we need version_id, position, length
819
826
data_pos, length = self._index.get_position(version_id)
820
827
version_id_records.append((version_id, data_pos, length))
822
pb = bzrlib.ui.ui_factory.nested_progress_bar()
824
830
total = len(version_id_records)
831
pb.update('Walking content.', count, total)
832
for version_id, data, sha_value in \
833
self._data.read_records_iter(version_id_records):
826
834
pb.update('Walking content.', count, total)
827
for version_id, data, sha_value in \
828
self._data.read_records_iter(version_id_records):
829
pb.update('Walking content.', count, total)
830
method = self._index.get_method(version_id)
831
version_idx = self._index.lookup(version_id)
832
assert method in ('fulltext', 'line-delta')
833
if method == 'fulltext':
834
content = self.factory.parse_fulltext(data, version_idx)
835
for line in content.text():
835
method = self._index.get_method(version_id)
836
version_idx = self._index.lookup(version_id)
837
assert method in ('fulltext', 'line-delta')
838
if method == 'fulltext':
839
content = self.factory.parse_fulltext(data, version_idx)
840
for line in content.text():
843
delta = self.factory.parse_line_delta(data, version_idx)
844
for start, end, count, lines in delta:
845
for origin, line in lines:
838
delta = self.factory.parse_line_delta(data, version_idx)
839
for start, end, count, lines in delta:
840
for origin, line in lines:
843
pb.update('Walking content.', total, total)
846
pb.update('Walking content.', total, total)
848
pb.update('Walking content.', total, total)
850
850
def num_versions(self):
851
851
"""See VersionedFile.num_versions()."""
1258
1258
encode_utf8 = cache_utf8.encode
1259
for version_id, options, pos, size, parents in versions:
1260
line = "\n%s %s %s %s %s :" % (encode_utf8(version_id),
1264
self._version_list_to_index(parents))
1265
assert isinstance(line, str), \
1266
'content must be utf-8 encoded: %r' % (line,)
1268
if not self._need_to_create:
1269
self._transport.append_bytes(self._filename, ''.join(lines))
1272
sio.write(self.HEADER)
1273
sio.writelines(lines)
1275
self._transport.put_file_non_atomic(self._filename, sio,
1276
create_parent_dir=self._create_parent_dir,
1277
mode=self._file_mode,
1278
dir_mode=self._dir_mode)
1279
self._need_to_create = False
1281
# cache after writing, so that a failed write leads to missing cache
1282
# entries not extra ones. XXX TODO: RBC 20060502 in the event of a
1283
# failure, reload the index or flush it or some such, to prevent
1284
# writing records that did complete twice.
1285
for version_id, options, pos, size, parents in versions:
1286
self._cache_version(version_id, options, pos, size, parents)
1259
orig_history = self._history[:]
1260
orig_cache = self._cache.copy()
1263
for version_id, options, pos, size, parents in versions:
1264
line = "\n%s %s %s %s %s :" % (encode_utf8(version_id),
1268
self._version_list_to_index(parents))
1269
assert isinstance(line, str), \
1270
'content must be utf-8 encoded: %r' % (line,)
1272
self._cache_version(version_id, options, pos, size, parents)
1273
if not self._need_to_create:
1274
self._transport.append_bytes(self._filename, ''.join(lines))
1277
sio.write(self.HEADER)
1278
sio.writelines(lines)
1280
self._transport.put_file_non_atomic(self._filename, sio,
1281
create_parent_dir=self._create_parent_dir,
1282
mode=self._file_mode,
1283
dir_mode=self._dir_mode)
1284
self._need_to_create = False
1286
# If any problems happen, restore the original values and re-raise
1287
self._history = orig_history
1288
self._cache = orig_cache
1288
1291
def has_version(self, version_id):
1289
1292
"""True if the version is in the index."""
1290
1293
return (version_id in self._cache)