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 |