From 04c545c39cdfee9f1745c5a3d63637123dde378e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Budai?= Date: Fri, 28 Jul 2023 15:02:48 +0200 Subject: [PATCH] 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. --- tools/gen-stage-test-diff | 108 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100755 tools/gen-stage-test-diff diff --git a/tools/gen-stage-test-diff b/tools/gen-stage-test-diff new file mode 100755 index 00000000..f3ac7d50 --- /dev/null +++ b/tools/gen-stage-test-diff @@ -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()