mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
Let's reuse the mkosi tools tree to get all the tools we need instead of pulling them from pypi.
99 lines
2.7 KiB
Python
Executable File
99 lines
2.7 KiB
Python
Executable File
#!/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
|
|
CONFIG = Path('mkosi/mkosi.conf')
|
|
WORKFLOWS = [Path('.github/workflows') / f for f in ['mkosi.yml', 'coverage.yml', 'linter.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 {CONFIG}…')
|
|
matches = [m.group(1)
|
|
for line in open(CONFIG)
|
|
if (m := re.match('^MinimumVersion=commit:([a-z0-9]{40})$',
|
|
line.strip()))]
|
|
assert len(matches) == 1
|
|
return matches[0]
|
|
|
|
def commit_file(files: list[Path], commit: str, changes: str):
|
|
message = '\n'.join((
|
|
f'mkosi: update mkosi commit reference to {commit}',
|
|
'',
|
|
changes))
|
|
|
|
cmd = ['git', 'commit', '-m', message, *(str(file) for file in files)]
|
|
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()
|
|
|
|
for f in [CONFIG, *WORKFLOWS]:
|
|
s = f.read_text()
|
|
assert old_commit in s
|
|
print(f'mkosi: {f}: found old hash, updating…')
|
|
new = s.replace(old_commit, new_commit)
|
|
assert new != s
|
|
f.write_text(new)
|
|
|
|
commit_file([CONFIG, *WORKFLOWS], new_commit, changes)
|
|
|
|
if __name__ == '__main__':
|
|
args = parse_args()
|
|
checkout_mkosi(args)
|
|
if args.update:
|
|
update_mkosi(args)
|