diff mercurial/debugcommands.py @ 30526:a3ec6db36315

debugcommands: move 'debugdiscovery' in the module And a lot of imports with it.
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 17 Aug 2016 20:56:11 -0700
parents ef1353c283e3
children a8b17859684a
line wrap: on
line diff
--- a/mercurial/debugcommands.py	Wed Aug 17 20:43:31 2016 -0700
+++ b/mercurial/debugcommands.py	Wed Aug 17 20:56:11 2016 -0700
@@ -8,10 +8,12 @@
 from __future__ import absolute_import
 
 import os
+import random
 
 from .i18n import _
 from .node import (
     hex,
+    short,
 )
 from . import (
     bundle2,
@@ -20,14 +22,18 @@
     commands,
     context,
     dagparser,
+    dagutil,
     error,
     exchange,
     hg,
+    localrepo,
     lock as lockmod,
     revlog,
     scmutil,
+    setdiscovery,
     simplemerge,
     streamclone,
+    treediscovery,
     util,
 )
 
@@ -451,3 +457,69 @@
     if range:
         m = util.matchdate(range)
         ui.write(("match: %s\n") % m(d[0]))
+
+@command('debugdiscovery',
+    [('', 'old', None, _('use old-style discovery')),
+    ('', 'nonheads', None,
+     _('use old-style discovery with non-heads included')),
+    ] + commands.remoteopts,
+    _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
+def debugdiscovery(ui, repo, remoteurl="default", **opts):
+    """runs the changeset discovery protocol in isolation"""
+    remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
+                                      opts.get('branch'))
+    remote = hg.peer(repo, opts, remoteurl)
+    ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
+
+    # make sure tests are repeatable
+    random.seed(12323)
+
+    def doit(localheads, remoteheads, remote=remote):
+        if opts.get('old'):
+            if localheads:
+                raise error.Abort('cannot use localheads with old style '
+                                 'discovery')
+            if not util.safehasattr(remote, 'branches'):
+                # enable in-client legacy support
+                remote = localrepo.locallegacypeer(remote.local())
+            common, _in, hds = treediscovery.findcommonincoming(repo, remote,
+                                                                force=True)
+            common = set(common)
+            if not opts.get('nonheads'):
+                ui.write(("unpruned common: %s\n") %
+                         " ".join(sorted(short(n) for n in common)))
+                dag = dagutil.revlogdag(repo.changelog)
+                all = dag.ancestorset(dag.internalizeall(common))
+                common = dag.externalizeall(dag.headsetofconnecteds(all))
+        else:
+            common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
+        common = set(common)
+        rheads = set(hds)
+        lheads = set(repo.heads())
+        ui.write(("common heads: %s\n") %
+                 " ".join(sorted(short(n) for n in common)))
+        if lheads <= common:
+            ui.write(("local is subset\n"))
+        elif rheads <= common:
+            ui.write(("remote is subset\n"))
+
+    serverlogs = opts.get('serverlog')
+    if serverlogs:
+        for filename in serverlogs:
+            with open(filename, 'r') as logfile:
+                line = logfile.readline()
+                while line:
+                    parts = line.strip().split(';')
+                    op = parts[1]
+                    if op == 'cg':
+                        pass
+                    elif op == 'cgss':
+                        doit(parts[2].split(' '), parts[3].split(' '))
+                    elif op == 'unb':
+                        doit(parts[3].split(' '), parts[2].split(' '))
+                    line = logfile.readline()
+    else:
+        remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
+                                                 opts.get('remote_head'))
+        localrevs = opts.get('local_head')
+        doit(localrevs, remoterevs)