Mercurial > public > mercurial-scm > python-hglib
comparison 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 |
comparison
equal
deleted
inserted
replaced
192:7a84a8656679 | 193:32e8d51ec16c |
---|---|
92 | 92 |
93 >>> cmdbuilder(b('cmd'), a=True, b=False, c=None) == [b('cmd'), b('-a')] | 93 >>> cmdbuilder(b('cmd'), a=True, b=False, c=None) == [b('cmd'), b('-a')] |
94 True | 94 True |
95 >>> cmdbuilder(b('cmd'), long=True) == [b('cmd'), b('--long')] | 95 >>> cmdbuilder(b('cmd'), long=True) == [b('cmd'), b('--long')] |
96 True | 96 True |
97 >>> cmdbuilder(b('cmd'), str=b('s')) == [b('cmd'), b('--str'), b('s')] | 97 >>> cmdbuilder(b('cmd'), s=b('hort')) == [b('cmd'), b('-short')] |
98 True | |
99 >>> cmdbuilder(b('cmd'), str=b('s')) == [b('cmd'), b('--str=s')] | |
98 True | 100 True |
99 >>> cmdbuilder(b('cmd'), d_ash=True) == [b('cmd'), b('--d-ash')] | 101 >>> cmdbuilder(b('cmd'), d_ash=True) == [b('cmd'), b('--d-ash')] |
100 True | 102 True |
101 >>> cmdbuilder(b('cmd'), _=True) == [b('cmd'), b('-')] | 103 >>> cmdbuilder(b('cmd'), _=True) == [b('cmd'), b('-')] |
102 True | 104 True |
103 >>> expect = [b('cmd'), b('--list'), b('1'), b('--list'), b('2')] | 105 >>> cmdbuilder(b('cmd'), l=[1, 2]) == [b('cmd'), b('-l1'), b('-l2')] |
106 True | |
107 >>> expect = [b('cmd'), b('--list=1'), b('--list=2')] | |
104 >>> cmdbuilder(b('cmd'), list=[1, 2]) == expect | 108 >>> cmdbuilder(b('cmd'), list=[1, 2]) == expect |
105 True | 109 True |
106 >>> cmdbuilder(b('cmd'), None) == [b('cmd')] | 110 >>> cmdbuilder(b('cmd'), None) == [b('cmd')] |
111 True | |
112 >>> cmdbuilder(b('cmd'), b('-a')) == [b('cmd'), b('--'), b('-a')] | |
107 True | 113 True |
108 """ | 114 """ |
109 cmd = [name] | 115 cmd = [name] |
110 for arg, val in kwargs.items(): | 116 for arg, val in kwargs.items(): |
111 if val is None: | 117 if val is None: |
112 continue | 118 continue |
113 | 119 |
114 arg = arg.encode('latin-1').replace(b('_'), b('-')) | 120 arg = pfx = arg.encode('latin-1').replace(b('_'), b('-')) |
115 if arg != b('-'): | 121 if arg != b('-'): |
116 if len(arg) == 1: | 122 if len(arg) == 1: |
117 arg = b('-') + arg | 123 arg = pfx = b('-') + arg |
118 else: | 124 else: |
119 arg = b('--') + arg | 125 arg = b('--') + arg |
126 pfx = arg + b('=') | |
120 if isinstance(val, bool): | 127 if isinstance(val, bool): |
121 if val: | 128 if val: |
122 cmd.append(arg) | 129 cmd.append(arg) |
123 elif isinstance(val, list): | 130 elif isinstance(val, list): |
124 for v in val: | 131 for v in val: |
125 cmd.append(arg) | 132 cmd.append(pfx + _cmdval(v)) |
126 cmd.append(_cmdval(v)) | |
127 else: | 133 else: |
128 cmd.append(arg) | 134 cmd.append(pfx + _cmdval(val)) |
129 cmd.append(_cmdval(val)) | 135 |
130 | 136 args = [a for a in args if a is not None] |
137 if args: | |
138 cmd.append(b('--')) | |
131 for a in args: | 139 for a in args: |
132 if a is not None: | 140 cmd.append(a) |
133 cmd.append(a) | |
134 | 141 |
135 return cmd | 142 return cmd |
136 | 143 |
137 class reterrorhandler(object): | 144 class reterrorhandler(object): |
138 """This class is meant to be used with rawcommand() error handler | 145 """This class is meant to be used with rawcommand() error handler |