mercurial/fancyopts.py
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
Tue, 05 Jun 2007 19:55:27 -0300
changeset 4508 0026ccc2bf23
parent 3749 f9567a7fa3b3
child 5145 88803a69b24a
permissions -rw-r--r--
Remove atomicfile class. The interface provided by opener(atomic=True) is inherently unsafe: if an exception is raised in the code using the atomic file, the possibly incomplete file will be renamed to its final destination, defeating the whole purpose of atomic files. To get around this, we would either need some bad hacks involving sys.exc_info (to make sure things work in except: blocks), or an interface to say "file is complete; rename it". This is the exact interface provided by atomictempfile. Since there are no remaining users of the atomicfile class, just remove it.

import getopt

def fancyopts(args, options, state):
    long = []
    short = ''
    map = {}
    dt = {}

    for s, l, d, c in options:
        pl = l.replace('-', '_')
        map['-'+s] = map['--'+l] = pl
        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

    return args