Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/debugcommands.py @ 46535:4f5e9a77ff7a
debugdiscovery: add flags to run discovery on subsets of the local repo
Generating new repository using strip of local clone is very expensive for large
repositories. And such large repository are the most likely to requires
debugging around discovery. So we add a simple way to run discovery using
provided sets of heads.
Differential Revision: https://phab.mercurial-scm.org/D9945
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 29 Jan 2021 15:23:07 +0100 |
parents | 3e3b81b6e7da |
children | c2435280ca63 |
comparison
equal
deleted
inserted
replaced
46534:d6e73351533b | 46535:4f5e9a77ff7a |
---|---|
67 policy, | 67 policy, |
68 pvec, | 68 pvec, |
69 pycompat, | 69 pycompat, |
70 registrar, | 70 registrar, |
71 repair, | 71 repair, |
72 repoview, | |
72 revlog, | 73 revlog, |
73 revset, | 74 revset, |
74 revsetlang, | 75 revsetlang, |
75 scmutil, | 76 scmutil, |
76 setdiscovery, | 77 setdiscovery, |
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): |