--- /dev/null
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+"""
+Check out mkosi into specified location.
+With -u, if changed, commit the latest hash.
+"""
+
+import argparse
+import shlex
+import subprocess
+import re
+from pathlib import Path
+
+URL = 'https://github.com/systemd/mkosi'
+BRANCH = 'main' # We only want to ever use commits on upstream 'main' branch
+FILENAME = Path('.github/workflows/mkosi.yml')
+
+def parse_args():
+ p = argparse.ArgumentParser(
+ description=__doc__,
+ )
+ p.add_argument(
+ 'dir',
+ type=Path,
+ )
+ p.add_argument(
+ '--update', '-u',
+ action='store_true',
+ default=False,
+ )
+ return p.parse_args()
+
+def read_config():
+ print(f'Reading {FILENAME}…')
+ matches = [m.group(1)
+ for line in open(FILENAME)
+ if (m := re.match('^- uses: systemd/mkosi@([a-z0-9]{40})$',
+ line.strip()))]
+ assert len(matches) == 1
+ return matches[0]
+
+def commit_file(args, file: Path, commit: str, changes: str):
+ cmd = [
+ 'git', '-C', args.dir.as_posix(),
+ 'describe',
+ '--always',
+ commit]
+ print(f"+ {shlex.join(cmd)}")
+ desc = subprocess.check_output(cmd, text=True).strip()
+
+ message = '\n'.join((
+ f'mkosi: update mkosi commit reference to {desc}',
+ '',
+ changes))
+
+ cmd = ['git', 'commit', '-m', message, file.as_posix()]
+ print(f"+ {shlex.join(cmd)}")
+ subprocess.check_call(cmd)
+
+def checkout_mkosi(args):
+ if args.dir.exists():
+ print(f'{args.dir} already exists.')
+ return
+
+ cmd = [
+ 'git', 'clone', URL,
+ f'--branch={BRANCH}',
+ args.dir.as_posix(),
+ ]
+ print(f"+ {shlex.join(cmd)}")
+ subprocess.check_call(cmd)
+
+def update_mkosi(args):
+ old_commit = read_config()
+
+ cmd = ['git', '-C', args.dir.as_posix(), 'rev-parse', f'refs/remotes/origin/{BRANCH}']
+ print(f"+ {shlex.join(cmd)}")
+ new_commit = subprocess.check_output(cmd, text=True).strip()
+
+ if old_commit == new_commit:
+ print(f'mkosi: commit {new_commit!s} is still fresh')
+ return
+
+ cmd = ['git', '-C', args.dir.as_posix(), 'log', '--graph',
+ '--pretty=oneline', '--no-decorate', '--abbrev-commit', '--abbrev=10',
+ f'{old_commit}..{new_commit}']
+ print(f"+ {shlex.join(cmd)}")
+ changes = subprocess.check_output(cmd, text=True).strip()
+
+ s = FILENAME.read_text()
+ assert old_commit in s
+ print(f'mkosi: {FILENAME}: found old hash, updating…')
+ new = s.replace(old_commit, new_commit)
+ assert new != s
+ FILENAME.write_text(new)
+ commit_file(args, FILENAME, new_commit, changes)
+
+if __name__ == '__main__':
+ args = parse_args()
+ checkout_mkosi(args)
+ if args.update:
+ update_mkosi(args)