debugcommands: introduce standalone module for debug commands
commands.py is our largest .py file by nearly 2x. Debug commands live
in a world of their own. So let's extract them to their own module.
We start with "debugancestor."
We currently reuse the commands table with commands.py and have a hack
in dispatch.py for loading debugcommands.py. In the future, we could
potentially use a separate commands table and avoid the import of
debugcommands.py.
--- a/mercurial/commands.py Mon Nov 14 23:17:15 2016 +0000
+++ b/mercurial/commands.py Wed Aug 17 21:07:38 2016 -0700
@@ -1867,25 +1867,6 @@
with repo.wlock(False):
return cmdutil.copy(ui, repo, pats, opts)
-@command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
-def debugancestor(ui, repo, *args):
- """find the ancestor revision of two revisions in a given index"""
- if len(args) == 3:
- index, rev1, rev2 = args
- r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
- lookup = r.lookup
- elif len(args) == 2:
- if not repo:
- raise error.Abort(_("there is no Mercurial repository here "
- "(.hg not found)"))
- rev1, rev2 = args
- r = repo.changelog
- lookup = repo.lookup
- else:
- raise error.Abort(_('either two or three arguments required'))
- a = r.ancestor(lookup(rev1), lookup(rev2))
- ui.write("%d:%s\n" % (r.rev(a), hex(a)))
-
@command('debugbuilddag',
[('m', 'mergeable-file', None, _('add single file mergeable changes')),
('o', 'overwritten-file', None, _('add single file all revs overwrite')),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/debugcommands.py Wed Aug 17 21:07:38 2016 -0700
@@ -0,0 +1,42 @@
+# debugcommands.py - command processing for debug* commands
+#
+# Copyright 2005-2016 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+import os
+
+from .i18n import _
+from . import (
+ cmdutil,
+ commands,
+ error,
+ revlog,
+ scmutil,
+)
+
+# We reuse the command table from commands because it is easier than
+# teaching dispatch about multiple tables.
+command = cmdutil.command(commands.table)
+
+@command('debugancestor', [], _('[INDEX] REV1 REV2'), optionalrepo=True)
+def debugancestor(ui, repo, *args):
+ """find the ancestor revision of two revisions in a given index"""
+ if len(args) == 3:
+ index, rev1, rev2 = args
+ r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
+ lookup = r.lookup
+ elif len(args) == 2:
+ if not repo:
+ raise error.Abort(_('there is no Mercurial repository here '
+ '(.hg not found)'))
+ rev1, rev2 = args
+ r = repo.changelog
+ lookup = repo.lookup
+ else:
+ raise error.Abort(_('either two or three arguments required'))
+ a = r.ancestor(lookup(rev1), lookup(rev2))
+ ui.write('%d:%s\n' % (r.rev(a), hex(a)))
--- a/mercurial/dispatch.py Mon Nov 14 23:17:15 2016 +0000
+++ b/mercurial/dispatch.py Wed Aug 17 21:07:38 2016 -0700
@@ -26,6 +26,7 @@
from . import (
cmdutil,
commands,
+ debugcommands,
demandimport,
encoding,
error,
@@ -768,6 +769,10 @@
# (reposetup is handled in hg.repository)
+ # Side-effect of accessing is debugcommands module is guaranteed to be
+ # imported and commands.table is populated.
+ debugcommands.command
+
addaliases(lui, commands.table)
# All aliases and commands are completely defined, now.