]> arthur.barton.de Git - bup.git/commitdiff
options.py: differentiate unset and set-to-negative options.
authorBrandon Low <lostlogic@lostlogicx.com>
Sat, 10 Jul 2010 18:21:53 +0000 (11:21 -0700)
committerAvery Pennarun <apenwarr@gmail.com>
Mon, 12 Jul 2010 05:43:51 +0000 (01:43 -0400)
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 <lostlogic@lostlogicx.com>
lib/bup/options.py
t/toptions.py

index b40d6b4037c2b4b29b06f1df75abeb70cbc7cd2b..c1a1455d476cddf3aed42db31f81f21d19b3cdc1 100644 (file)
@@ -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)
index 4596e8b245ce593791f99e0d6457ffcd6886027a..da78995d2fe9af87752b2288b6c3356df7d3d491 100644 (file)
@@ -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))