summaryrefslogtreecommitdiff
path: root/kconfiglib.py
diff options
context:
space:
mode:
authorUlf Magnusson <ulfalizer@gmail.com>2017-09-25 20:24:11 +0200
committerUlf Magnusson <ulfalizer@gmail.com>2017-09-25 20:42:44 +0200
commit5f3d307155f4db035b652738e9fc49ad8be0c792 (patch)
tree3c5d4d3322a7d8bf0e2c5a7f9f7f0243b8860cfb /kconfiglib.py
parent58e05c00ab0a762866e3719974d5b74096df233c (diff)
Fix 'default' on non-visible choice symbols
Previously, 'default CHOICE_SYM [if <cond>]' in a choice would skip any following 'default' properties if <cond> was non-'n'. However, those other defaults should still be considered if CHOICE_SYM has visibility 'n'. Previously, we'd immediately fall back to selecting the first visible symbol in the choice in that case. get_selection_from_defaults() now exactly mirrors sym_choice_default() from the C implementation, and got less convoluted too. Nothing in the kernel defconfigs triggered this. Add a new test case too.
Diffstat (limited to 'kconfiglib.py')
-rw-r--r--kconfiglib.py20
1 files changed, 8 insertions, 12 deletions
diff --git a/kconfiglib.py b/kconfiglib.py
index 0cab18f..0865176 100644
--- a/kconfiglib.py
+++ b/kconfiglib.py
@@ -2872,23 +2872,19 @@ class Choice(Item):
"""Like Choice.get_selection(), but acts as if no symbol has been
selected by the user and no 'optional' flag is in effect."""
- if not self._actual_symbols:
- return None
-
- for symbol, cond_expr in self._def_exprs:
- if self._config._eval_expr(cond_expr) != "n":
- chosen_symbol = symbol
- break
- else:
- chosen_symbol = self._actual_symbols[0]
+ # Does any 'default SYM [if <cond>]' property apply?
+ for sym, cond_expr in self._def_exprs:
+ if (self._config._eval_expr(cond_expr) != "n" and
+ # Must be visible too
+ _get_visibility(sym) != "n"):
+ return sym
- # Is the chosen symbol visible?
- if _get_visibility(chosen_symbol) != "n":
- return chosen_symbol
# Otherwise, pick the first visible symbol
for sym in self._actual_symbols:
if _get_visibility(sym) != "n":
return sym
+
+ # Couldn't find a default
return None
def get_user_selection(self):