diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-12 13:55:13 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-12 13:55:13 +0000 |
commit | 24ecf9f7f236d58b1d99cc65c722986ff357c5a5 (patch) | |
tree | 06dc6aefc5afb43f1e5905294ca43040eb8b0601 | |
parent | ad33652c0687ee8218d551b10d04dffe2b583ec7 (diff) | |
parent | 1332595b84e5d13688288210b090fbb3a114e23e (diff) | |
download | common-android12-mainline-wifi-release.tar.gz |
Snap for 8441503 from 1332595b84e5d13688288210b090fbb3a114e23e to mainline-wifi-releaseandroid-mainline-12.0.0_r126aml_wif_311811030android12-mainline-wifi-release
Change-Id: I2de1dd9be3cc47898947c6d89ec3e82878bad11e
-rwxr-xr-x | build/mainline_modules_sdks.py | 9 | ||||
-rw-r--r-- | build/mainline_modules_sdks_test.py | 18 | ||||
-rwxr-xr-x | tools/finalize_sdk.py | 85 |
3 files changed, 84 insertions, 28 deletions
diff --git a/build/mainline_modules_sdks.py b/build/mainline_modules_sdks.py index 97f7a70b..626dee03 100755 --- a/build/mainline_modules_sdks.py +++ b/build/mainline_modules_sdks.py @@ -303,6 +303,8 @@ class SnapshotBuilder: r_snapshot_dir = os.path.join(snapshot_dir, "for-R-build") shutil.rmtree(r_snapshot_dir, ignore_errors=True) + build_number_file = os.path.join(self.out_dir, "soong/build_number.txt") + for module in modules: apex = module.apex dest_dir = os.path.join(r_snapshot_dir, apex) @@ -323,6 +325,7 @@ class SnapshotBuilder: bp.write(f"// {self.tool_path}\n") bp.write(COPYRIGHT_BOILERPLATE) aosp_apex = google_to_aosp_name(apex) + for library in module.for_r_build.sdk_libraries: module_name = library.name shared_library = str(library.shared_library).lower() @@ -365,6 +368,12 @@ java_sdk_library_import {{ }} """) + # Copy the build_number.txt file into the snapshot. + snapshot_build_number_file = os.path.join( + dest_dir, "snapshot-creation-build-number.txt") + shutil.copy(build_number_file, snapshot_build_number_file) + + # Now zip up the files into a snapshot zip file. base_file = os.path.join(r_snapshot_dir, sdk_name + "-current") shutil.make_archive(base_file, "zip", dest_dir) diff --git a/build/mainline_modules_sdks_test.py b/build/mainline_modules_sdks_test.py index 6b77e14d..6d06303c 100644 --- a/build/mainline_modules_sdks_test.py +++ b/build/mainline_modules_sdks_test.py @@ -15,6 +15,7 @@ # limitations under the License. """Unit tests for mainline_modules_sdks.py.""" import dataclasses +import pathlib import re import typing from pathlib import Path @@ -112,6 +113,10 @@ class TestProduceDist(unittest.TestCase): return files def test_unbundled_modules(self): + # Create the out/soong/build_number.txt file that is copied into the + # snapshots. + self.create_build_number_file() + modules = [ MAINLINE_MODULES_BY_APEX["com.android.art"], MAINLINE_MODULES_BY_APEX["com.android.ipsec"], @@ -175,11 +180,13 @@ class TestProduceDist(unittest.TestCase): "com.android.ipsec/sdk_library/public/android.net.ipsec.ike-stubs.jar", "com.android.ipsec/sdk_library/public/android.net.ipsec.ike.srcjar", "com.android.ipsec/sdk_library/public/android.net.ipsec.ike.txt", + "com.android.ipsec/snapshot-creation-build-number.txt", google_wifi_android_bp, "com.google.android.wifi/sdk_library/public/framework-wifi-removed.txt", "com.google.android.wifi/sdk_library/public/framework-wifi-stubs.jar", "com.google.android.wifi/sdk_library/public/framework-wifi.srcjar", "com.google.android.wifi/sdk_library/public/framework-wifi.txt", + "com.google.android.wifi/snapshot-creation-build-number.txt", "ipsec-module-sdk-current.zip", "wifi-module-sdk-current.zip", ], sorted(self.list_files_in_dir(r_snaphot_dir))) @@ -263,7 +270,18 @@ class TestProduceDist(unittest.TestCase): ], sorted(self.list_files_in_dir(self.tmp_dist_dir))) + def create_build_number_file(self): + soong_dir = os.path.join(self.tmp_out_dir, "soong") + os.makedirs(soong_dir, exist_ok=True) + build_number_file = os.path.join(soong_dir, "build_number.txt") + with open(build_number_file, "w", encoding="utf8") as f: + f.write("build-number") + def test_snapshot_build_order(self): + # Create the out/soong/build_number.txt file that is copied into the + # snapshots. + self.create_build_number_file() + subprocess_runner = unittest.mock.Mock(mm.SubprocessRunner) snapshot_builder = FakeSnapshotBuilder( tool_path="path/to/mainline_modules_sdks.sh", diff --git a/tools/finalize_sdk.py b/tools/finalize_sdk.py index c862d892..84fd762e 100755 --- a/tools/finalize_sdk.py +++ b/tools/finalize_sdk.py @@ -1,19 +1,27 @@ #!/usr/bin/python3 import argparse +import glob import os import re +import shutil import subprocess import sys import tempfile import zipfile from collections import defaultdict +from pathlib import Path # See go/fetch_artifact for details on this script. FETCH_ARTIFACT = '/google/data/ro/projects/android/fetch_artifact' -BUILD_TARGET = 'mainline_modules-userdebug' -ARTIFACT_PATTERN = 'mainline-sdks/*-%d.zip' +COMPAT_REPO = Path('prebuilts/sdk') +# This build target is used when fetching from a train build (TXXXXXXXX) +BUILD_TARGET_TRAIN = 'train_build' +# This build target is used when fetching from a non-train build (XXXXXXXX) +BUILD_TARGET_CONTINUOUS = 'mainline_modules-user' +# The glob of sdk artifacts to fetch +ARTIFACT_PATTERN = 'mainline-sdks/current/{module_name}/sdk/*.zip' COMMIT_TEMPLATE = """Finalize artifacts for extension SDK %d Import from build id %s. @@ -29,14 +37,14 @@ def fail(*args, **kwargs): sys.exit(1) def fetch_artifacts(target, build_id, artifact_path): - tmpdir = tempfile.TemporaryDirectory().name - os.mkdir(tmpdir) + tmpdir = Path(tempfile.TemporaryDirectory().name) + tmpdir.mkdir() print('Fetching %s from %s ...' % (artifact_path, target)) fetch_cmd = [FETCH_ARTIFACT] fetch_cmd.extend(['--bid', str(build_id)]) fetch_cmd.extend(['--target', target]) fetch_cmd.append(artifact_path) - fetch_cmd.append(tmpdir) + fetch_cmd.append(str(tmpdir)) print("Running: " + ' '.join(fetch_cmd)) try: subprocess.check_output(fetch_cmd, stderr=subprocess.STDOUT) @@ -47,8 +55,8 @@ def fetch_artifacts(target, build_id, artifact_path): def repo_for_sdk(filename): module = filename.split('-')[0] target_dir = '' - if module == 'media': return 'prebuilts/module_sdk/Media' - if module == 'tethering': return 'prebuilts/module_sdk/Connectivity' + if module == 'media': return Path('prebuilts/module_sdk/Media') + if module == 'tethering': return Path('prebuilts/module_sdk/Connectivity') for dir in os.listdir('prebuilts/module_sdk/'): if module.lower() in dir.lower(): if target_dir: @@ -57,7 +65,7 @@ def repo_for_sdk(filename): if not target_dir: fail('Could not find a target dir for %s' % filename) - return 'prebuilts/module_sdk/%s' % target_dir + return Path('prebuilts/module_sdk/%s' % target_dir) def dir_for_sdk(filename, version): base = str(version) @@ -74,35 +82,56 @@ parser = argparse.ArgumentParser(description=('Finalize an extension SDK with pr parser.add_argument('-f', '--finalize_sdk', type=int, required=True, help='The numbered SDK to finalize.') parser.add_argument('-b', '--bug', type=int, required=True, help='The bug number to add to the commit message.') parser.add_argument('-a', '--amend_last_commit', action="store_true", help='Amend current HEAD commits instead of making new commits.') +parser.add_argument('-m', '--modules', action='append', help='Modules to include. Can be provided multiple times, or not at all for all modules.') parser.add_argument('bid', help='Build server build ID') args = parser.parse_args() +build_target = BUILD_TARGET_TRAIN if args.bid[0] == 'T' else BUILD_TARGET_CONTINUOUS branch_name = 'finalize-%d' % args.finalize_sdk -cmdline = " ".join(filter(lambda x: x not in ['-a', '--amend_last_commit'], sys.argv)) +cmdline = " ".join([x for x in sys.argv if x not in ['-a', '--amend_last_commit']]) commit_message = COMMIT_TEMPLATE % (args.finalize_sdk, args.bid, cmdline, args.bug) - -tmpdir = fetch_artifacts(BUILD_TARGET, args.bid, ARTIFACT_PATTERN % args.finalize_sdk) - -created_dirs = defaultdict(list) - -for f in os.listdir(tmpdir): - repo = repo_for_sdk(f) - dir = dir_for_sdk(f, args.finalize_sdk) - target_dir = os.path.join(repo, dir) - if os.path.isfile(target_dir): - print('Removing existing dir %s' % target_dir) - shutil.rmtree(target_dir) - with zipfile.ZipFile(os.path.join(tmpdir, f)) as zipFile: - zipFile.extractall(target_dir) - - print('Created %s' % target_dir) - created_dirs[repo].append(dir) +module_names = args.modules +if not module_names: + module_names = ['*'] + +compat_dir = COMPAT_REPO.joinpath('extensions/%d' % args.finalize_sdk) +if compat_dir.is_dir(): + print('Removing existing dir %s' % compat_dir) + shutil.rmtree(compat_dir) + +created_dirs = defaultdict(set) +for m in module_names: + tmpdir = fetch_artifacts(build_target, args.bid, ARTIFACT_PATTERN.format(module_name=m)) + for f in tmpdir.iterdir(): + repo = repo_for_sdk(f.name) + dir = dir_for_sdk(f.name, args.finalize_sdk) + target_dir = repo.joinpath(dir) + if target_dir.is_dir(): + print('Removing existing dir %s' % target_dir) + shutil.rmtree(target_dir) + with zipfile.ZipFile(tmpdir.joinpath(f)) as zipFile: + zipFile.extractall(target_dir) + + # Just capture the artifacts, not the bp files of finalized versions + os.remove(target_dir.joinpath('Android.bp')) + + print('Created %s' % target_dir) + created_dirs[repo].add(dir) + + # Copy api txt files to compat tracking dir + txt_files = [Path(p) for p in glob.glob(os.path.join(target_dir, 'sdk_library/*/*.txt'))] + for txt_file in txt_files: + api_type = txt_file.parts[-2] + dest_dir = compat_dir.joinpath(api_type, 'api') + os.makedirs(dest_dir, exist_ok = True) + shutil.copy(txt_file, dest_dir) + created_dirs[COMPAT_REPO].add(dest_dir.relative_to(COMPAT_REPO)) subprocess.check_output(['repo', 'start', branch_name] + list(created_dirs.keys())) print('Running git commit') for repo in created_dirs: - git = ['git', '-C', repo] - subprocess.check_output(git + ['add'] + created_dirs[repo]) + git = ['git', '-C', str(repo)] + subprocess.check_output(git + ['add'] + list(created_dirs[repo])) if args.amend_last_commit: change_id = '\n' + re.search(r'Change-Id: [^\\n]+', str(subprocess.check_output(git + ['log', '-1']))).group(0) subprocess.check_output(git + ['commit', '--amend', '-m', commit_message + change_id]) |