--- a/hgkw/keyword.py Tue Dec 04 09:56:12 2007 +0100
+++ b/hgkw/keyword.py Mon Dec 17 16:43:26 2007 +0100
@@ -116,33 +116,57 @@
# commands.parse/cmdutil.parse returned nothing for
# "hg diff --rev" before 88803a69b24a due to bug in fancyopts
def fancyopts(args, options, state):
- '''Fixed fancyopts from 88803a69b24a.'''
- long = []
- short = ''
- map = {}
- dt = {}
- for s, l, d, c in options:
- pl = l.replace('-', '_')
- map['-'+s] = map['--'+l] = pl
- if isinstance(d, list):
- state[pl] = d[:]
+ '''Fixed fancyopts from a9b7e425674f.'''
+ namelist = []
+ shortlist = ''
+ argmap = {}
+ defmap = {}
+
+ for short, name, default, comment in options:
+ # convert opts to getopt format
+ oname = name
+ name = name.replace('-', '_')
+
+ argmap['-' + short] = argmap['--' + oname] = name
+ defmap[name] = default
+
+ # copy defaults to state
+ if isinstance(default, list):
+ state[name] = default[:]
+ elif callable(default):
+ print "whoa", name, default
+ state[name] = None
else:
- state[pl] = d
- dt[pl] = type(d)
- if (d is not None and d is not True and d is not False and
- not callable(d)):
- if s: s += ':'
- if l: l += '='
- if s: short = short + s
- if l: long.append(l)
- opts, args = getopt.getopt(args, short, long)
- for opt, arg in opts:
- if dt[map[opt]] is type(fancyopts): state[map[opt]](state, map[opt], arg)
- elif dt[map[opt]] is type(1): state[map[opt]] = int(arg)
- elif dt[map[opt]] is type(''): state[map[opt]] = arg
- elif dt[map[opt]] is type([]): state[map[opt]].append(arg)
- elif dt[map[opt]] is type(None): state[map[opt]] = True
- elif dt[map[opt]] is type(False): state[map[opt]] = True
+ state[name] = default
+
+ # does it take a parameter?
+ if not (default is None or default is True or default is False):
+ if short: short += ':'
+ if oname: oname += '='
+ if short:
+ shortlist += short
+ if name:
+ namelist.append(oname)
+
+ # parse arguments
+ opts, args = getopt.getopt(args, shortlist, namelist)
+
+ # transfer result to state
+ for opt, val in opts:
+ name = argmap[opt]
+ t = type(defmap[name])
+ if t is type(fancyopts):
+ state[name] = defmap[name](val)
+ elif t is type(1):
+ state[name] = int(val)
+ elif t is type(''):
+ state[name] = val
+ elif t is type([]):
+ state[name].append(val)
+ elif t is type(None) or t is type(False):
+ state[name] = True
+
+ # return unparsed args
return args
def findcmd(ui, cmd, table):