mercurial/debugcommands.py
changeset 46476 4f5e9a77ff7a
parent 46466 3e3b81b6e7da
child 46479 c2435280ca63
equal deleted inserted replaced
46473:d6e73351533b 46476: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):