diff --git a/nova/flags.py b/nova/flags.py index bc4fd475..1f85b309 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -71,8 +71,20 @@ class FlagValues(object): self._parser = optparse.OptionParser() self._parser.disable_interspersed_args() self._extra_context = extra_context + self._multistring_defaults = {} self.Reset() + def _apply_multistring_defaults(self, values): + # + # This horrendous hack is to stop optparse appending + # values to the default value. See: + # http://bugs.python.org/issue5088 + # + for flag, default in self._multistring_defaults.items(): + if not getattr(values, flag): + setattr(values, flag, default) + return values + def _parse(self): if not self._values is None: return @@ -101,6 +113,8 @@ class FlagValues(object): finally: self._parser.error = error_catcher.orig_error + values = self._apply_multistring_defaults(values) + (self._values, self._extra) = (values, extra) def __call__(self, argv): @@ -190,7 +204,8 @@ class FlagValues(object): action='callback', callback=parse_list) def define_multistring(self, name, default, help): - self._add_option(name, default, help, action='append') + self._add_option(name, [], help, action='append') + self._multistring_defaults[name] = default FLAGS = FlagValues() diff --git a/nova/tests/test_flags.py b/nova/tests/test_flags.py index dab11c5e..2865eef5 100644 --- a/nova/tests/test_flags.py +++ b/nova/tests/test_flags.py @@ -74,7 +74,11 @@ class FlagsTestCase(test.TestCase): self.assertEqual(self.FLAGS.float, 6.66) def test_define_multistring(self): - flags.DEFINE_multistring('multi', [], 'desc', flag_values=self.FLAGS) + flags.DEFINE_multistring('multi', ['blaa'], 'desc', + flag_values=self.FLAGS) + + self.assert_(self.FLAGS['multi']) + self.assertEqual(self.FLAGS.multi, ['blaa']) argv = ['flags_test', '--multi', 'foo', '--multi', 'bar'] self.FLAGS(argv)