stages/ostree.pull: new stage to pull commits
New stage to pull one, or more, commits provided by the `commits` input into the repository specified via `repo`.
This commit is contained in:
parent
f8b4541077
commit
e383359681
1 changed files with 82 additions and 0 deletions
82
stages/org.osbuild.ostree.pull
Executable file
82
stages/org.osbuild.ostree.pull
Executable file
|
|
@ -0,0 +1,82 @@
|
|||
#!/usr/bin/python3
|
||||
"""
|
||||
Pull OSTree commits into an existing repo
|
||||
|
||||
This stage pulls one or more commits, provided via
|
||||
the `commits` input into an existing repository at
|
||||
a location specified via `repo`.
|
||||
|
||||
If the returned a reference via `ref` it will use
|
||||
that to pull the commits.
|
||||
"""
|
||||
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
import osbuild.api
|
||||
|
||||
|
||||
SCHEMA_2 = """
|
||||
"options": {
|
||||
"additionalProperties": false,
|
||||
"required": ["repo"],
|
||||
"properties": {
|
||||
"repo": {
|
||||
"description": "Location of the OSTree repo.",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"inputs": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["commits"],
|
||||
"properties": {
|
||||
"commits": {
|
||||
"type": "object",
|
||||
"additionalProperties": true
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
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 parse_input(inputs):
|
||||
commits = inputs["commits"]
|
||||
data = commits["data"]
|
||||
refs = data["refs"]
|
||||
assert refs, "Need at least one commit"
|
||||
return commits["path"], data["refs"]
|
||||
|
||||
|
||||
# pylint: disable=too-many-statements
|
||||
def main(tree, inputs, options):
|
||||
source_repo, commits = parse_input(inputs)
|
||||
repo = options["repo"]
|
||||
target = os.path.join(tree, repo.lstrip("/"))
|
||||
|
||||
for commit, data in commits.items():
|
||||
ref = data.get("ref", commit)
|
||||
|
||||
ostree("pull-local", source_repo, ref,
|
||||
repo=target)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
stage_args = osbuild.api.arguments()
|
||||
r = main(stage_args["tree"],
|
||||
stage_args["inputs"],
|
||||
stage_args["options"])
|
||||
sys.exit(r)
|
||||
Loading…
Add table
Add a link
Reference in a new issue