diff options
author | 2024-11-27 11:19:59 -0800 | |
---|---|---|
committer | 2024-11-27 11:23:05 -0800 | |
commit | a6a9a75b65b08be9686af305c81ee77278cc7189 (patch) | |
tree | c875ecef11212380cd57fb2d308c4abbda21b965 | |
parent | 22113b5fb6c39e684f884b4f787d253896b69f17 (diff) |
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
-rwxr-xr-x | ravenwood/scripts/extract-last-soong-commands.py | 89 |
1 files changed, 89 insertions, 0 deletions
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:])) |