mercurial/revlogutils/deltas.py
changeset 50694 a41eeb877d07
parent 50386 e77ca247b85b
child 50698 f1b57672cb94
equal deleted inserted replaced
50693:b9a355763e76 50694:a41eeb877d07
  1085         debug_search=False,
  1085         debug_search=False,
  1086         debug_info=None,
  1086         debug_info=None,
  1087     ):
  1087     ):
  1088         self.revlog = revlog
  1088         self.revlog = revlog
  1089         self._write_debug = write_debug
  1089         self._write_debug = write_debug
  1090         self._debug_search = debug_search
  1090         if write_debug is None:
       
  1091             self._debug_search = False
       
  1092         else:
       
  1093             self._debug_search = debug_search
  1091         self._debug_info = debug_info
  1094         self._debug_info = debug_info
  1092         self._snapshot_cache = SnapshotCache()
  1095         self._snapshot_cache = SnapshotCache()
       
  1096 
       
  1097     @property
       
  1098     def _gather_debug(self):
       
  1099         return self._write_debug is not None or self._debug_info is not None
  1093 
  1100 
  1094     def buildtext(self, revinfo, fh):
  1101     def buildtext(self, revinfo, fh):
  1095         """Builds a fulltext version of a revision
  1102         """Builds a fulltext version of a revision
  1096 
  1103 
  1097         revinfo: revisioninfo instance that contains all needed info
  1104         revinfo: revisioninfo instance that contains all needed info
  1134         return delta
  1141         return delta
  1135 
  1142 
  1136     def _builddeltainfo(self, revinfo, base, fh, target_rev=None):
  1143     def _builddeltainfo(self, revinfo, base, fh, target_rev=None):
  1137         # can we use the cached delta?
  1144         # can we use the cached delta?
  1138         revlog = self.revlog
  1145         revlog = self.revlog
  1139         debug_search = self._write_debug is not None and self._debug_search
       
  1140         chainbase = revlog.chainbase(base)
  1146         chainbase = revlog.chainbase(base)
  1141         if revlog._generaldelta:
  1147         if revlog._generaldelta:
  1142             deltabase = base
  1148             deltabase = base
  1143         else:
  1149         else:
  1144             if target_rev is not None and base != target_rev - 1:
  1150             if target_rev is not None and base != target_rev - 1:
  1171                 currentbase = self.revlog.deltaparent(currentbase)
  1177                 currentbase = self.revlog.deltaparent(currentbase)
  1172             if self.revlog._lazydelta and currentbase == base:
  1178             if self.revlog._lazydelta and currentbase == base:
  1173                 delta = revinfo.cachedelta[1]
  1179                 delta = revinfo.cachedelta[1]
  1174         if delta is None:
  1180         if delta is None:
  1175             delta = self._builddeltadiff(base, revinfo, fh)
  1181             delta = self._builddeltadiff(base, revinfo, fh)
  1176         if debug_search:
  1182         if self._debug_search:
  1177             msg = b"DBG-DELTAS-SEARCH:     uncompressed-delta-size=%d\n"
  1183             msg = b"DBG-DELTAS-SEARCH:     uncompressed-delta-size=%d\n"
  1178             msg %= len(delta)
  1184             msg %= len(delta)
  1179             self._write_debug(msg)
  1185             self._write_debug(msg)
  1180         # snapshotdept need to be neither None nor 0 level snapshot
  1186         # snapshotdept need to be neither None nor 0 level snapshot
  1181         if revlog.upperboundcomp is not None and snapshotdepth:
  1187         if revlog.upperboundcomp is not None and snapshotdepth:
  1182             lowestrealisticdeltalen = len(delta) // revlog.upperboundcomp
  1188             lowestrealisticdeltalen = len(delta) // revlog.upperboundcomp
  1183             snapshotlimit = revinfo.textlen >> snapshotdepth
  1189             snapshotlimit = revinfo.textlen >> snapshotdepth
  1184             if debug_search:
  1190             if self._debug_search:
  1185                 msg = b"DBG-DELTAS-SEARCH:     projected-lower-size=%d\n"
  1191                 msg = b"DBG-DELTAS-SEARCH:     projected-lower-size=%d\n"
  1186                 msg %= lowestrealisticdeltalen
  1192                 msg %= lowestrealisticdeltalen
  1187                 self._write_debug(msg)
  1193                 self._write_debug(msg)
  1188             if snapshotlimit < lowestrealisticdeltalen:
  1194             if snapshotlimit < lowestrealisticdeltalen:
  1189                 if debug_search:
  1195                 if self._debug_search:
  1190                     msg = b"DBG-DELTAS-SEARCH:     DISCARDED (snapshot limit)\n"
  1196                     msg = b"DBG-DELTAS-SEARCH:     DISCARDED (snapshot limit)\n"
  1191                     self._write_debug(msg)
  1197                     self._write_debug(msg)
  1192                 return None
  1198                 return None
  1193             if revlog.length(base) < lowestrealisticdeltalen:
  1199             if revlog.length(base) < lowestrealisticdeltalen:
  1194                 if debug_search:
  1200                 if self._debug_search:
  1195                     msg = b"DBG-DELTAS-SEARCH:     DISCARDED (prev size)\n"
  1201                     msg = b"DBG-DELTAS-SEARCH:     DISCARDED (prev size)\n"
  1196                     self._write_debug(msg)
  1202                     self._write_debug(msg)
  1197                 return None
  1203                 return None
  1198         header, data = revlog.compress(delta)
  1204         header, data = revlog.compress(delta)
  1199         deltalen = len(header) + len(data)
  1205         deltalen = len(header) + len(data)
  1251         context.
  1257         context.
  1252         """
  1258         """
  1253         if target_rev is None:
  1259         if target_rev is None:
  1254             target_rev = len(self.revlog)
  1260             target_rev = len(self.revlog)
  1255 
  1261 
  1256         if not revinfo.textlen:
  1262         gather_debug = self._gather_debug
  1257             return self._fullsnapshotinfo(fh, revinfo, target_rev)
  1263         cachedelta = revinfo.cachedelta
       
  1264         revlog = self.revlog
       
  1265         p1r = p2r = None
  1258 
  1266 
  1259         if excluded_bases is None:
  1267         if excluded_bases is None:
  1260             excluded_bases = set()
  1268             excluded_bases = set()
  1261 
  1269 
  1262         # no delta for flag processor revision (see "candelta" for why)
       
  1263         # not calling candelta since only one revision needs test, also to
       
  1264         # avoid overhead fetching flags again.
       
  1265         if revinfo.flags & REVIDX_RAWTEXT_CHANGING_FLAGS:
       
  1266             return self._fullsnapshotinfo(fh, revinfo, target_rev)
       
  1267 
       
  1268         gather_debug = (
       
  1269             self._write_debug is not None or self._debug_info is not None
       
  1270         )
       
  1271         debug_search = self._write_debug is not None and self._debug_search
       
  1272 
       
  1273         if gather_debug:
  1270         if gather_debug:
  1274             start = util.timer()
  1271             start = util.timer()
  1275 
  1272             dbg = self._one_dbg_data()
  1276         # count the number of different delta we tried (for debug purpose)
  1273             dbg['revision'] = target_rev
  1277         dbg_try_count = 0
  1274             target_revlog = b"UNKNOWN"
  1278         # count the number of "search round" we did. (for debug purpose)
  1275             target_type = self.revlog.target[0]
  1279         dbg_try_rounds = 0
  1276             target_key = self.revlog.target[1]
  1280         dbg_type = b'unknown'
  1277             if target_type == KIND_CHANGELOG:
  1281 
  1278                 target_revlog = b'CHANGELOG:'
  1282         cachedelta = revinfo.cachedelta
  1279             elif target_type == KIND_MANIFESTLOG:
  1283         p1 = revinfo.p1
  1280                 target_revlog = b'MANIFESTLOG:'
  1284         p2 = revinfo.p2
  1281                 if target_key:
  1285         revlog = self.revlog
  1282                     target_revlog += b'%s:' % target_key
  1286 
  1283             elif target_type == KIND_FILELOG:
  1287         deltainfo = None
  1284                 target_revlog = b'FILELOG:'
  1288         p1r, p2r = revlog.rev(p1), revlog.rev(p2)
  1285                 if target_key:
  1289 
  1286                     target_revlog += b'%s:' % target_key
  1290         if gather_debug:
  1287             dbg['target-revlog'] = target_revlog
       
  1288             p1r = revlog.rev(revinfo.p1)
       
  1289             p2r = revlog.rev(revinfo.p2)
  1291             if p1r != nullrev:
  1290             if p1r != nullrev:
  1292                 p1_chain_len = revlog._chaininfo(p1r)[0]
  1291                 p1_chain_len = revlog._chaininfo(p1r)[0]
  1293             else:
  1292             else:
  1294                 p1_chain_len = -1
  1293                 p1_chain_len = -1
  1295             if p2r != nullrev:
  1294             if p2r != nullrev:
  1296                 p2_chain_len = revlog._chaininfo(p2r)[0]
  1295                 p2_chain_len = revlog._chaininfo(p2r)[0]
  1297             else:
  1296             else:
  1298                 p2_chain_len = -1
  1297                 p2_chain_len = -1
  1299         if debug_search:
  1298             dbg['p1-chain-len'] = p1_chain_len
       
  1299             dbg['p2-chain-len'] = p2_chain_len
       
  1300 
       
  1301         # 1) if the revision is empty, no amount of delta can beat it
       
  1302         #
       
  1303         # 2) no delta for flag processor revision (see "candelta" for why)
       
  1304         # not calling candelta since only one revision needs test, also to
       
  1305         # avoid overhead fetching flags again.
       
  1306         if not revinfo.textlen or revinfo.flags & REVIDX_RAWTEXT_CHANGING_FLAGS:
       
  1307             deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
       
  1308             if gather_debug:
       
  1309                 end = util.timer()
       
  1310                 dbg['duration'] = end - start
       
  1311                 dbg[
       
  1312                     'delta-base'
       
  1313                 ] = deltainfo.base  # pytype: disable=attribute-error
       
  1314                 dbg['search_round_count'] = 0
       
  1315                 dbg['using-cached-base'] = False
       
  1316                 dbg['delta_try_count'] = 0
       
  1317                 dbg['type'] = b"full"
       
  1318                 dbg['snapshot-depth'] = 0
       
  1319                 self._dbg_process_data(dbg)
       
  1320             return deltainfo
       
  1321 
       
  1322         deltainfo = None
       
  1323 
       
  1324         # If this source delta are to be forcibly reuse, let us comply early.
       
  1325         if (
       
  1326             revlog._generaldelta
       
  1327             and revinfo.cachedelta is not None
       
  1328             and revinfo.cachedelta[2] == DELTA_BASE_REUSE_FORCE
       
  1329         ):
       
  1330             base = revinfo.cachedelta[0]
       
  1331             if base == nullrev:
       
  1332                 dbg_type = b"full"
       
  1333                 deltainfo = self._fullsnapshotinfo(fh, revinfo, target_rev)
       
  1334                 if gather_debug:
       
  1335                     snapshotdepth = 0
       
  1336             elif base not in excluded_bases:
       
  1337                 delta = revinfo.cachedelta[1]
       
  1338                 header, data = revlog.compress(delta)
       
  1339                 deltalen = len(header) + len(data)
       
  1340                 if gather_debug:
       
  1341                     offset = revlog.end(len(revlog) - 1)
       
  1342                     chainbase = revlog.chainbase(base)
       
  1343                     distance = deltalen + offset - revlog.start(chainbase)
       
  1344                     chainlen, compresseddeltalen = revlog._chaininfo(base)
       
  1345                     chainlen += 1
       
  1346                     compresseddeltalen += deltalen
       
  1347                     if base == p1r or base == p2r:
       
  1348                         dbg_type = b"delta"
       
  1349                         snapshotdepth = None
       
  1350                     elif not revlog.issnapshot(base):
       
  1351                         snapshotdepth = None
       
  1352                     else:
       
  1353                         dbg_type = b"snapshot"
       
  1354                         snapshotdepth = revlog.snapshotdepth(base) + 1
       
  1355                 else:
       
  1356                     distance = None
       
  1357                     chainbase = None
       
  1358                     chainlen = None
       
  1359                     compresseddeltalen = None
       
  1360                     snapshotdepth = None
       
  1361                 deltainfo = _deltainfo(
       
  1362                     distance=distance,
       
  1363                     deltalen=deltalen,
       
  1364                     data=(header, data),
       
  1365                     base=base,
       
  1366                     chainbase=chainbase,
       
  1367                     chainlen=chainlen,
       
  1368                     compresseddeltalen=compresseddeltalen,
       
  1369                     snapshotdepth=snapshotdepth,
       
  1370                 )
       
  1371 
       
  1372             if deltainfo is not None:
       
  1373                 if gather_debug:
       
  1374                     end = util.timer()
       
  1375                     dbg['duration'] = end - start
       
  1376                     dbg[
       
  1377                         'delta-base'
       
  1378                     ] = deltainfo.base  # pytype: disable=attribute-error
       
  1379                     dbg['search_round_count'] = 0
       
  1380                     dbg['using-cached-base'] = True
       
  1381                     dbg['delta_try_count'] = 0
       
  1382                     dbg['type'] = b"full"
       
  1383                     if snapshotdepth is None:
       
  1384                         dbg['snapshot-depth'] = 0
       
  1385                     else:
       
  1386                         dbg['snapshot-depth'] = snapshotdepth
       
  1387                     self._dbg_process_data(dbg)
       
  1388                 return deltainfo
       
  1389 
       
  1390         # count the number of different delta we tried (for debug purpose)
       
  1391         dbg_try_count = 0
       
  1392         # count the number of "search round" we did. (for debug purpose)
       
  1393         dbg_try_rounds = 0
       
  1394         dbg_type = b'unknown'
       
  1395 
       
  1396         if p1r is None:
       
  1397             p1r = revlog.rev(revinfo.p1)
       
  1398             p2r = revlog.rev(revinfo.p2)
       
  1399 
       
  1400         if self._debug_search:
  1300             msg = b"DBG-DELTAS-SEARCH: SEARCH rev=%d\n"
  1401             msg = b"DBG-DELTAS-SEARCH: SEARCH rev=%d\n"
  1301             msg %= target_rev
  1402             msg %= target_rev
  1302             self._write_debug(msg)
  1403             self._write_debug(msg)
  1303 
  1404 
  1304         groups = _candidategroups(
  1405         groups = _candidategroups(
  1312             snapshot_cache=self._snapshot_cache,
  1413             snapshot_cache=self._snapshot_cache,
  1313         )
  1414         )
  1314         candidaterevs = next(groups)
  1415         candidaterevs = next(groups)
  1315         while candidaterevs is not None:
  1416         while candidaterevs is not None:
  1316             dbg_try_rounds += 1
  1417             dbg_try_rounds += 1
  1317             if debug_search:
  1418             if self._debug_search:
  1318                 prev = None
  1419                 prev = None
  1319                 if deltainfo is not None:
  1420                 if deltainfo is not None:
  1320                     prev = deltainfo.base
  1421                     prev = deltainfo.base
  1321 
  1422 
  1322                 if (
  1423                 if (
  1323                     cachedelta is not None
  1424                     cachedelta is not None
  1324                     and len(candidaterevs) == 1
  1425                     and len(candidaterevs) == 1
  1325                     and cachedelta[0] in candidaterevs
  1426                     and cachedelta[0] in candidaterevs
  1326                 ):
  1427                 ):
  1327                     round_type = b"cached-delta"
  1428                     round_type = b"cached-delta"
  1328                 elif p1 in candidaterevs or p2 in candidaterevs:
  1429                 elif p1r in candidaterevs or p2r in candidaterevs:
  1329                     round_type = b"parents"
  1430                     round_type = b"parents"
  1330                 elif prev is not None and all(c < prev for c in candidaterevs):
  1431                 elif prev is not None and all(c < prev for c in candidaterevs):
  1331                     round_type = b"refine-down"
  1432                     round_type = b"refine-down"
  1332                 elif prev is not None and all(c > prev for c in candidaterevs):
  1433                 elif prev is not None and all(c > prev for c in candidaterevs):
  1333                     round_type = b"refine-up"
  1434                     round_type = b"refine-up"
  1336                 msg = b"DBG-DELTAS-SEARCH: ROUND #%d - %d candidates - %s\n"
  1437                 msg = b"DBG-DELTAS-SEARCH: ROUND #%d - %d candidates - %s\n"
  1337                 msg %= (dbg_try_rounds, len(candidaterevs), round_type)
  1438                 msg %= (dbg_try_rounds, len(candidaterevs), round_type)
  1338                 self._write_debug(msg)
  1439                 self._write_debug(msg)
  1339             nominateddeltas = []
  1440             nominateddeltas = []
  1340             if deltainfo is not None:
  1441             if deltainfo is not None:
  1341                 if debug_search:
  1442                 if self._debug_search:
  1342                     msg = (
  1443                     msg = (
  1343                         b"DBG-DELTAS-SEARCH:   CONTENDER: rev=%d - length=%d\n"
  1444                         b"DBG-DELTAS-SEARCH:   CONTENDER: rev=%d - length=%d\n"
  1344                     )
  1445                     )
  1345                     msg %= (deltainfo.base, deltainfo.deltalen)
  1446                     msg %= (deltainfo.base, deltainfo.deltalen)
  1346                     self._write_debug(msg)
  1447                     self._write_debug(msg)
  1347                 # if we already found a good delta,
  1448                 # if we already found a good delta,
  1348                 # challenge it against refined candidates
  1449                 # challenge it against refined candidates
  1349                 nominateddeltas.append(deltainfo)
  1450                 nominateddeltas.append(deltainfo)
  1350             for candidaterev in candidaterevs:
  1451             for candidaterev in candidaterevs:
  1351                 if debug_search:
  1452                 if self._debug_search:
  1352                     msg = b"DBG-DELTAS-SEARCH:   CANDIDATE: rev=%d\n"
  1453                     msg = b"DBG-DELTAS-SEARCH:   CANDIDATE: rev=%d\n"
  1353                     msg %= candidaterev
  1454                     msg %= candidaterev
  1354                     self._write_debug(msg)
  1455                     self._write_debug(msg)
  1355                     candidate_type = None
  1456                     candidate_type = None
  1356                     if candidaterev == p1:
  1457                     if candidaterev == p1r:
  1357                         candidate_type = b"p1"
  1458                         candidate_type = b"p1"
  1358                     elif candidaterev == p2:
  1459                     elif candidaterev == p2r:
  1359                         candidate_type = b"p2"
  1460                         candidate_type = b"p2"
  1360                     elif self.revlog.issnapshot(candidaterev):
  1461                     elif self.revlog.issnapshot(candidaterev):
  1361                         candidate_type = b"snapshot-%d"
  1462                         candidate_type = b"snapshot-%d"
  1362                         candidate_type %= self.revlog.snapshotdepth(
  1463                         candidate_type %= self.revlog.snapshotdepth(
  1363                             candidaterev
  1464                             candidaterev
  1374                     msg %= self.revlog.deltaparent(candidaterev)
  1475                     msg %= self.revlog.deltaparent(candidaterev)
  1375                     self._write_debug(msg)
  1476                     self._write_debug(msg)
  1376 
  1477 
  1377                 dbg_try_count += 1
  1478                 dbg_try_count += 1
  1378 
  1479 
  1379                 if debug_search:
  1480                 if self._debug_search:
  1380                     delta_start = util.timer()
  1481                     delta_start = util.timer()
  1381                 candidatedelta = self._builddeltainfo(
  1482                 candidatedelta = self._builddeltainfo(
  1382                     revinfo,
  1483                     revinfo,
  1383                     candidaterev,
  1484                     candidaterev,
  1384                     fh,
  1485                     fh,
  1385                     target_rev=target_rev,
  1486                     target_rev=target_rev,
  1386                 )
  1487                 )
  1387                 if debug_search:
  1488                 if self._debug_search:
  1388                     delta_end = util.timer()
  1489                     delta_end = util.timer()
  1389                     msg = b"DBG-DELTAS-SEARCH:     delta-search-time=%f\n"
  1490                     msg = b"DBG-DELTAS-SEARCH:     delta-search-time=%f\n"
  1390                     msg %= delta_end - delta_start
  1491                     msg %= delta_end - delta_start
  1391                     self._write_debug(msg)
  1492                     self._write_debug(msg)
  1392                 if candidatedelta is not None:
  1493                 if candidatedelta is not None:
  1393                     if is_good_delta_info(self.revlog, candidatedelta, revinfo):
  1494                     if is_good_delta_info(self.revlog, candidatedelta, revinfo):
  1394                         if debug_search:
  1495                         if self._debug_search:
  1395                             msg = b"DBG-DELTAS-SEARCH:     DELTA: length=%d (GOOD)\n"
  1496                             msg = b"DBG-DELTAS-SEARCH:     DELTA: length=%d (GOOD)\n"
  1396                             msg %= candidatedelta.deltalen
  1497                             msg %= candidatedelta.deltalen
  1397                             self._write_debug(msg)
  1498                             self._write_debug(msg)
  1398                         nominateddeltas.append(candidatedelta)
  1499                         nominateddeltas.append(candidatedelta)
  1399                     elif debug_search:
  1500                     elif self._debug_search:
  1400                         msg = b"DBG-DELTAS-SEARCH:     DELTA: length=%d (BAD)\n"
  1501                         msg = b"DBG-DELTAS-SEARCH:     DELTA: length=%d (BAD)\n"
  1401                         msg %= candidatedelta.deltalen
  1502                         msg %= candidatedelta.deltalen
  1402                         self._write_debug(msg)
  1503                         self._write_debug(msg)
  1403                 elif debug_search:
  1504                 elif self._debug_search:
  1404                     msg = b"DBG-DELTAS-SEARCH:     NO-DELTA\n"
  1505                     msg = b"DBG-DELTAS-SEARCH:     NO-DELTA\n"
  1405                     self._write_debug(msg)
  1506                     self._write_debug(msg)
  1406             if nominateddeltas:
  1507             if nominateddeltas:
  1407                 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen)
  1508                 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen)
  1408             if deltainfo is not None:
  1509             if deltainfo is not None:
  1432                     cachedelta is not None
  1533                     cachedelta is not None
  1433                     and dbg_try_rounds == 1
  1534                     and dbg_try_rounds == 1
  1434                     and dbg_try_count == 1
  1535                     and dbg_try_count == 1
  1435                     and deltainfo.base == cachedelta[0]
  1536                     and deltainfo.base == cachedelta[0]
  1436                 )
  1537                 )
  1437             dbg = {
  1538             dbg['duration'] = end - start
  1438                 'duration': end - start,
  1539             dbg[
  1439                 'revision': target_rev,
  1540                 'delta-base'
  1440                 'delta-base': deltainfo.base,  # pytype: disable=attribute-error
  1541             ] = deltainfo.base  # pytype: disable=attribute-error
  1441                 'search_round_count': dbg_try_rounds,
  1542             dbg['search_round_count'] = dbg_try_rounds
  1442                 'using-cached-base': used_cached,
  1543             dbg['using-cached-base'] = used_cached
  1443                 'delta_try_count': dbg_try_count,
  1544             dbg['delta_try_count'] = dbg_try_count
  1444                 'type': dbg_type,
  1545             dbg['type'] = dbg_type
  1445                 'p1-chain-len': p1_chain_len,
       
  1446                 'p2-chain-len': p2_chain_len,
       
  1447             }
       
  1448             if (
  1546             if (
  1449                 deltainfo.snapshotdepth  # pytype: disable=attribute-error
  1547                 deltainfo.snapshotdepth  # pytype: disable=attribute-error
  1450                 is not None
  1548                 is not None
  1451             ):
  1549             ):
  1452                 dbg[
  1550                 dbg[
  1453                     'snapshot-depth'
  1551                     'snapshot-depth'
  1454                 ] = deltainfo.snapshotdepth  # pytype: disable=attribute-error
  1552                 ] = deltainfo.snapshotdepth  # pytype: disable=attribute-error
  1455             else:
  1553             else:
  1456                 dbg['snapshot-depth'] = 0
  1554                 dbg['snapshot-depth'] = 0
  1457             target_revlog = b"UNKNOWN"
  1555             self._dbg_process_data(dbg)
  1458             target_type = self.revlog.target[0]
       
  1459             target_key = self.revlog.target[1]
       
  1460             if target_type == KIND_CHANGELOG:
       
  1461                 target_revlog = b'CHANGELOG:'
       
  1462             elif target_type == KIND_MANIFESTLOG:
       
  1463                 target_revlog = b'MANIFESTLOG:'
       
  1464                 if target_key:
       
  1465                     target_revlog += b'%s:' % target_key
       
  1466             elif target_type == KIND_FILELOG:
       
  1467                 target_revlog = b'FILELOG:'
       
  1468                 if target_key:
       
  1469                     target_revlog += b'%s:' % target_key
       
  1470             dbg['target-revlog'] = target_revlog
       
  1471 
       
  1472             if self._debug_info is not None:
       
  1473                 self._debug_info.append(dbg)
       
  1474 
       
  1475             if self._write_debug is not None:
       
  1476                 msg = (
       
  1477                     b"DBG-DELTAS:"
       
  1478                     b" %-12s"
       
  1479                     b" rev=%d:"
       
  1480                     b" delta-base=%d"
       
  1481                     b" is-cached=%d"
       
  1482                     b" - search-rounds=%d"
       
  1483                     b" try-count=%d"
       
  1484                     b" - delta-type=%-6s"
       
  1485                     b" snap-depth=%d"
       
  1486                     b" - p1-chain-length=%d"
       
  1487                     b" p2-chain-length=%d"
       
  1488                     b" - duration=%f"
       
  1489                     b"\n"
       
  1490                 )
       
  1491                 msg %= (
       
  1492                     dbg["target-revlog"],
       
  1493                     dbg["revision"],
       
  1494                     dbg["delta-base"],
       
  1495                     dbg["using-cached-base"],
       
  1496                     dbg["search_round_count"],
       
  1497                     dbg["delta_try_count"],
       
  1498                     dbg["type"],
       
  1499                     dbg["snapshot-depth"],
       
  1500                     dbg["p1-chain-len"],
       
  1501                     dbg["p2-chain-len"],
       
  1502                     dbg["duration"],
       
  1503                 )
       
  1504                 self._write_debug(msg)
       
  1505         return deltainfo
  1556         return deltainfo
       
  1557 
       
  1558     def _one_dbg_data(self):
       
  1559         return {
       
  1560             'duration': None,
       
  1561             'revision': None,
       
  1562             'delta-base': None,
       
  1563             'search_round_count': None,
       
  1564             'using-cached-base': None,
       
  1565             'delta_try_count': None,
       
  1566             'type': None,
       
  1567             'p1-chain-len': None,
       
  1568             'p2-chain-len': None,
       
  1569             'snapshot-depth': None,
       
  1570             'target-revlog': None,
       
  1571         }
       
  1572 
       
  1573     def _dbg_process_data(self, dbg):
       
  1574         if self._debug_info is not None:
       
  1575             self._debug_info.append(dbg)
       
  1576 
       
  1577         if self._write_debug is not None:
       
  1578             msg = (
       
  1579                 b"DBG-DELTAS:"
       
  1580                 b" %-12s"
       
  1581                 b" rev=%d:"
       
  1582                 b" delta-base=%d"
       
  1583                 b" is-cached=%d"
       
  1584                 b" - search-rounds=%d"
       
  1585                 b" try-count=%d"
       
  1586                 b" - delta-type=%-6s"
       
  1587                 b" snap-depth=%d"
       
  1588                 b" - p1-chain-length=%d"
       
  1589                 b" p2-chain-length=%d"
       
  1590                 b" - duration=%f"
       
  1591                 b"\n"
       
  1592             )
       
  1593             msg %= (
       
  1594                 dbg["target-revlog"],
       
  1595                 dbg["revision"],
       
  1596                 dbg["delta-base"],
       
  1597                 dbg["using-cached-base"],
       
  1598                 dbg["search_round_count"],
       
  1599                 dbg["delta_try_count"],
       
  1600                 dbg["type"],
       
  1601                 dbg["snapshot-depth"],
       
  1602                 dbg["p1-chain-len"],
       
  1603                 dbg["p2-chain-len"],
       
  1604                 dbg["duration"],
       
  1605             )
       
  1606             self._write_debug(msg)
  1506 
  1607 
  1507 
  1608 
  1508 def delta_compression(default_compression_header, deltainfo):
  1609 def delta_compression(default_compression_header, deltainfo):
  1509     """return (COMPRESSION_MODE, deltainfo)
  1610     """return (COMPRESSION_MODE, deltainfo)
  1510 
  1611