From a6a9a75b65b08be9686af305c81ee77278cc7189 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Wed, 27 Nov 2024 11:19:59 -0800 Subject: Add a script to extract last commands executed by soong This script will extract them into a shell script file under /tmp/, which can be executed to reproduce the last execution. Flag: EXEMPT host test change only Bug: 292141694 Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/extract-last-soong-commands.py and check the content. Change-Id: If29f62f14a1fd092263577a7a579a1b637982c99 --- ravenwood/scripts/extract-last-soong-commands.py | 89 ++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 ravenwood/scripts/extract-last-soong-commands.py (limited to 'ravenwood/scripts/extract-last-soong-commands.py') diff --git a/ravenwood/scripts/extract-last-soong-commands.py b/ravenwood/scripts/extract-last-soong-commands.py new file mode 100755 index 000000000000..bdc1de0c44f4 --- /dev/null +++ b/ravenwood/scripts/extract-last-soong-commands.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# Copyright (C) 2024 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# This script extracts all the commands executed in the last soong run, +# and write them into a script file, and print the filename. +# +# All the commands are commented out. Uncomment what you want to execute as +# needed before running it. + +import datetime +import gzip +import os +import re +import shlex +import sys + +re_command = re.compile(r''' ^\[.*?\] \s* (.*) ''', re.X) + +HEADER = r'''#!/bin/bash + +set -e # Stop on a failed command + +cd "${ANDROID_BUILD_TOP:?}" + +''' + +OUT_SCRIPT_DIR = "/tmp/" +OUT_SCRIPT_FORMAT = "soong-rerun-%Y-%m-%d_%H-%M-%S.sh" + +def main(args): + log = os.environ["ANDROID_BUILD_TOP"] + "/out/verbose.log.gz" + outdir = "/tmp/" + outfile = outdir + datetime.datetime.now().strftime(OUT_SCRIPT_FORMAT) + + with open(outfile, "w") as out: + out.write(HEADER) + + with gzip.open(log) as f: + for line in f: + s = line.decode("utf-8") + + if s.startswith("verbose"): + continue + if re.match('^\[.*bootstrap blueprint', s): + continue + + s = s.rstrip() + + m = re_command.search(s) + if m: + command = m.groups()[0] + + out.write('#========\n') + + # Show the full command line before executing it. + out.write('#echo ' + shlex.quote(command) + '\n') + out.write('\n') + + # Execute the command. + out.write('#' + command + '\n') + + out.write('\n') + + continue + + if s.startswith("FAILED:"): + break + + os.chmod(outfile, 0o755) + print(outfile) + + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) -- cgit v1.2.3-59-g8ed1b