debian-forge/inputs/org.osbuild.ostree.checkout
Christian Kellner ca3941feb6 inputs/ostree.checkout: don't overwrite refs
The `refs` variable is used as parameter to indicate which commits
to checkout, but it also was used as result variable to store the
ids of the commits that actually got checked out; naturally, it
was initialized to the empty array. This of course meant nothing
was ever actually checked out. Doh.
2021-08-24 01:21:03 +02:00

114 lines
2.6 KiB
Python
Executable file

#!/usr/bin/python3
"""
Inputs for checkouts of ostree commits
This input takes a number of commits and will check them out to a
temporary directory. The name of the directory is the commit id.
Internally uses `ostree checkout`
"""
import os
import json
import sys
import subprocess
from osbuild import inputs
SCHEMA = """
"additionalProperties": false,
"required": ["type", "origin", "references"],
"properties": {
"type": {
"enum": ["org.osbuild.ostree.checkout"]
},
"origin": {
"description": "The origin of the input",
"type": "string",
"enum": ["org.osbuild.source", "org.osbuild.pipeline"]
},
"references": {
"description": "Commit identifier to check out",
"oneOf": [{
"type": "array",
"items": {
"type": "string"
}
}, {
"type": "object",
"additionalProperties": false,
"minProperties": 1,
"patternProperties": {
".*": {
"type": "object",
"additionalProperties": false
}
}
}]
}
}
"""
def ostree(*args, _input=None, **kwargs):
args = list(args) + [f'--{k}={v}' for k, v in kwargs.items()]
print("ostree " + " ".join(args), file=sys.stderr)
subprocess.run(["ostree"] + args,
encoding="utf-8",
stdout=sys.stderr,
input=_input,
check=True)
def checkout(checksums, cache, output):
repo_cache = os.path.join(cache, "repo")
refs = []
for commit in checksums:
print(f"checkout {commit}", file=sys.stderr)
dest = os.path.join(output, commit)
ostree("checkout", commit, dest,
repo=repo_cache)
refs.append(commit)
return refs
class OSTreeCheckoutInput(inputs.InputService):
def map(self, store, origin, refs, target, _options):
ids = []
if origin == "org.osbuild.pipeline":
for ref, options in refs.items():
source = store.read_tree(ref)
with open(os.path.join(source, "compose.json"), "r") as f:
compose = json.load(f)
commit_id = compose["ostree-commit"]
ids.append(checkout({commit_id: options}, source, target))
else:
source = store.source("org.osbuild.ostree")
ids = checkout(refs, source, target)
reply = {
"path": target,
"data": {
"refs": {i: {"path": i} for i in ids}
}
}
return reply
def main():
service = OSTreeCheckoutInput.from_args(sys.argv[1:])
service.main()
if __name__ == '__main__':
main()