Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | |
Avi Drissman | 3f1ea44 | 2022-09-08 15:42:01 | [diff] [blame] | 3 | # Copyright 2020 The Chromium Authors |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 4 | # Use of this source code is governed by a BSD-style license that can be |
| 5 | # found in the LICENSE file. |
| 6 | """A script to generate build.gradle from template and run fetch_all.py |
| 7 | |
| 8 | More specifically, to generate build.gradle: |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 9 | - It downloads the index page for the latest androidx snapshot from |
| 10 | https://androidx.dev/snapshots/latest/artifacts |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 11 | - It replaces {{androidx_repository_url}} with the URL for the latest snapshot |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 12 | - For each dependency, it looks up the version in the index page's HTML and |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 13 | substitutes the version into {{androidx_dependency_version}}. |
Peter Wen | 2e5944d | 2025-02-04 17:02:32 | [diff] [blame] | 14 | |
| 15 | Extra args after -- are passed directly to fetch_all.py. |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 16 | """ |
| 17 | |
Haiyang Pan | ace50093 | 2022-01-26 19:49:03 | [diff] [blame] | 18 | import argparse |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 19 | import contextlib |
Mohamed Heikal | 811bb64 | 2025-02-25 20:03:53 | [diff] [blame] | 20 | import json |
Haiyang Pan | ace50093 | 2022-01-26 19:49:03 | [diff] [blame] | 21 | import logging |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 22 | import os |
Andrew Grieve | b5255af | 2024-06-06 17:03:18 | [diff] [blame] | 23 | import pathlib |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 24 | import re |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 25 | import shutil |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 26 | import sys |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 27 | import subprocess |
| 28 | import tempfile |
Peter Kotwicz | 4676d06 | 2020-10-22 06:04:13 | [diff] [blame] | 29 | from urllib import request |
Peter Wen | c90bbb7 | 2025-02-25 20:41:44 | [diff] [blame] | 30 | import zipfile |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 31 | |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 32 | _SRC_PATH = pathlib.Path(__file__).resolve().parents[2] |
| 33 | _ANDROIDX_PATH = _SRC_PATH / 'third_party/androidx' |
| 34 | _CIPD_PATH = _ANDROIDX_PATH / 'cipd' |
| 35 | _BOM_NAME = 'bill_of_materials.json' |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 36 | _EXTRACT_SCRIPT_PATH = _ANDROIDX_PATH / 'extract_and_commit_extras.py' |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 37 | |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 38 | sys.path.insert(1, str(_SRC_PATH / 'build/autoroll')) |
| 39 | import fetch_util |
| 40 | |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 41 | # URL to artifacts in latest androidx snapshot. |
| 42 | _ANDROIDX_LATEST_SNAPSHOT_ARTIFACTS_URL = 'https://androidx.dev/snapshots/latest/artifacts' |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 43 | |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 44 | # When androidx roller is breaking, and a fix is not imminent, use this to pin a |
Andrew Grieve | 2515bcbd | 2022-05-06 03:14:07 | [diff] [blame] | 45 | # broken library to an old known-working version. |
Andrew Grieve | 105fa413 | 2025-05-16 17:29:51 | [diff] [blame] | 46 | # * Find working versions from prior androidx roll commit descriptions. |
Andrew Grieve | a03217f | 2022-05-12 16:05:27 | [diff] [blame] | 47 | # * The first element of each tuple is the path to the artifact of the latest |
| 48 | # version of the library. It could change if the version is rev'ed in a new |
| 49 | # snapshot. |
| 50 | # * The second element is a URL to replace the file with. Find the URL for older |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 51 | # versions of libraries by looking through the artifacts for the older version |
| 52 | # (e.g.: https://androidx.dev/snapshots/builds/8545498/artifacts) |
Andrew Grieve | 2515bcbd | 2022-05-06 03:14:07 | [diff] [blame] | 53 | _OVERRIDES = [ |
Andrew Grieve | a03217f | 2022-05-12 16:05:27 | [diff] [blame] | 54 | # Example: |
Andrew Grieve | 2515bcbd | 2022-05-06 03:14:07 | [diff] [blame] | 55 | #('androidx_core_core/core-1.9.0-SNAPSHOT.aar', |
| 56 | # 'https://androidx.dev/snapshots/builds/8545498/artifacts/repository/' |
| 57 | # 'androidx/core/core/1.8.0-SNAPSHOT/core-1.8.0-20220505.122105-1.aar'), |
Andrew Grieve | 2515bcbd | 2022-05-06 03:14:07 | [diff] [blame] | 58 | ] |
| 59 | |
Andrew Grieve | 105fa413 | 2025-05-16 17:29:51 | [diff] [blame] | 60 | # Set this to the build_id to pin all libraries to a given version. |
| 61 | # Useful when pinning a single library would cause issues, but you do not want |
| 62 | # to pause the auto-roller because other teams want to add / remove libraries. |
| 63 | # Example: '8545498' |
| 64 | _LATEST_VERSION_OVERRIDE = '' |
| 65 | |
| 66 | |
Peter Wen | ba01695b | 2025-03-03 18:29:46 | [diff] [blame] | 67 | _FILES_TO_COMMIT = [ |
| 68 | 'additional_readme_paths.json', |
| 69 | 'bill_of_materials.json', |
| 70 | 'BUILD.gn', |
| 71 | 'build.gradle', |
| 72 | ] |
Peter Wen | 19a6870 | 2025-03-03 20:41:31 | [diff] [blame] | 73 | |
Peter Kotwicz | 3fb0070e | 2021-02-11 07:37:35 | [diff] [blame] | 74 | |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 75 | def _get_latest_androidx_version(): |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 76 | androidx_artifacts_response = request.urlopen( |
| 77 | _ANDROIDX_LATEST_SNAPSHOT_ARTIFACTS_URL) |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 78 | # Get the versioned url from the redirect destination. |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 79 | androidx_artifacts_url = androidx_artifacts_response.url |
| 80 | androidx_artifacts_response.close() |
| 81 | logging.info('URL for the latest build info: %s', androidx_artifacts_url) |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 82 | # Strip '/repository' from pattern. |
| 83 | resolved_snapshot_repository_url_pattern = ( |
Peter Wen | f52e4a4 | 2025-05-07 13:37:27 | [diff] [blame] | 84 | fetch_util.make_androidx_maven_url('([0-9]*)').rsplit('/', 1)[0]) |
Peter Wen | 1a004a0 | 2025-01-28 23:04:46 | [diff] [blame] | 85 | match = re.match(resolved_snapshot_repository_url_pattern, |
| 86 | androidx_artifacts_url) |
| 87 | assert match is not None |
| 88 | version = match.group(1) |
Andrew Grieve | f4aa0e26 | 2025-05-06 17:21:23 | [diff] [blame] | 89 | logging.info('Resolved latest androidx version to %s', version) |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 90 | return version |
| 91 | |
| 92 | |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 93 | def main(): |
Haiyang Pan | ace50093 | 2022-01-26 19:49:03 | [diff] [blame] | 94 | parser = argparse.ArgumentParser(description=__doc__) |
| 95 | parser.add_argument('-v', |
| 96 | '--verbose', |
| 97 | dest='verbose_count', |
| 98 | default=0, |
| 99 | action='count', |
| 100 | help='Verbose level (multiple times for more)') |
Andrew Grieve | 10bbd55 | 2022-05-05 18:10:26 | [diff] [blame] | 101 | parser.add_argument('--local-repo', |
| 102 | help='Path to a locally androidx maven repo to use ' |
| 103 | 'instead of fetching the latest.') |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 104 | parser.add_argument( |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 105 | '--local', |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 106 | action='store_true', |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 107 | help='If passed then we will run the extract_and_commit_extras.py ' |
| 108 | 'script and will not try rolling to the latest snapshot but reprocess ' |
| 109 | 'the project at the current androidx.dev snapshot.') |
Peter Wen | 1ba3d4d | 2025-02-25 21:46:37 | [diff] [blame] | 110 | parser.add_argument( |
| 111 | '--use-bom', |
| 112 | action='store_true', |
| 113 | help='If passed then we will use the existing bill_of_materials.json ' |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 114 | 'instead of resolving the latest androidx (faster but might resolve ' |
| 115 | 'incorrect versions if deps are added/removed).') |
Peter Wen | 2e5944d | 2025-02-04 17:02:32 | [diff] [blame] | 116 | args, extra_args = parser.parse_known_args() |
Haiyang Pan | ace50093 | 2022-01-26 19:49:03 | [diff] [blame] | 117 | |
| 118 | logging.basicConfig( |
| 119 | level=logging.WARNING - 10 * args.verbose_count, |
| 120 | format='%(levelname).1s %(relativeCreated)6d %(message)s') |
| 121 | |
Andrew Grieve | 10bbd55 | 2022-05-05 18:10:26 | [diff] [blame] | 122 | if args.local_repo: |
| 123 | version = 'local' |
Andrew Grieve | 10bbd55 | 2022-05-05 18:10:26 | [diff] [blame] | 124 | androidx_snapshot_repository_url = ('file://' + |
| 125 | os.path.abspath(args.local_repo)) |
| 126 | else: |
Andrew Grieve | 105fa413 | 2025-05-16 17:29:51 | [diff] [blame] | 127 | if _LATEST_VERSION_OVERRIDE: |
| 128 | version = _LATEST_VERSION_OVERRIDE |
| 129 | elif args.local: |
Andrew Grieve | f4aa0e26 | 2025-05-06 17:21:23 | [diff] [blame] | 130 | version = fetch_util.get_current_androidx_version() |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 131 | else: |
| 132 | version = _get_latest_androidx_version() |
Mohamed Heikal | 864fa34 | 2025-01-08 19:15:45 | [diff] [blame] | 133 | |
Andrew Grieve | f4aa0e26 | 2025-05-06 17:21:23 | [diff] [blame] | 134 | androidx_snapshot_repository_url = ( |
| 135 | fetch_util.make_androidx_maven_url(version)) |
Andrew Grieve | 9c7d4ac2f | 2022-08-24 17:38:59 | [diff] [blame] | 136 | # Prepend '0' to version to avoid conflicts with previous version format. |
| 137 | version = 'cr-0' + version |
| 138 | |
Peter Wen | 1ba3d4d | 2025-02-25 21:46:37 | [diff] [blame] | 139 | if args.use_bom: |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 140 | version_map_str = fetch_util.generate_version_map_str(_ANDROIDX_PATH / |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 141 | _BOM_NAME) |
Peter Wen | 1ba3d4d | 2025-02-25 21:46:37 | [diff] [blame] | 142 | else: |
| 143 | version_map_str = '' |
| 144 | |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 145 | fetch_util.fill_template( |
| 146 | _ANDROIDX_PATH / 'build.gradle.template', |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 147 | _ANDROIDX_PATH / 'build.gradle', |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 148 | version_overrides=version_map_str, |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 149 | androidx_repository_url=androidx_snapshot_repository_url) |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 150 | |
Andrew Grieve | 9c7d4ac2f | 2022-08-24 17:38:59 | [diff] [blame] | 151 | # Overrides do not work with local snapshots since the repository_url is |
| 152 | # different. |
| 153 | if not args.local_repo: |
| 154 | for subpath, url in _OVERRIDES: |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 155 | extra_args += ['--override-artifact', f'{subpath}:{url}'] |
Peter Kotwicz | a31339a | 2020-10-20 16:36:23 | [diff] [blame] | 156 | |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 157 | os.makedirs(_CIPD_PATH, exist_ok=True) |
Mohamed Heikal | 5bd8a84 | 2025-03-20 14:55:43 | [diff] [blame] | 158 | # gclient/cipd extract files as read only. |
| 159 | subprocess.run(['chmod', '-R', '+w', _CIPD_PATH]) |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 160 | |
| 161 | fetch_util.run_fetch_all(android_deps_dir=_ANDROIDX_PATH, |
| 162 | output_subdir='cipd', |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 163 | extra_args=extra_args, |
| 164 | verbose_count=args.verbose_count) |
| 165 | |
| 166 | version_map_str = fetch_util.generate_version_map_str(_CIPD_PATH / |
| 167 | _BOM_NAME) |
Mohamed Heikal | 811bb64 | 2025-02-25 20:03:53 | [diff] [blame] | 168 | |
| 169 | # Regenerate the build.gradle file filling in the the version map so that |
| 170 | # runs of the main project do not have to revalutate androidx versions. |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 171 | fetch_util.fill_template( |
| 172 | _ANDROIDX_PATH / 'build.gradle.template', |
| 173 | _CIPD_PATH / 'build.gradle', |
| 174 | version_overrides=version_map_str, |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 175 | androidx_repository_url=androidx_snapshot_repository_url) |
Mohamed Heikal | 811bb64 | 2025-02-25 20:03:53 | [diff] [blame] | 176 | |
Andrew Grieve | d8c9718 | 2024-06-28 18:37:33 | [diff] [blame] | 177 | version_txt_path = os.path.join(_CIPD_PATH, 'VERSION.txt') |
Andrew Grieve | 9c7d4ac2f | 2022-08-24 17:38:59 | [diff] [blame] | 178 | with open(version_txt_path, 'w') as f: |
| 179 | f.write(version) |
Peter Kotwicz | 92548aa | 2021-02-18 15:12:58 | [diff] [blame] | 180 | |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 181 | to_commit_zip_path = _CIPD_PATH / 'to_commit.zip' |
| 182 | file_map = {f: f'third_party/androidx/{f}' for f in _FILES_TO_COMMIT} |
| 183 | fetch_util.create_to_commit_zip(output_path=to_commit_zip_path, |
| 184 | package_root=_CIPD_PATH, |
| 185 | dirnames=['libs'], |
| 186 | absolute_file_map=file_map) |
Mohamed Heikal | 9aa653c | 2025-03-17 21:47:43 | [diff] [blame] | 187 | if args.local: |
Mohamed Heikal | 5bd8a84 | 2025-03-20 14:55:43 | [diff] [blame] | 188 | subprocess.run([ |
| 189 | _EXTRACT_SCRIPT_PATH, '--cipd-package-path', _CIPD_PATH, |
| 190 | '--no-git-add' |
| 191 | ], |
| 192 | check=True) |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 193 | |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 194 | fetch_util.write_cipd_yaml(package_root=_CIPD_PATH, |
Andrew Grieve | f4aa0e26 | 2025-05-06 17:21:23 | [diff] [blame] | 195 | package_name=fetch_util.ANDROIDX_CIPD_PACKAGE, |
Mohamed Heikal | 27da9af6 | 2025-03-12 19:59:45 | [diff] [blame] | 196 | version=version, |
| 197 | output_path=_CIPD_PATH / 'cipd.yaml') |
Peter Wen | 801b2fe | 2025-02-25 23:02:46 | [diff] [blame] | 198 | |
Peter Kotwicz | 2b85bd3d | 2020-10-01 22:29:49 | [diff] [blame] | 199 | if __name__ == '__main__': |
| 200 | main() |