[PATCH 1 of 2] debugcommands: introduce standalone module for debug commands

Gregory Szorc gregory.szorc at gmail.com
Thu Nov 10 12:50:55 EST 2016


I started this series a few months ago, told Pierre-Yves about it, and he
encouraged me to start patchbombing.

While I haven't completed the work, the remainder of what I've started can
be pulled from
https://hg.mozilla.org/users/gszorc_mozilla.com/hg/rev/916144fdac95. I
don't plan on patchbombing the rest, as I don't want to be distracted from
other work.

On Thu, Nov 10, 2016 at 9:47 AM, Gregory Szorc <gregory.szorc at gmail.com>
wrote:

> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1471493258 25200
> #      Wed Aug 17 21:07:38 2016 -0700
> # Node ID 52e8ce0d0992ad87be2815bd7c5f0d92aab21851
> # Parent  5564fcd031df482d4fe4eb50d959878f55bc960d
> 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.
>
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -1862,35 +1862,16 @@ def copy(ui, repo, *pats, **opts):
>      This command takes effect with the next commit. To undo a copy
>      before that, see :hg:`revert`.
>
>      Returns 0 on success, 1 if errors are encountered.
>      """
>      with repo.wlock(False):
>          return cmdutil.copy(ui, repo, pats, opts)
>
> - at 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')),
>      ('n', 'new-file', None, _('add new file at each rev'))],
>      _('[OPTION]... [TEXT]'))
>  def debugbuilddag(ui, repo, text=None,
>                    mergeable_file=False,
>                    overwritten_file=False,
> diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py
> new file mode 100644
> --- /dev/null
> +++ b/mercurial/debugcommands.py
> @@ -0,0 +1,42 @@
> +# debugcommands.py - command processing for debug* commands
> +#
> +# Copyright 2005-2016 Matt Mackall <mpm at 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)
> +
> + at 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)))
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -21,16 +21,17 @@ import time
>  import traceback
>
>
>  from .i18n import _
>
>  from . import (
>      cmdutil,
>      commands,
> +    debugcommands,
>      demandimport,
>      encoding,
>      error,
>      extensions,
>      fancyopts,
>      fileset,
>      hg,
>      hook,
> @@ -763,16 +764,20 @@ def _dispatch(req):
>          for objname, loadermod, loadername in extraloaders:
>              extraobj = getattr(module, objname, None)
>              if extraobj is not None:
>                  getattr(loadermod, loadername)(ui, name, extraobj)
>          _loaded.add(name)
>
>      # (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.
>      # Check abbreviation/ambiguity of shell alias.
>      shellaliasfn = _checkshellalias(lui, ui, args)
>      if shellaliasfn:
>          with profiling.maybeprofile(lui):
>              return shellaliasfn()
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20161110/a313e0eb/attachment.html>


More information about the Mercurial-devel mailing list