eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/mercurial/fancyopts.py
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 # fancyopts.py - better command line parsing
       
     2 #
       
     3 #  Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
       
     4 #
       
     5 # This software may be used and distributed according to the terms of the
       
     6 # GNU General Public License version 2 or any later version.
       
     7 
       
     8 import getopt
       
     9 
       
    10 def gnugetopt(args, options, longoptions):
       
    11     """Parse options mostly like getopt.gnu_getopt.
       
    12 
       
    13     This is different from getopt.gnu_getopt in that an argument of - will
       
    14     become an argument of - instead of vanishing completely.
       
    15     """
       
    16     extraargs = []
       
    17     if '--' in args:
       
    18         stopindex = args.index('--')
       
    19         extraargs = args[stopindex + 1:]
       
    20         args = args[:stopindex]
       
    21     opts, parseargs = getopt.getopt(args, options, longoptions)
       
    22     args = []
       
    23     while parseargs:
       
    24         arg = parseargs.pop(0)
       
    25         if arg and arg[0] == '-' and len(arg) > 1:
       
    26             parseargs.insert(0, arg)
       
    27             topts, newparseargs = getopt.getopt(parseargs, options, longoptions)
       
    28             opts = opts + topts
       
    29             parseargs = newparseargs
       
    30         else:
       
    31             args.append(arg)
       
    32     args.extend(extraargs)
       
    33     return opts, args
       
    34 
       
    35 
       
    36 def fancyopts(args, options, state, gnu=False):
       
    37     """
       
    38     read args, parse options, and store options in state
       
    39 
       
    40     each option is a tuple of:
       
    41 
       
    42       short option or ''
       
    43       long option
       
    44       default value
       
    45       description
       
    46       option value label(optional)
       
    47 
       
    48     option types include:
       
    49 
       
    50       boolean or none - option sets variable in state to true
       
    51       string - parameter string is stored in state
       
    52       list - parameter string is added to a list
       
    53       integer - parameter strings is stored as int
       
    54       function - call function with parameter
       
    55 
       
    56     non-option args are returned
       
    57     """
       
    58     namelist = []
       
    59     shortlist = ''
       
    60     argmap = {}
       
    61     defmap = {}
       
    62 
       
    63     for option in options:
       
    64         if len(option) == 5:
       
    65             short, name, default, comment, dummy = option
       
    66         else:
       
    67             short, name, default, comment = option
       
    68         # convert opts to getopt format
       
    69         oname = name
       
    70         name = name.replace('-', '_')
       
    71 
       
    72         argmap['-' + short] = argmap['--' + oname] = name
       
    73         defmap[name] = default
       
    74 
       
    75         # copy defaults to state
       
    76         if isinstance(default, list):
       
    77             state[name] = default[:]
       
    78         elif hasattr(default, '__call__'):
       
    79             state[name] = None
       
    80         else:
       
    81             state[name] = default
       
    82 
       
    83         # does it take a parameter?
       
    84         if not (default is None or default is True or default is False):
       
    85             if short:
       
    86                 short += ':'
       
    87             if oname:
       
    88                 oname += '='
       
    89         if short:
       
    90             shortlist += short
       
    91         if name:
       
    92             namelist.append(oname)
       
    93 
       
    94     # parse arguments
       
    95     if gnu:
       
    96         parse = gnugetopt
       
    97     else:
       
    98         parse = getopt.getopt
       
    99     opts, args = parse(args, shortlist, namelist)
       
   100 
       
   101     # transfer result to state
       
   102     for opt, val in opts:
       
   103         name = argmap[opt]
       
   104         t = type(defmap[name])
       
   105         if t is type(fancyopts):
       
   106             state[name] = defmap[name](val)
       
   107         elif t is type(1):
       
   108             state[name] = int(val)
       
   109         elif t is type(''):
       
   110             state[name] = val
       
   111         elif t is type([]):
       
   112             state[name].append(val)
       
   113         elif t is type(None) or t is type(False):
       
   114             state[name] = True
       
   115 
       
   116     # return unparsed args
       
   117     return args