diff hglib/util.py @ 193:32e8d51ec16c

util: make cmdbuilder() robust for faulty parsing of early options Also fixed handling of positional arguments.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 11 Nov 2017 19:52:48 +0900
parents 0f81ed8e147b
children 2d0ec6097d78
line wrap: on
line diff
--- a/hglib/util.py	Sat Nov 11 20:21:26 2017 +0900
+++ b/hglib/util.py	Sat Nov 11 19:52:48 2017 +0900
@@ -94,43 +94,50 @@
     True
     >>> cmdbuilder(b('cmd'), long=True) == [b('cmd'), b('--long')]
     True
-    >>> cmdbuilder(b('cmd'), str=b('s')) == [b('cmd'), b('--str'), b('s')]
+    >>> cmdbuilder(b('cmd'), s=b('hort')) == [b('cmd'), b('-short')]
+    True
+    >>> cmdbuilder(b('cmd'), str=b('s')) == [b('cmd'), b('--str=s')]
     True
     >>> cmdbuilder(b('cmd'), d_ash=True) == [b('cmd'), b('--d-ash')]
     True
     >>> cmdbuilder(b('cmd'), _=True) == [b('cmd'), b('-')]
     True
-    >>> expect = [b('cmd'), b('--list'), b('1'), b('--list'), b('2')]
+    >>> cmdbuilder(b('cmd'), l=[1, 2]) == [b('cmd'), b('-l1'), b('-l2')]
+    True
+    >>> expect = [b('cmd'), b('--list=1'), b('--list=2')]
     >>> cmdbuilder(b('cmd'), list=[1, 2]) == expect
     True
     >>> cmdbuilder(b('cmd'), None) == [b('cmd')]
     True
+    >>> cmdbuilder(b('cmd'), b('-a')) == [b('cmd'), b('--'), b('-a')]
+    True
     """
     cmd = [name]
     for arg, val in kwargs.items():
         if val is None:
             continue
 
-        arg = arg.encode('latin-1').replace(b('_'), b('-'))
+        arg = pfx = arg.encode('latin-1').replace(b('_'), b('-'))
         if arg != b('-'):
             if len(arg) == 1:
-                arg = b('-') + arg
+                arg = pfx = b('-') + arg
             else:
                 arg = b('--') + arg
+                pfx = arg + b('=')
         if isinstance(val, bool):
             if val:
                 cmd.append(arg)
         elif isinstance(val, list):
             for v in val:
-                cmd.append(arg)
-                cmd.append(_cmdval(v))
+                cmd.append(pfx + _cmdval(v))
         else:
-            cmd.append(arg)
-            cmd.append(_cmdval(val))
+            cmd.append(pfx + _cmdval(val))
 
+    args = [a for a in args if a is not None]
+    if args:
+        cmd.append(b('--'))
     for a in args:
-        if a is not None:
-            cmd.append(a)
+        cmd.append(a)
 
     return cmd