Options: treat array option -Dopt= and -Dopt=[] as equivalent

Currently the former will be parsed as [''], while the latter is parsed
as [] in python. This makes for some obnoxious special handling
depending on what the user passes. This is even more obnoxious since for
string type arguments this doesn't require special handling.
This commit is contained in:
Dylan Baker 2018-06-05 08:33:36 -07:00 committed by Nirbheek Chauhan
parent 14fe0985f7
commit f3a8f9c34d
4 changed files with 30 additions and 0 deletions

View File

@ -61,6 +61,9 @@ empty. The `value` parameter specifies the default value of the option
and if it is unset then the values of `choices` will be used as the
default.
As of 0.47.0 -Dopt= and -Dopt=[] both pass an empty list, before this -Dopt=
would pass a list with an empty string.
This type is available since version 0.44.0
### Features

View File

@ -0,0 +1,5 @@
## Array options treat -Dopt= and -Dopt=[] as equivalent
Prior to this change passing -Dopt= to an array opt would be interpreted as
[''] (an array with an empty string), now -Dopt= is the same as -Dopt=[], an
empty list.

View File

@ -154,6 +154,8 @@ class UserArrayOption(UserOption):
if isinstance(value, str):
if value.startswith('['):
newvalue = ast.literal_eval(value)
elif value == '':
newvalue = []
else:
if self.shlex_split:
newvalue = shlex.split(value)

View File

@ -1786,6 +1786,26 @@ int main(int argc, char **argv) {
changed = get_opt()
self.assertDictEqual(changed, expected)
def test_array_option_empty_equivalents(self):
"""Array options treat -Dopt=[] and -Dopt= as equivalent."""
def get_opt():
opts = self.introspect('--buildoptions')
for x in opts:
if x.get('name') == 'list':
return x
raise Exception(opts)
expected = {
'name': 'list',
'description': 'list',
'type': 'array',
'value': [],
}
tdir = os.path.join(self.unit_test_dir, '18 array option')
self.init(tdir, extra_args='-Dlist=')
original = get_opt()
self.assertDictEqual(original, expected)
def opt_has(self, name, value):
res = self.introspect('--buildoptions')
found = False