diff -r 6160401f94f2 -r b92767fb8fb5 hgkw/keyword.py --- 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):