Patchwork fancyopts: allow all callable as default parameter value

login
register
mail settings
Submitter shiyao.ma
Date June 11, 2015, 1:04 p.m.
Message ID <54fb12cb448edd26a533.1434027841@datanode>
Download mbox | patch
Permalink /patch/9605/
State Superseded
Headers show

Comments

shiyao.ma - June 11, 2015, 1:04 p.m.
# HG changeset patch
# User introom <i@introo.me>
# Date 1434027264 14400
#      Thu Jun 11 08:54:24 2015 -0400
# Node ID 54fb12cb448edd26a5334940af7b33e4b4414615
# Parent  142fb8767743ff6b1c02a6ba01c5935f8dcf422d
fancyopts: allow all callable as default parameter value

The current fancyopts allows function as default parameter value
but not other callables.
By supporting other callables, we can have the benefits of e.g.,
custom __str__ method, which will be printed by 'hg help' as
the default value.

Patch

diff --git a/mercurial/fancyopts.py b/mercurial/fancyopts.py
--- a/mercurial/fancyopts.py
+++ b/mercurial/fancyopts.py
@@ -104,19 +104,20 @@ 
     for opt, val in opts:
         name = argmap[opt]
         obj = defmap[name]
+        t = type(obj)
         if callable(obj):
             state[name] = defmap[name](val)
-        elif isinstance(obj, int):
+        elif t is type(1):
             try:
                 state[name] = int(val)
             except ValueError:
                 raise util.Abort(_('invalid value %r for option %s, '
                                    'expected int') % (val, opt))
-        elif isinstance(obj, basestring):
+        elif t is type(''):
             state[name] = val
-        elif isinstance(obj, list):
+        elif t is type([]):
             state[name].append(val)
-        elif obj is None or isinstance(obj, bool):
+        elif t is type(None) or t is type(False):
             state[name] = True
 
     # return unparsed args