Mercurial > hg
view mercurial/fancyopts.py @ 7643:9a1ea6587557
error: move UnknownCommand and AmbiguousCommand
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 12 Jan 2009 11:39:38 -0600 |
parents | d39af2eabb8c |
children | 88887054d277 |
line wrap: on
line source
import getopt def fancyopts(args, options, state): """ read args, parse options, and store options in state each option is a tuple of: short option or '' long option default value description option types include: boolean or none - option sets variable in state to true string - parameter string is stored in state list - parameter string is added to a list integer - parameter strings is stored as int function - call function with parameter non-option args are returned """ 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): state[name] = None else: 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