blob: bdc1de0c44f42367f447a706dd52891b35609dd7 [file] [log] [blame]
Makoto Onukia6a9a752024-11-27 11:19:59 -08001#!/usr/bin/env python3
2# Copyright (C) 2024 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
17# This script extracts all the commands executed in the last soong run,
18# and write them into a script file, and print the filename.
19#
20# All the commands are commented out. Uncomment what you want to execute as
21# needed before running it.
22
23import datetime
24import gzip
25import os
26import re
27import shlex
28import sys
29
30re_command = re.compile(r''' ^\[.*?\] \s* (.*) ''', re.X)
31
32HEADER = r'''#!/bin/bash
33
34set -e # Stop on a failed command
35
36cd "${ANDROID_BUILD_TOP:?}"
37
38'''
39
40OUT_SCRIPT_DIR = "/tmp/"
41OUT_SCRIPT_FORMAT = "soong-rerun-%Y-%m-%d_%H-%M-%S.sh"
42
43def main(args):
44 log = os.environ["ANDROID_BUILD_TOP"] + "/out/verbose.log.gz"
45 outdir = "/tmp/"
46 outfile = outdir + datetime.datetime.now().strftime(OUT_SCRIPT_FORMAT)
47
48 with open(outfile, "w") as out:
49 out.write(HEADER)
50
51 with gzip.open(log) as f:
52 for line in f:
53 s = line.decode("utf-8")
54
55 if s.startswith("verbose"):
56 continue
57 if re.match('^\[.*bootstrap blueprint', s):
58 continue
59
60 s = s.rstrip()
61
62 m = re_command.search(s)
63 if m:
64 command = m.groups()[0]
65
66 out.write('#========\n')
67
68 # Show the full command line before executing it.
69 out.write('#echo ' + shlex.quote(command) + '\n')
70 out.write('\n')
71
72 # Execute the command.
73 out.write('#' + command + '\n')
74
75 out.write('\n')
76
77 continue
78
79 if s.startswith("FAILED:"):
80 break
81
82 os.chmod(outfile, 0o755)
83 print(outfile)
84
85 return 0
86
87
88if __name__ == '__main__':
89 sys.exit(main(sys.argv[1:]))