s = SETTINGS_LOOKUP_BY_DEST[self.dest]
if values is None or isinstance(values, str):
- setattr(namespace, s.dest, s.parse(values, getattr(namespace, self.dest, None)))
- else:
- for v in values:
- assert isinstance(v, str)
- setattr(namespace, s.dest, s.parse(v, getattr(namespace, self.dest, None)))
+ values = [values]
+
+ for v in values:
+ assert isinstance(v, str) or v is None
+ parsed_value = s.parse(v, getattr(namespace, self.dest, None))
+ if parsed_value is None:
+ setattr(namespace, f"{s.dest}_was_none", True)
+ setattr(namespace, s.dest, parsed_value)
class ParseContext:
# If a value was specified on the CLI, it always takes priority. If the setting is a collection of
# values, we merge the value from the CLI with the value from the configuration, making sure that the
# value from the CLI always takes priority.
- if hasattr(self.cli, setting.dest) and (v := getattr(self.cli, setting.dest)) is not None:
- if isinstance(v, list):
+ if (v := getattr(self.cli, setting.dest, None)) is not None:
+ if getattr(self.cli, f"{setting.dest}_was_none", False):
+ return v
+ elif isinstance(v, list):
return (getattr(self.config, setting.dest, None) or []) + v
elif isinstance(v, dict):
return (getattr(self.config, setting.dest, None) or {}) | v
with chdir(d):
_, [config] = parse_config()
assert config.split_artifacts == ArtifactOutput.compat_yes()
+
+
+def test_cli_collection_reset(tmp_path: Path) -> None:
+ d = tmp_path
+
+ (d / "mkosi.conf").write_text(
+ """
+ [Content]
+ Packages=abc
+ """
+ )
+
+ with chdir(d):
+ _, [config] = parse_config(["--package", ""])
+ assert config.packages == []
+
+ _, [config] = parse_config(["--package", "", "--package", "foo"])
+ assert config.packages == ["foo"]
+
+ _, [config] = parse_config(["--package", "foo", "--package", "", "--package", "bar"])
+ assert config.packages == ["bar"]
+
+ _, [config] = parse_config(["--package", "foo", "--package", ""])
+ assert config.packages == []