[packaging/craftmaster] /: craftmaster: add command line option --determine-package

Ralf Habacker <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit db6814621b9d53de34b40bc00e16cc1ed64612ab by Ralf Habacker.
Committed on 22/07/2026 at 16:16.
Pushed by habacker into branch 'master'.

craftmaster: add command line option --determine-package

M  +17   -2    CraftMaster.py
M  +20   -2    tests/test_craftmaster.py

https://invent.kde.org/packaging/craftmaster/-/commit/db6814621b9d53de34b40bc00e16cc1ed64612ab

diff --git a/CraftMaster.py b/CraftMaster.py
index aa5d98b..408e63d 100644
--- a/CraftMaster.py
+++ b/CraftMaster.py
@@ -31,7 +31,6 @@ class CraftMaster(object):
         self.targets = set(targets) if targets else set()
         self.verbose = verbose
         self.doSetup = setup
-        self._setDefaultCraftPackage()
         self._setConfig([Path(x).absolute() for x in configFiles], variables)
 
     # https://stackoverflow.com/a/1214935
@@ -367,9 +366,13 @@ if __name__ == "__main__":
     parser.add_argument(
         "--config",
         action="store",
-        required=True,
         help="The path to the configuration file.",
     )
+    parser.add_argument(
+        "--determine-package",
+        action="store_true",
+        help="Print the package name determined from CRAFT_PACKAGE or CI titles.",
+    )
     parser.add_argument(
         "--setup",
         action="store_true",
@@ -401,6 +404,18 @@ if __name__ == "__main__":
     )
 
     args = parser.parse_args()
+    if args.determine_package:
+        master = CraftMaster.__new__(CraftMaster)
+        master.verbose = args.verbose
+        master._setDefaultCraftPackage()
+
+        if "CRAFT_PACKAGE" not in os.environ:
+            master._error("Aborting because the package name is required")
+
+        print(os.environ["CRAFT_PACKAGE"])
+        exit(0)
+    if not args.config:
+        parser.error("--config is required unless --determine-package is used")
     configs = [args.config]
     configs += args.config_override
     master = CraftMaster(
diff --git a/tests/test_craftmaster.py b/tests/test_craftmaster.py
index 7d26254..de7a333 100644
--- a/tests/test_craftmaster.py
+++ b/tests/test_craftmaster.py
@@ -6,6 +6,8 @@ import contextlib
 import io
 import json
 import os
+import subprocess
+import sys
 import tempfile
 import unittest
 from unittest import mock
@@ -53,10 +55,10 @@ class CraftPackageExtractionTest(unittest.TestCase):
                 self.make_master()._setDefaultCraftPackage()
 
             self.assertNotIn("CRAFT_PACKAGE", os.environ)
+            self.assertIn("Unable to use title source(s): GITHUB_EVENT_PATH", stderr.getvalue())
             self.assertIn(
-                "Unable to use title source(s): GITHUB_EVENT_PATH", stderr.getvalue()
+                "Warning: CRAFT_PACKAGE was not set and no merge request", stderr.getvalue()
             )
-            self.assertIn("Continuing without CRAFT_PACKAGE", stderr.getvalue())
 
     def test_sets_craft_package_from_github_pull_request_title(self):
         with tempfile.NamedTemporaryFile(
@@ -78,6 +80,22 @@ class CraftPackageExtractionTest(unittest.TestCase):
         finally:
             os.unlink(event_path)
 
+    def test_determine_package_option_prints_detected_package_without_config(self):
+        env = {
+            "PATH": os.environ["PATH"],
+            "CI_COMMIT_TITLE": "kcalc: Build package",
+        }
+        completed = subprocess.run(
+            [sys.executable, "CraftMaster.py", "--determine-package"],
+            check=True,
+            encoding="utf-8",
+            env=env,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+        )
+
+        self.assertEqual(completed.stdout.strip(), "kcalc")
+
 
 if __name__ == "__main__":
     unittest.main()
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.