1183 ) |
1183 ) |
1184 def debugdiscovery(ui, repo, remoteurl=b"default", **opts): |
1184 def debugdiscovery(ui, repo, remoteurl=b"default", **opts): |
1185 """runs the changeset discovery protocol in isolation |
1185 """runs the changeset discovery protocol in isolation |
1186 |
1186 |
1187 The local peer can be "replaced" by a subset of the local repository by |
1187 The local peer can be "replaced" by a subset of the local repository by |
1188 using the `--local-as-revs` flag. Int he same way, usual `remote` peer can |
1188 using the `--local-as-revs` flag. In the same way, the usual `remote` peer |
1189 be "replaced" by a subset of the local repository using the |
1189 can be "replaced" by a subset of the local repository using the |
1190 `--local-as-revs` flag. This is useful to efficiently debug pathological |
1190 `--remote-as-revs` flag. This is useful to efficiently debug pathological |
1191 discovery situation. |
1191 discovery situations. |
1192 |
1192 |
1193 The following developer oriented config are relevant for people playing with this command: |
1193 The following developer oriented config are relevant for people playing with this command: |
1194 |
1194 |
1195 * devel.discovery.exchange-heads=True |
1195 * devel.discovery.exchange-heads=True |
1196 |
1196 |
1274 |
1274 |
1275 def doit(pushedrevs, remoteheads, remote=remote): |
1275 def doit(pushedrevs, remoteheads, remote=remote): |
1276 if not util.safehasattr(remote, b'branches'): |
1276 if not util.safehasattr(remote, b'branches'): |
1277 # enable in-client legacy support |
1277 # enable in-client legacy support |
1278 remote = localrepo.locallegacypeer(remote.local()) |
1278 remote = localrepo.locallegacypeer(remote.local()) |
|
1279 if remote_revs: |
|
1280 r = remote._repo.filtered(b'debug-discovery-remote-filter') |
|
1281 remote._repo = r |
1279 common, _in, hds = treediscovery.findcommonincoming( |
1282 common, _in, hds = treediscovery.findcommonincoming( |
1280 repo, remote, force=True, audit=data |
1283 repo, remote, force=True, audit=data |
1281 ) |
1284 ) |
1282 common = set(common) |
1285 common = set(common) |
1283 if not opts.get(b'nonheads'): |
1286 if not opts.get(b'nonheads'): |
1297 nodes = None |
1300 nodes = None |
1298 if pushedrevs: |
1301 if pushedrevs: |
1299 revs = logcmdutil.revrange(repo, pushedrevs) |
1302 revs = logcmdutil.revrange(repo, pushedrevs) |
1300 nodes = [repo[r].node() for r in revs] |
1303 nodes = [repo[r].node() for r in revs] |
1301 common, any, hds = setdiscovery.findcommonheads( |
1304 common, any, hds = setdiscovery.findcommonheads( |
1302 ui, repo, remote, ancestorsof=nodes, audit=data |
1305 ui, |
|
1306 repo, |
|
1307 remote, |
|
1308 ancestorsof=nodes, |
|
1309 audit=data, |
|
1310 abortwhenunrelated=False, |
1303 ) |
1311 ) |
1304 return common, hds |
1312 return common, hds |
1305 |
1313 |
1306 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches, revs=None) |
1314 remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches, revs=None) |
1307 localrevs = opts[b'rev'] |
1315 localrevs = opts[b'rev'] |
1320 with may_capture_output(): |
1328 with may_capture_output(): |
1321 with util.timedcm('debug-discovery') as t: |
1329 with util.timedcm('debug-discovery') as t: |
1322 common, hds = doit(localrevs, remoterevs) |
1330 common, hds = doit(localrevs, remoterevs) |
1323 |
1331 |
1324 # compute all statistics |
1332 # compute all statistics |
|
1333 if len(common) == 1 and repo.nullid in common: |
|
1334 common = set() |
1325 heads_common = set(common) |
1335 heads_common = set(common) |
1326 heads_remote = set(hds) |
1336 heads_remote = set(hds) |
1327 heads_local = set(repo.heads()) |
1337 heads_local = set(repo.heads()) |
1328 # note: they cannot be a local or remote head that is in common and not |
1338 # note: they cannot be a local or remote head that is in common and not |
1329 # itself a head of common. |
1339 # itself a head of common. |
1373 fm.startitem() |
1383 fm.startitem() |
1374 fm.data(**pycompat.strkwargs(data)) |
1384 fm.data(**pycompat.strkwargs(data)) |
1375 # display discovery summary |
1385 # display discovery summary |
1376 fm.plain(b"elapsed time: %(elapsed)f seconds\n" % data) |
1386 fm.plain(b"elapsed time: %(elapsed)f seconds\n" % data) |
1377 fm.plain(b"round-trips: %(total-roundtrips)9d\n" % data) |
1387 fm.plain(b"round-trips: %(total-roundtrips)9d\n" % data) |
|
1388 if b'total-round-trips-heads' in data: |
|
1389 fm.plain( |
|
1390 b" round-trips-heads: %(total-round-trips-heads)9d\n" % data |
|
1391 ) |
|
1392 if b'total-round-trips-branches' in data: |
|
1393 fm.plain( |
|
1394 b" round-trips-branches: %(total-round-trips-branches)9d\n" |
|
1395 % data |
|
1396 ) |
|
1397 if b'total-round-trips-between' in data: |
|
1398 fm.plain( |
|
1399 b" round-trips-between: %(total-round-trips-between)9d\n" % data |
|
1400 ) |
1378 fm.plain(b"queries: %(total-queries)9d\n" % data) |
1401 fm.plain(b"queries: %(total-queries)9d\n" % data) |
|
1402 if b'total-queries-branches' in data: |
|
1403 fm.plain(b" queries-branches: %(total-queries-branches)9d\n" % data) |
|
1404 if b'total-queries-between' in data: |
|
1405 fm.plain(b" queries-between: %(total-queries-between)9d\n" % data) |
1379 fm.plain(b"heads summary:\n") |
1406 fm.plain(b"heads summary:\n") |
1380 fm.plain(b" total common heads: %(nb-common-heads)9d\n" % data) |
1407 fm.plain(b" total common heads: %(nb-common-heads)9d\n" % data) |
1381 fm.plain(b" also local heads: %(nb-common-heads-local)9d\n" % data) |
1408 fm.plain(b" also local heads: %(nb-common-heads-local)9d\n" % data) |
1382 fm.plain(b" also remote heads: %(nb-common-heads-remote)9d\n" % data) |
1409 fm.plain(b" also remote heads: %(nb-common-heads-remote)9d\n" % data) |
1383 fm.plain(b" both: %(nb-common-heads-both)9d\n" % data) |
1410 fm.plain(b" both: %(nb-common-heads-both)9d\n" % data) |