##// END OF EJS Templates
delta-computer: stop explicitly taking file handle...
marmoute -
r51913:509f0f7f default
parent child Browse files
Show More
@@ -2580,11 +2580,6 b' class revlog:'
2580 2580 msg = b'adding revision outside `revlog._writing` context'
2581 2581 raise error.ProgrammingError(msg)
2582 2582
2583 if self._inline:
2584 fh = self._writinghandles[0]
2585 else:
2586 fh = self._writinghandles[1]
2587
2588 2583 btext = [rawtext]
2589 2584
2590 2585 curr = len(self)
@@ -2650,7 +2645,7 b' class revlog:'
2650 2645 flags,
2651 2646 )
2652 2647
2653 deltainfo = deltacomputer.finddeltainfo(revinfo, fh)
2648 deltainfo = deltacomputer.finddeltainfo(revinfo)
2654 2649
2655 2650 compression_mode = COMP_MODE_INLINE
2656 2651 if self._docket is not None:
@@ -2738,7 +2733,7 b' class revlog:'
2738 2733 rawtext = btext[0]
2739 2734
2740 2735 if alwayscache and rawtext is None:
2741 rawtext = deltacomputer.buildtext(revinfo, fh)
2736 rawtext = deltacomputer.buildtext(revinfo)
2742 2737
2743 2738 if type(rawtext) == bytes: # only accept immutable objects
2744 2739 self._revisioncache = (node, curr, rawtext)
@@ -516,7 +516,7 b' def segmentspan(revlog, revs):'
516 516 return end - revlog.start(revs[0])
517 517
518 518
519 def _textfromdelta(fh, revlog, baserev, delta, p1, p2, flags, expectednode):
519 def _textfromdelta(revlog, baserev, delta, p1, p2, flags, expectednode):
520 520 """build full text from a (base, delta) pair and other metadata"""
521 521 # special case deltas which replace entire base; no need to decode
522 522 # base revision. this neatly avoids censored bases, which throw when
@@ -529,7 +529,7 b' def _textfromdelta(fh, revlog, baserev, '
529 529 else:
530 530 # deltabase is rawtext before changed by flag processors, which is
531 531 # equivalent to non-raw text
532 basetext = revlog.revision(baserev, _df=fh)
532 basetext = revlog.revision(baserev)
533 533 fulltext = mdiff.patch(basetext, delta)
534 534
535 535 try:
@@ -1090,12 +1090,10 b' class deltacomputer:'
1090 1090 def _gather_debug(self):
1091 1091 return self._write_debug is not None or self._debug_info is not None
1092 1092
1093 def buildtext(self, revinfo, fh):
1093 def buildtext(self, revinfo):
1094 1094 """Builds a fulltext version of a revision
1095 1095
1096 1096 revinfo: revisioninfo instance that contains all needed info
1097 fh: file handle to either the .i or the .d revlog file,
1098 depending on whether it is inlined or not
1099 1097 """
1100 1098 btext = revinfo.btext
1101 1099 if btext[0] is not None:
@@ -1107,7 +1105,6 b' class deltacomputer:'
1107 1105 delta = cachedelta[1]
1108 1106
1109 1107 fulltext = btext[0] = _textfromdelta(
1110 fh,
1111 1108 revlog,
1112 1109 baserev,
1113 1110 delta,
@@ -1118,21 +1115,21 b' class deltacomputer:'
1118 1115 )
1119 1116 return fulltext
1120 1117
1121 def _builddeltadiff(self, base, revinfo, fh):
1118 def _builddeltadiff(self, base, revinfo):
1122 1119 revlog = self.revlog
1123 t = self.buildtext(revinfo, fh)
1120 t = self.buildtext(revinfo)
1124 1121 if revlog.iscensored(base):
1125 1122 # deltas based on a censored revision must replace the
1126 1123 # full content in one patch, so delta works everywhere
1127 1124 header = mdiff.replacediffheader(revlog.rawsize(base), len(t))
1128 1125 delta = header + t
1129 1126 else:
1130 ptext = revlog.rawdata(base, _df=fh)
1127 ptext = revlog.rawdata(base)
1131 1128 delta = mdiff.textdiff(ptext, t)
1132 1129
1133 1130 return delta
1134 1131
1135 def _builddeltainfo(self, revinfo, base, fh, target_rev=None):
1132 def _builddeltainfo(self, revinfo, base, target_rev=None):
1136 1133 # can we use the cached delta?
1137 1134 revlog = self.revlog
1138 1135 chainbase = revlog.chainbase(base)
@@ -1170,7 +1167,7 b' class deltacomputer:'
1170 1167 if self.revlog._lazydelta and currentbase == base:
1171 1168 delta = revinfo.cachedelta[1]
1172 1169 if delta is None:
1173 delta = self._builddeltadiff(base, revinfo, fh)
1170 delta = self._builddeltadiff(base, revinfo)
1174 1171 if self._debug_search:
1175 1172 msg = b"DBG-DELTAS-SEARCH: uncompressed-delta-size=%d\n"
1176 1173 msg %= len(delta)
@@ -1212,8 +1209,8 b' class deltacomputer:'
1212 1209 snapshotdepth,
1213 1210 )
1214 1211
1215 def _fullsnapshotinfo(self, fh, revinfo, curr):
1216 rawtext = self.buildtext(revinfo, fh)
1212 def _fullsnapshotinfo(self, revinfo, curr):
1213 rawtext = self.buildtext(revinfo)
1217 1214 data = self.revlog.compress(rawtext)
1218 1215 compresseddeltalen = deltalen = dist = len(data[1]) + len(data[0])
1219 1216 deltabase = chainbase = curr
@@ -1231,12 +1228,10 b' class deltacomputer:'
1231 1228 snapshotdepth,
1232 1229 )
1233 1230
1234 def finddeltainfo(self, revinfo, fh, excluded_bases=None, target_rev=None):
1231 def finddeltainfo(self, revinfo, excluded_bases=None, target_rev=None):
1235 1232 """Find an acceptable delta against a candidate revision
1236 1233
1237 1234 revinfo: information about the revision (instance of _revisioninfo)
1238 fh: file handle to either the .i or the .d revlog file,
1239 depending on whether it is inlined or not
1240 1235
1241 1236 Returns the first acceptable candidate revision, as ordered by
1242 1237 _candidategroups
@@ -1296,7 +1291,7 b' class deltacomputer:'
1296 1291 # not calling candelta since only one revision needs test, also to
1297 1292 # avoid overhead fetching flags again.
1298 1293 if not revinfo.textlen or revinfo.flags & REVIDX_RAWTEXT_CHANGING_FLAGS:
1299 deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
1294 deltainfo = self._fullsnapshotinfo(revinfo, target_rev)
1300 1295 if gather_debug:
1301 1296 end = util.timer()
1302 1297 dbg['duration'] = end - start
@@ -1322,7 +1317,7 b' class deltacomputer:'
1322 1317 base = revinfo.cachedelta[0]
1323 1318 if base == nullrev:
1324 1319 dbg_type = b"full"
1325 deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
1320 deltainfo = self._fullsnapshotinfo(revinfo, target_rev)
1326 1321 if gather_debug:
1327 1322 snapshotdepth = 0
1328 1323 elif base not in excluded_bases:
@@ -1474,7 +1469,6 b' class deltacomputer:'
1474 1469 candidatedelta = self._builddeltainfo(
1475 1470 revinfo,
1476 1471 candidaterev,
1477 fh,
1478 1472 target_rev=target_rev,
1479 1473 )
1480 1474 if self._debug_search:
@@ -1505,7 +1499,7 b' class deltacomputer:'
1505 1499
1506 1500 if deltainfo is None:
1507 1501 dbg_type = b"full"
1508 deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
1502 deltainfo = self._fullsnapshotinfo(revinfo, target_rev)
1509 1503 elif deltainfo.snapshotdepth: # pytype: disable=attribute-error
1510 1504 dbg_type = b"snapshot"
1511 1505 else:
@@ -234,7 +234,7 b' def _precompute_rewritten_delta('
234 234 dc = deltas.deltacomputer(revlog)
235 235 rewritten_entries = {}
236 236 first_excl_rev = min(excluded_revs)
237 with revlog.reading(), revlog._segmentfile._open_read() as dfh:
237 with revlog.reading():
238 238 for rev in range(first_excl_rev, len(old_index)):
239 239 if rev in excluded_revs:
240 240 # this revision will be preserved as is, so we don't need to
@@ -261,7 +261,7 b' def _precompute_rewritten_delta('
261 261 flags=entry[ENTRY_DATA_OFFSET] & 0xFFFF,
262 262 )
263 263 d = dc.finddeltainfo(
264 info, dfh, excluded_bases=excluded_revs, target_rev=rev
264 info, excluded_bases=excluded_revs, target_rev=rev
265 265 )
266 266 default_comp = revlog._docket.default_compression_header
267 267 comp_mode, d = deltas.delta_compression(default_comp, d)
@@ -774,13 +774,7 b' def filter_delta_issue6528(revlog, delta'
774 774 (base_rev, delta),
775 775 flags,
776 776 )
777 # cached by the global "writing" context
778 assert revlog._writinghandles is not None
779 if revlog._inline:
780 fh = revlog._writinghandles[0]
781 else:
782 fh = revlog._writinghandles[1]
783 return deltacomputer.buildtext(revinfo, fh)
777 return deltacomputer.buildtext(revinfo)
784 778
785 779 is_affected = _is_revision_affected_fast_inner(
786 780 is_censored,
General Comments 0
You need to be logged in to leave comments. Login now