From: Brandon Low Date: Sat, 10 Jul 2010 18:21:53 +0000 (-0700) Subject: options.py: differentiate unset and set-to-negative options. X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=b0c1c31e420d243b5644c4158cea149b3b9771fb;p=packages%2Fb%2Fbup.git options.py: differentiate unset and set-to-negative options. Unset options will still be None, but options explicitly set to a negative will now be 0. This doesn't change semantics for anything currently in bup, but it could be useful later when applying defaults. While we're here, clean up the option parsing code to make it very slightly more efficient. Signed-off-by: Brandon Low --- diff --git a/lib/bup/options.py b/lib/bup/options.py index b40d6b4..c1a1455 100644 --- a/lib/bup/options.py +++ b/lib/bup/options.py @@ -6,7 +6,7 @@ class OptDict: def __setitem__(self, k, v): self._opts[k] = v - + def __getitem__(self, k): return self._opts[k] @@ -51,14 +51,14 @@ class Options: flagl = flags.split(',') flagl_nice = [] for f in flagl: - f_nice = re.sub(r'\W', '_', f) self._aliases[f] = flagl[0] - self._aliases[f_nice] = flagl[0] self._hasparms[f] = has_parm if len(f) == 1: self._shortopts += f + (has_parm and ':' or '') flagl_nice.append('-' + f) else: + f_nice = re.sub(r'\W', '_', f) + self._aliases[f_nice] = flagl[0] assert(not f.startswith('no-')) # supported implicitly self._longopts.append(f + (has_parm and '=' or '')) self._longopts.append('no-' + f) @@ -90,21 +90,18 @@ class Options: self.fatal(e) opt = OptDict() - for f in self._aliases.values(): - opt[f] = None for (k,v) in flags: - while k.startswith('-'): - k = k[1:] - if k in ['h', '?', 'help']: + k = k.lstrip('-') + if k in ('h', '?', 'help'): self.usage() if k.startswith('no-'): k = self._aliases[k[3:]] - opt[k] = None + v = 0 else: k = self._aliases[k] if not self._hasparms[k]: assert(v == '') - opt[k] = (opt._opts.get(k) or 0) + 1 + v = (opt._opts.get(k) or 0) + 1 else: try: vv = int(v) @@ -112,7 +109,7 @@ class Options: v = vv except ValueError: pass - opt[k] = v - for (f1,f2) in self._aliases.items(): - opt[f1] = opt[f2] + opt[k] = v + for (f1,f2) in self._aliases.iteritems(): + opt[f1] = opt._opts.get(f2) return (opt,flags,extra) diff --git a/t/toptions.py b/t/toptions.py index 4596e8b..da78995 100644 --- a/t/toptions.py +++ b/t/toptions.py @@ -46,4 +46,4 @@ def test_options(): WVPASSEQ((opt.t, opt.q, opt.p, opt.l, opt.onlylong, opt.neveropt), (3,1,7,19,1,None)) (opt,flags,extra) = o.parse(['--onlylong', '-t', '--no-onlylong']) - WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, None)) + WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, 0))