]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
Add OutputExtension= 3499/head
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 12 Feb 2025 11:00:53 +0000 (12:00 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 12 Feb 2025 15:52:55 +0000 (16:52 +0100)
mkosi/__init__.py
mkosi/config.py
mkosi/resources/man/mkosi.1.md
tests/test_json.py

index dd80fdf32cc5484e8a84a0e6251f09aba0e69fbe..15b5546e47f6144bd6867b1465bb16cc42c83bb3 100644 (file)
@@ -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)
 
index 8055b1397b862e40f12fbf8cf28d2ce9ab033f9c..23a1519d6fb1584950ff4dd0d78a5fa3f20c1092 100644 (file)
@@ -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",
index d5d9f556e9a52045f2d2b97ceb4dbb3996f8ea0d..2c28142f73bd6f324f6bcae95f3133f869a14c2b 100644 (file)
@@ -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**
index a5be927bcb4b9561cbe68fd70c087beec6a380c4..b5f793899b8d1d9d9956f9b1b88314ec9927a432 100644 (file)
@@ -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",