From: Daan De Meyer Date: Wed, 12 Feb 2025 11:00:53 +0000 (+0100) Subject: Add OutputExtension= X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F3499%2Fhead;p=thirdparty%2Fmkosi.git Add OutputExtension= --- diff --git a/mkosi/__init__.py b/mkosi/__init__.py index dd80fdf32..15b5546e4 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -2332,7 +2332,7 @@ def maybe_compress( return if not dst: - dst = src.parent / f"{src.name}{compression.extension()}" + dst = src.parent / f"{src.name}.{compression.extension()}" cmd = compressor_command(context, compression) diff --git a/mkosi/config.py b/mkosi/config.py index 8055b1397..23a1519d6 100644 --- a/mkosi/config.py +++ b/mkosi/config.py @@ -196,15 +196,15 @@ class OutputFormat(StrEnum): def extension(self) -> str: return { - OutputFormat.confext: ".raw", - OutputFormat.cpio: ".cpio", - OutputFormat.disk: ".raw", - OutputFormat.esp: ".raw", - OutputFormat.portable: ".raw", - OutputFormat.sysext: ".raw", - OutputFormat.tar: ".tar", - OutputFormat.uki: ".efi", - OutputFormat.addon: ".efi", + OutputFormat.confext: "raw", + OutputFormat.cpio: "cpio", + OutputFormat.disk: "raw", + OutputFormat.esp: "raw", + OutputFormat.portable: "raw", + OutputFormat.sysext: "raw", + OutputFormat.tar: "tar", + OutputFormat.uki: "efi", + OutputFormat.addon: "efi", }.get(self, "") # fmt: skip def use_outer_compression(self) -> bool: @@ -246,7 +246,7 @@ class Compression(StrEnum): return self != Compression.none def extension(self) -> str: - return {Compression.zstd: ".zst"}.get(self, f".{self}") + return {Compression.zstd: "zst"}.get(self, str(self)) def oci_media_type_suffix(self) -> str: suffix = { @@ -1806,6 +1806,7 @@ class Config: output_format: OutputFormat manifest_format: list[ManifestFormat] output: str + output_extension: str compress_output: Compression compress_level: int output_dir: Optional[Path] @@ -2023,14 +2024,19 @@ class Config: @property def output_with_format(self) -> str: - return self.output + self.output_format.extension() + ext = self.output_extension + + if not ext: + return self.output + + return f"{self.output}.{ext}" @property def output_with_compression(self) -> str: output = self.output_with_format if self.compress_output and self.output_format.use_outer_compression(): - output += self.compress_output.extension() + output += f".{self.compress_output.extension()}" return output @@ -2079,7 +2085,7 @@ class Config: output = f"{self.output}.tar" if self.compress_output: - output += self.compress_output.extension() + output += f".{self.compress_output.extension()}" return output @@ -2461,6 +2467,17 @@ SETTINGS: list[ConfigSetting[Any]] = [ default_factory_depends=("image_id", "image_version"), help="Output name", ), + ConfigSetting( + dest="output_extension", + metavar="EXTENSION", + section="Output", + parse=config_make_filename_parser( + "OutputExtension= or --output-extension= requires a valid extension with no path components." + ), + help="Output extension", + default_factory=lambda ns: ns.output_format.extension(), + default_factory_depends=("output_format",), + ), ConfigSetting( dest="compress_output", metavar="ALG", diff --git a/mkosi/resources/man/mkosi.1.md b/mkosi/resources/man/mkosi.1.md index d5d9f556e..2c28142f7 100644 --- a/mkosi/resources/man/mkosi.1.md +++ b/mkosi/resources/man/mkosi.1.md @@ -562,6 +562,12 @@ boolean argument: either `1`, `yes`, or `true` to enable, or `0`, `no`, specific output format, compression and image version used, the full output name might be `image_7.8.raw.xz`. +`OutputExtension=`, `--output-extension=` +: Use the specified extension for the output file. Defaults to the appropriate + extension based on the output format. Only includes the file extension, not + any compression extension which will be appended to this extension if compression + is enabled. + `CompressOutput=`, `--compress-output=` : Configure compression for the resulting image or archive. The argument can be either a boolean or a compression algorithm (**xz**, **zstd**). **zstd** diff --git a/tests/test_json.py b/tests/test_json.py index a5be927bc..b5f793899 100644 --- a/tests/test_json.py +++ b/tests/test_json.py @@ -238,6 +238,7 @@ def test_config() -> None: "OpenPGPTool": "gpg", "Output": "outfile", "OutputDirectory": "/your/output/here", + "OutputExtension": "raw", "OutputMode": 83, "Overlay": true, "PackageCacheDirectory": "/a/b/c", @@ -502,6 +503,7 @@ def test_config() -> None: nspawn_settings=None, openpgp_tool="gpg", output_dir=Path("/your/output/here"), + output_extension="raw", output_format=OutputFormat.uki, output_mode=0o123, output="outfile",