523
524
for parent_id in parents:
524
525
merge_content = self._get_content(parent_id, parent_texts)
525
seq = KnitSequenceMatcher(None, merge_content.text(), content.text())
526
seq = patiencediff.PatienceSequenceMatcher(
527
None, merge_content.text(), content.text())
526
528
if delta_seq is None:
527
529
# setup a delta seq to reuse.
539
541
reference_content = self._get_content(parents[0], parent_texts)
540
542
new_texts = content.text()
541
543
old_texts = reference_content.text()
542
delta_seq = KnitSequenceMatcher(None, old_texts, new_texts)
544
delta_seq = patiencediff.PatienceSequenceMatcher(
545
None, old_texts, new_texts)
543
546
return self._make_line_delta(delta_seq, content)
545
548
def _make_line_delta(self, delta_seq, new_content):
1255
1258
encode_utf8 = cache_utf8.encode
1256
for version_id, options, pos, size, parents in versions:
1257
line = "\n%s %s %s %s %s :" % (encode_utf8(version_id),
1261
self._version_list_to_index(parents))
1262
assert isinstance(line, str), \
1263
'content must be utf-8 encoded: %r' % (line,)
1265
if not self._need_to_create:
1266
self._transport.append_bytes(self._filename, ''.join(lines))
1269
sio.write(self.HEADER)
1270
sio.writelines(lines)
1272
self._transport.put_file_non_atomic(self._filename, sio,
1273
create_parent_dir=self._create_parent_dir,
1274
mode=self._file_mode,
1275
dir_mode=self._dir_mode)
1276
self._need_to_create = False
1278
# cache after writing, so that a failed write leads to missing cache
1279
# entries not extra ones. XXX TODO: RBC 20060502 in the event of a
1280
# failure, reload the index or flush it or some such, to prevent
1281
# writing records that did complete twice.
1282
for version_id, options, pos, size, parents in versions:
1283
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
1285
1291
def has_version(self, version_id):
1286
1292
"""True if the version is in the index."""
1287
1293
return (version_id in self._cache)