Patchwork [4,of,6] exthelper: support the option argument when registering a command

login
register
mail settings
Submitter Matt Harbison
Date Dec. 26, 2018, 9:33 p.m.
Message ID <a341e513e16c560082af.1545860016@Envy>
Download mbox | patch
Permalink /patch/37356/
State Accepted
Headers show

Comments

Matt Harbison - Dec. 26, 2018, 9:33 p.m.
# HG changeset patch
# User Matt Harbison <matt_harbison@yahoo.com>
# Date 1545620096 18000
#      Sun Dec 23 21:54:56 2018 -0500
# Node ID a341e513e16c560082afaf06ce6041091f8d40f1
# Parent  be536e648c4f96fa625a6222e9c50d45fee38bb5
exthelper: support the option argument when registering a command

Largefiles uses this 5th argument with push and pull, so this will be tested in
the next commit.  I assume the reason for unrolling and reforming the tuple in
each finalxxxsetup() is to validate that something proper was passed in when
registering.  But it's better to explode when decorating than during the delayed
actual registration.

Patch

diff --git a/mercurial/exthelper.py b/mercurial/exthelper.py
--- a/mercurial/exthelper.py
+++ b/mercurial/exthelper.py
@@ -13,6 +13,7 @@  from __future__ import absolute_import
 
 from . import (
     commands,
+    error,
     extensions,
     registrar,
 )
@@ -89,8 +90,8 @@  class exthelper(object):
         for command, wrapper, opts in self._commandwrappers:
             entry = extensions.wrapcommand(commands.table, command, wrapper)
             if opts:
-                for short, long, val, msg in opts:
-                    entry[1].append((short, long, val, msg))
+                for opt in opts:
+                    entry[1].append(opt)
         for cont, funcname, wrapper in self._functionwrappers:
             extensions.wrapfunction(cont, funcname, wrapper)
         for c in self._uicallables:
@@ -130,8 +131,8 @@  class exthelper(object):
                 knownexts[ext] = e.cmdtable
             entry = extensions.wrapcommand(knownexts[ext], command, wrapper)
             if opts:
-                for short, long, val, msg in opts:
-                    entry[1].append((short, long, val, msg))
+                for opt in opts:
+                    entry[1].append(opt)
 
         for c in self._extcallables:
             c(ui)
@@ -215,12 +216,21 @@  class exthelper(object):
                 ui.note('Barry!')
                 return orig(ui, repo, *args, **kwargs)
 
-        The `opts` argument allows specifying additional arguments for the
-        command.
+        The `opts` argument allows specifying a list of tuples for additional
+        arguments for the command.  See ``mercurial.fancyopts.fancyopts()`` for
+        the format of the tuple.
 
         """
         if opts is None:
             opts = []
+        else:
+            for opt in opts:
+                if not isinstance(opt, tuple):
+                    raise error.ProgrammingError('opts must be list of tuples')
+                if len(opt) not in (4, 5):
+                    msg = 'each opt tuple must contain 4 or 5 values'
+                    raise error.ProgrammingError(msg)
+
         def dec(wrapper):
             if extension is None:
                 self._commandwrappers.append((command, wrapper, opts))