962 None, |
963 None, |
963 _(b'use old-style discovery with non-heads included'), |
964 _(b'use old-style discovery with non-heads included'), |
964 ), |
965 ), |
965 (b'', b'rev', [], b'restrict discovery to this set of revs'), |
966 (b'', b'rev', [], b'restrict discovery to this set of revs'), |
966 (b'', b'seed', b'12323', b'specify the random seed use for discovery'), |
967 (b'', b'seed', b'12323', b'specify the random seed use for discovery'), |
|
968 ( |
|
969 b'', |
|
970 b'local-as-revs', |
|
971 "", |
|
972 'treat local has having these revisions only', |
|
973 ), |
|
974 ( |
|
975 b'', |
|
976 b'remote-as-revs', |
|
977 "", |
|
978 'use local as remote, with only these these revisions', |
|
979 ), |
967 ] |
980 ] |
968 + cmdutil.remoteopts, |
981 + cmdutil.remoteopts, |
969 _(b'[--rev REV] [OTHER]'), |
982 _(b'[--rev REV] [OTHER]'), |
970 ) |
983 ) |
971 def debugdiscovery(ui, repo, remoteurl=b"default", **opts): |
984 def debugdiscovery(ui, repo, remoteurl=b"default", **opts): |
972 """runs the changeset discovery protocol in isolation""" |
985 """runs the changeset discovery protocol in isolation |
|
986 |
|
987 The local peer can be "replaced" by a subset of the local repository by |
|
988 using the `--local-as-revs` flag. Int he same way, usual `remote` peer can |
|
989 be "replaced" by a subset of the local repository using the |
|
990 `--local-as-revs` flag. This is useful to efficiently debug pathological |
|
991 discovery situation. |
|
992 """ |
973 opts = pycompat.byteskwargs(opts) |
993 opts = pycompat.byteskwargs(opts) |
974 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl)) |
994 unfi = repo.unfiltered() |
975 remote = hg.peer(repo, opts, remoteurl) |
995 |
976 ui.status(_(b'comparing with %s\n') % util.hidepassword(remoteurl)) |
996 # setup potential extra filtering |
|
997 local_revs = opts[b"local_as_revs"] |
|
998 remote_revs = opts[b"remote_as_revs"] |
977 |
999 |
978 # make sure tests are repeatable |
1000 # make sure tests are repeatable |
979 random.seed(int(opts[b'seed'])) |
1001 random.seed(int(opts[b'seed'])) |
|
1002 |
|
1003 if not remote_revs: |
|
1004 |
|
1005 remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl)) |
|
1006 remote = hg.peer(repo, opts, remoteurl) |
|
1007 ui.status(_(b'comparing with %s\n') % util.hidepassword(remoteurl)) |
|
1008 else: |
|
1009 branches = (None, []) |
|
1010 remote_filtered_revs = scmutil.revrange( |
|
1011 unfi, [b"not (::(%s))" % remote_revs] |
|
1012 ) |
|
1013 remote_filtered_revs = frozenset(remote_filtered_revs) |
|
1014 |
|
1015 def remote_func(x): |
|
1016 return remote_filtered_revs |
|
1017 |
|
1018 repoview.filtertable[b'debug-discovery-remote-filter'] = remote_func |
|
1019 |
|
1020 remote = repo.peer() |
|
1021 remote._repo = remote._repo.filtered(b'debug-discovery-remote-filter') |
|
1022 |
|
1023 if local_revs: |
|
1024 local_filtered_revs = scmutil.revrange( |
|
1025 unfi, [b"not (::(%s))" % local_revs] |
|
1026 ) |
|
1027 local_filtered_revs = frozenset(local_filtered_revs) |
|
1028 |
|
1029 def local_func(x): |
|
1030 return local_filtered_revs |
|
1031 |
|
1032 repoview.filtertable[b'debug-discovery-local-filter'] = local_func |
|
1033 repo = repo.filtered(b'debug-discovery-local-filter') |
980 |
1034 |
981 data = {} |
1035 data = {} |
982 if opts.get(b'old'): |
1036 if opts.get(b'old'): |
983 |
1037 |
984 def doit(pushedrevs, remoteheads, remote=remote): |
1038 def doit(pushedrevs, remoteheads, remote=remote): |