tools: introduce a tool for generating diffs for stage tests

There hasn't ever been an official tool for this and everyone was just using
the output from the test to generate the diff. This commit introduces a proper
tool for generating these files.
This commit is contained in:
Ondřej Budai 2023-07-28 15:02:48 +02:00 committed by Simon de Vlieger
parent 16294997d3
commit 04c545c39c

108
tools/gen-stage-test-diff Executable file
View file

@ -0,0 +1,108 @@
#!/usr/bin/env python3
import argparse
import contextlib
import os
import subprocess
import tempfile
def run_osbuild(output_directory, store, cache_max_size, libdir, manifest):
args = [
"osbuild",
"--export",
"tree",
"--output-directory",
output_directory,
"--store",
store,
"--cache-max-size",
str(cache_max_size),
"--checkpoint",
"tree",
"--checkpoint",
"build",
]
if libdir:
args += ["--libdir", libdir]
args += [manifest]
try:
subprocess.run(
args,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding="utf-8",
check=True,
)
except subprocess.CalledProcessError as err:
raise RuntimeError(
f"osbuild crashed when building {manifest}:\n\nstdout:\n{err.stdout}\n\nstderr:\n{err.stderr}"
)
epilog = """
example:
sudo tools/gen-stage-test-diff \\
--store ~/osbuild-store \\
--libdir . \\
test/data/stages/zstd
"""
def main():
parser = argparse.ArgumentParser(
description="Generator for diff.json files of stage tests",
epilog=epilog,
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument(
"--store",
type=str,
help="Specify the osbuild store",
default=1024 * 1024 * 1024,
)
parser.add_argument(
"--cache-max-size", type=int, help="Specify the osbuild max cache size"
)
parser.add_argument("--libdir", type=str, help="Specify the osbuild max cache size")
parser.add_argument("stage_test", type=str, help="Specify the stage test")
args = parser.parse_args()
with contextlib.ExitStack() as stack:
a = stack.enter_context(tempfile.TemporaryDirectory(dir="/var/tmp"))
b = stack.enter_context(tempfile.TemporaryDirectory(dir="/var/tmp"))
store = args.store
if not store:
store = stack.enter_context(tempfile.TemporaryDirectory(dir="/var/tmp"))
run_osbuild(
a,
store,
args.cache_max_size,
args.libdir,
os.path.join(args.stage_test, "a.json"),
)
run_osbuild(
b,
store,
args.cache_max_size,
args.libdir,
os.path.join(args.stage_test, "b.json"),
)
subprocess.run(
[
os.path.join(os.path.dirname(os.path.abspath(__file__)), "tree-diff"),
os.path.join(a, "tree"),
os.path.join(b, "tree"),
],
check=True,
)
if __name__ == "__main__":
main()