comparison mercurial/revlogutils/deltas.py @ 51347:670e68729aa7

delta-find: stop using heuristic to determine if we are creating a snapshot This avoid assuming a changeset is a snapshot when it is actually something simpler.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sun, 07 Jan 2024 03:13:36 +0100
parents cc806f20d756
children bbbfa00d1e67
comparison
equal deleted inserted replaced
51346:cc806f20d756 51347:670e68729aa7
1065 if ( 1065 if (
1066 good is not None 1066 good is not None
1067 and good not in (self.p1, self.p2) 1067 and good not in (self.p1, self.p2)
1068 and self.revlog.issnapshot(good) 1068 and self.revlog.issnapshot(good)
1069 ): 1069 ):
1070 self.current_stage = _STAGE_SNAPSHOT 1070 assert self.current_stage == _STAGE_SNAPSHOT
1071 # refine snapshot down 1071 # refine snapshot down
1072 previous = None 1072 previous = None
1073 while previous != good: 1073 while previous != good:
1074 previous = good 1074 previous = good
1075 base = self.revlog.deltaparent(good) 1075 base = self.revlog.deltaparent(good)
1334 ptext = revlog.rawdata(base) 1334 ptext = revlog.rawdata(base)
1335 delta = mdiff.textdiff(ptext, t) 1335 delta = mdiff.textdiff(ptext, t)
1336 1336
1337 return delta 1337 return delta
1338 1338
1339 def _builddeltainfo(self, revinfo, base, target_rev=None): 1339 def _builddeltainfo(
1340 self, revinfo, base, target_rev=None, as_snapshot=False
1341 ):
1340 # can we use the cached delta? 1342 # can we use the cached delta?
1341 revlog = self.revlog 1343 revlog = self.revlog
1342 chainbase = revlog.chainbase(base) 1344 chainbase = revlog.chainbase(base)
1343 if revlog.delta_config.general_delta: 1345 if revlog.delta_config.general_delta:
1344 deltabase = base 1346 deltabase = base
1352 raise error.ProgrammingError(msg) 1354 raise error.ProgrammingError(msg)
1353 deltabase = chainbase 1355 deltabase = chainbase
1354 snapshotdepth = None 1356 snapshotdepth = None
1355 if revlog.delta_config.sparse_revlog and deltabase == nullrev: 1357 if revlog.delta_config.sparse_revlog and deltabase == nullrev:
1356 snapshotdepth = 0 1358 snapshotdepth = 0
1357 elif revlog.delta_config.sparse_revlog and revlog.issnapshot(deltabase): 1359 elif revlog.delta_config.sparse_revlog and as_snapshot:
1360 assert revlog.issnapshot(deltabase)
1358 # A delta chain should always be one full snapshot, 1361 # A delta chain should always be one full snapshot,
1359 # zero or more semi-snapshots, and zero or more deltas 1362 # zero or more semi-snapshots, and zero or more deltas
1360 p1, p2 = revlog.rev(revinfo.p1), revlog.rev(revinfo.p2) 1363 p1, p2 = revlog.rev(revinfo.p1), revlog.rev(revinfo.p2)
1361 if deltabase not in (p1, p2) and revlog.issnapshot(deltabase): 1364 if deltabase not in (p1, p2) and revlog.issnapshot(deltabase):
1362 snapshotdepth = len(revlog._deltachain(deltabase)[0]) 1365 snapshotdepth = len(revlog._deltachain(deltabase)[0])
1677 delta_start = util.timer() 1680 delta_start = util.timer()
1678 candidatedelta = self._builddeltainfo( 1681 candidatedelta = self._builddeltainfo(
1679 revinfo, 1682 revinfo,
1680 candidaterev, 1683 candidaterev,
1681 target_rev=target_rev, 1684 target_rev=target_rev,
1685 as_snapshot=search.current_stage == _STAGE_SNAPSHOT,
1682 ) 1686 )
1683 if self._debug_search: 1687 if self._debug_search:
1684 delta_end = util.timer() 1688 delta_end = util.timer()
1685 msg = b"DBG-DELTAS-SEARCH: delta-search-time=%f\n" 1689 msg = b"DBG-DELTAS-SEARCH: delta-search-time=%f\n"
1686 msg %= delta_end - delta_start 1690 msg %= delta_end - delta_start