blob: c5c5f514348e5de65912b70485a0534ad64aad41 [file] [log] [blame]
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +01001#!/usr/bin/env python3
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +02002# Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
3# for details. All rights reserved. Use of this source code is governed by a
4# BSD-style license that can be found in the LICENSE file.
5
6import argparse
7import datetime
8import os.path
9import re
Søren Gjesse4062e9c2023-09-01 12:21:08 +020010import stat
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +020011import subprocess
12import sys
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +010013import urllib.request
Søren Gjesse2d6e9372020-11-04 08:17:28 +010014import xml.etree.ElementTree
Søren Gjesse975c5df2019-12-10 13:48:05 +010015import zipfile
Ian Zernycf1eb3c2020-09-24 08:27:23 +020016
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +020017import utils
18
Søren Gjesse448da112023-08-10 09:30:55 +020019R8_DEV_BRANCH = '8.3'
Ian Zerny59dfa4c2019-10-25 10:34:36 +020020R8_VERSION_FILE = os.path.join(
21 'src', 'main', 'java', 'com', 'android', 'tools', 'r8', 'Version.java')
Søren Gjesse27251592019-11-06 17:35:23 +010022THIS_FILE_RELATIVE = os.path.join('tools', 'r8_release.py')
Søren Gjesse376b74c2020-06-22 08:42:44 +020023GMAVEN_PUBLISHER = '/google/bin/releases/android-devtools/gmaven/publisher/gmaven-publisher'
Søren Gjesse975c5df2019-12-10 13:48:05 +010024
25DESUGAR_JDK_LIBS = 'desugar_jdk_libs'
26DESUGAR_JDK_LIBS_CONFIGURATION = DESUGAR_JDK_LIBS + '_configuration'
27ANDROID_TOOLS_PACKAGE = 'com.android.tools'
Ian Zerny59dfa4c2019-10-25 10:34:36 +020028
Søren Gjesse07b6aea2019-12-12 11:11:58 +010029GITHUB_DESUGAR_JDK_LIBS = 'https://github.com/google/desugar_jdk_libs'
Ian Zerny59dfa4c2019-10-25 10:34:36 +020030
Søren Gjesse4062e9c2023-09-01 12:21:08 +020031def install_gerrit_change_id_hook(checkout_dir):
32 with utils.ChangedWorkingDirectory(checkout_dir):
33 # Fancy way of getting the string ".git".
34 git_dir = subprocess.check_output(
35 ['git', 'rev-parse', '--git-dir']).decode('utf-8').strip()
36 commit_msg_hooks = '%s/hooks/commit-msg' % git_dir
37 if not os.path.exists(os.path.dirname(commit_msg_hooks)):
38 os.mkdir(os.path.dirname(commit_msg_hooks))
39 # Install commit hook to generate Gerrit 'Change-Id:'.
40 urllib.request.urlretrieve(
41 'https://gerrit-review.googlesource.com/tools/hooks/commit-msg',
42 commit_msg_hooks)
43 st = os.stat(commit_msg_hooks)
44 os.chmod(
45 commit_msg_hooks,
46 st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
47
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +010048def checkout_r8(temp, branch):
49 subprocess.check_call(['git', 'clone', utils.REPO_SOURCE, temp])
50 with utils.ChangedWorkingDirectory(temp):
51 subprocess.check_call([
52 'git',
53 'new-branch',
54 '--upstream',
55 'origin/%s' % branch,
56 'dev-release'])
Søren Gjesse4062e9c2023-09-01 12:21:08 +020057 install_gerrit_change_id_hook(temp)
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +010058 return temp
59
60
Ian Zerny59dfa4c2019-10-25 10:34:36 +020061def prepare_release(args):
62 if args.version:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +010063 print("Cannot manually specify version when making a dev release.")
Ian Zerny59dfa4c2019-10-25 10:34:36 +020064 sys.exit(1)
65
66 def make_release(args):
67 commithash = args.dev_release
68
69 with utils.TempDir() as temp:
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +010070 with utils.ChangedWorkingDirectory(checkout_r8(temp, R8_DEV_BRANCH)):
Ian Zerny59dfa4c2019-10-25 10:34:36 +020071 # Compute the current and new version on the branch.
72 result = None
73 for line in open(R8_VERSION_FILE, 'r'):
74 result = re.match(
75 r'.*LABEL = "%s\.(\d+)\-dev";' % R8_DEV_BRANCH, line)
76 if result:
77 break
78 if not result or not result.group(1):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +010079 print('Failed to find version label matching %s(\d+)-dev'\
80 % R8_DEV_BRANCH)
Ian Zerny59dfa4c2019-10-25 10:34:36 +020081 sys.exit(1)
82 try:
83 patch_version = int(result.group(1))
84 except ValueError:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +010085 print('Failed to convert version to integer: %s' % result.group(1))
Ian Zerny59dfa4c2019-10-25 10:34:36 +020086
87 old_version = '%s.%s-dev' % (R8_DEV_BRANCH, patch_version)
88 version = '%s.%s-dev' % (R8_DEV_BRANCH, patch_version + 1)
89
Rico Wind1b52acf2021-03-21 12:36:55 +010090 # Verify that the merge point from main is not empty.
Ian Zerny59dfa4c2019-10-25 10:34:36 +020091 merge_diff_output = subprocess.check_output([
Søren Gjesse4062e9c2023-09-01 12:21:08 +020092 'git', 'diff', 'HEAD..%s' % commithash]).decode('utf-8')
Ian Zerny59dfa4c2019-10-25 10:34:36 +020093 other_diff = version_change_diff(
Rico Wind1b52acf2021-03-21 12:36:55 +010094 merge_diff_output, old_version, "main")
Ian Zerny59dfa4c2019-10-25 10:34:36 +020095 if not other_diff:
Rico Wind1b52acf2021-03-21 12:36:55 +010096 print('Merge point from main (%s)' % commithash, \
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +010097 'is the same as exiting release (%s).' % old_version)
Ian Zerny59dfa4c2019-10-25 10:34:36 +020098 sys.exit(1)
99
Søren Gjesse4062e9c2023-09-01 12:21:08 +0200100 subprocess.check_call([
101 'git', 'cl', 'new-branch', 'release-%s' % version])
102
Rico Wind140a5642019-11-26 10:44:21 +0100103 if args.dev_pre_cherry_pick:
104 for pre_commit in args.dev_pre_cherry_pick:
105 subprocess.check_call([
106 'git', 'cherry-pick', '--no-edit', pre_commit])
107
Rico Wind1b52acf2021-03-21 12:36:55 +0100108 # Merge the desired commit from main on to the branch.
Søren Gjesse4062e9c2023-09-01 12:21:08 +0200109 subprocess.check_call(['git', 'merge', '--no-ff', '--no-edit', commithash])
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200110
111 # Rewrite the version, commit and validate.
112 sed(old_version, version, R8_VERSION_FILE)
113
114 subprocess.check_call([
Ian Zerny3224c812019-11-01 08:12:04 +0100115 'git', 'commit', '-a', '-m', 'Version %s' % version])
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200116
117 version_diff_output = subprocess.check_output([
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100118 'git', 'diff', '%s..HEAD' % commithash]).decode('utf-8')
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200119
Rico Wind1b52acf2021-03-21 12:36:55 +0100120 validate_version_change_diff(version_diff_output, "main", version)
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200121
Søren Gjesse4062e9c2023-09-01 12:21:08 +0200122 maybe_check_call(args, ['git', 'cl', 'upload', '--no-squash'])
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200123
Søren Gjesse4062e9c2023-09-01 12:21:08 +0200124 if args.dry_run:
125 input(
126 'DryRun: check %s for content of version %s [enter to continue]:'
127 % (temp, version))
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200128
Søren Gjesse4062e9c2023-09-01 12:21:08 +0200129 return "%s dev version %s from hash %s for review" % (
130 'DryRun: omitted upload of' if args.dry_run else 'Uploaded',
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200131 version,
132 commithash)
133
134 return make_release
135
136
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100137def maybe_tag(args, version):
138 maybe_check_call(args, [
139 'git', 'tag', '-a', version, '-m', '"%s"' % version])
140 maybe_check_call(args, [
141 'git', 'push', 'origin', 'refs/tags/%s' % version])
142
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +0100143
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200144def version_change_diff(diff, old_version, new_version):
145 invalid_line = None
Søren Gjesse25ef5522021-05-05 08:17:00 +0200146 for line in str(diff).splitlines():
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200147 if line.startswith('- ') and \
148 line != '- public static final String LABEL = "%s";' % old_version:
149 invalid_line = line
150 elif line.startswith('+ ') and \
151 line != '+ public static final String LABEL = "%s";' % new_version:
152 invalid_line = line
153 return invalid_line
154
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100155
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100156def validate_version_change_diff(version_diff_output, old_version, new_version):
157 invalid = version_change_diff(version_diff_output, old_version, new_version)
158 if invalid:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100159 print("Unexpected diff:")
160 print("=" * 80)
161 print(version_diff_output)
162 print("=" * 80)
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100163 accept_string = 'THE DIFF IS OK!'
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100164 answer = input(
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100165 "Accept the additonal diff as part of the release? "
166 "Type '%s' to accept: " % accept_string)
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100167 if answer != accept_string:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100168 print("You did not type '%s'" % accept_string)
169 print('Aborting dev release for %s' % version)
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100170 sys.exit(1)
171
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200172
173def maybe_check_call(args, cmd):
174 if args.dry_run:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100175 print('DryRun:', ' '.join(cmd))
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200176 else:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100177 print(' '.join(cmd))
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200178 return subprocess.check_call(cmd)
179
180
Ian Zerny8c5f7b42023-05-25 11:24:05 +0200181def update_prebuilds(r8_checkout, version, checkout, keepanno=False):
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +0100182 path = os.path.join(r8_checkout, 'tools', 'update_prebuilds_in_android.py')
Ian Zernydaf04ba2021-02-24 10:48:15 +0100183 commit_arg = '--commit_hash=' if len(version) == 40 else '--version='
Ian Zerny8c5f7b42023-05-25 11:24:05 +0200184 cmd = [path, '--targets=lib', '--maps', commit_arg + version, checkout]
185 if keepanno:
186 cmd.append("--keepanno")
187 subprocess.check_call(cmd)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200188
189
Ian Zerny8c5f7b42023-05-25 11:24:05 +0200190def release_studio_or_aosp(r8_checkout, path, options, git_message, keepanno=False):
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200191 with utils.ChangedWorkingDirectory(path):
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100192 if not options.use_existing_work_branch:
193 subprocess.call(['repo', 'abandon', 'update-r8'])
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200194 if not options.no_sync:
Ian Zerny25cccae2019-10-21 11:07:24 +0200195 subprocess.check_call(['repo', 'sync', '-cq', '-j', '16'])
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200196
197 prebuilts_r8 = os.path.join(path, 'prebuilts', 'r8')
198
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100199 if not options.use_existing_work_branch:
200 with utils.ChangedWorkingDirectory(prebuilts_r8):
201 subprocess.check_call(['repo', 'start', 'update-r8'])
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200202
Ian Zerny8c5f7b42023-05-25 11:24:05 +0200203 update_prebuilds(r8_checkout, options.version, path, keepanno)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200204
205 with utils.ChangedWorkingDirectory(prebuilts_r8):
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100206 if not options.use_existing_work_branch:
207 subprocess.check_call(['git', 'commit', '-a', '-m', git_message])
208 else:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100209 print('Not committing when --use-existing-work-branch. '
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100210 + 'Commit message should be:\n\n'
211 + git_message
212 + '\n')
213 # Don't upload if requested not to, or if changes are not committed due
214 # to --use-existing-work-branch
215 if not options.no_upload and not options.use_existing_work_branch:
Rico Windc04d3082023-05-25 09:59:18 +0200216 process = subprocess.Popen(['repo', 'upload', '.', '--verify',
217 '--current-branch'],
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100218 stdin=subprocess.PIPE)
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100219 return process.communicate(input=b'y\n')[0]
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200220
221
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200222def prepare_aosp(args):
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200223 assert args.version
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +0200224 assert os.path.exists(args.aosp), "Could not find AOSP path %s" % args.aosp
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200225
226 def release_aosp(options):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100227 print("Releasing for AOSP")
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200228 if options.dry_run:
229 return 'DryRun: omitting AOSP release for %s' % options.version
230
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200231 git_message = ("""Update D8 and R8 to %s
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200232
Morten Krogh-Jespersendbbf9a82020-08-11 21:38:08 +0200233Version: %s
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200234This build IS NOT suitable for preview or public release.
235
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200236Built here: go/r8-releases/raw/%s
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200237
238Test: TARGET_PRODUCT=aosp_arm64 m -j core-oj"""
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200239 % (args.version, args.version, args.version))
Søren Gjessec15a7f72023-06-09 12:29:16 +0200240 # Fixes to Android U branch is based of 8.2.2-dev where the keepanno library
241 # is not built.
242 keepanno = not args.version.startswith('8.2.2-udc')
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +0100243 return release_studio_or_aosp(
Søren Gjessec15a7f72023-06-09 12:29:16 +0200244 utils.REPO_ROOT, args.aosp, options, git_message, keepanno=keepanno)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200245
246 return release_aosp
247
248
Søren Gjesse376b74c2020-06-22 08:42:44 +0200249def prepare_maven(args):
250 assert args.version
251
252 def release_maven(options):
Søren Gjesseb093b672020-06-23 16:23:10 +0200253 gfile = '/bigstore/r8-releases/raw/%s/r8lib.zip' % args.version
254 release_id = gmaven_publisher_stage(options, [gfile])
Søren Gjesse376b74c2020-06-22 08:42:44 +0200255
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100256 print("Staged Release ID " + release_id + ".\n")
Søren Gjesseb093b672020-06-23 16:23:10 +0200257 gmaven_publisher_stage_redir_test_info(
258 release_id, "com.android.tools:r8:%s" % args.version, "r8lib.jar")
Søren Gjesse376b74c2020-06-22 08:42:44 +0200259
260 print
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100261 answer = input("Continue with publishing [y/N]:")
Søren Gjesse376b74c2020-06-22 08:42:44 +0200262
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100263 if answer != 'y':
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100264 print('Aborting release to Google maven')
Søren Gjesse376b74c2020-06-22 08:42:44 +0200265 sys.exit(1)
266
267 gmaven_publisher_publish(args, release_id)
268
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100269 print("")
270 print("Published. Use the email workflow for approval.")
Søren Gjesse376b74c2020-06-22 08:42:44 +0200271
272 return release_maven
273
Ian Zernyacfaf292020-09-24 07:14:56 +0200274# ------------------------------------------------------ column 70 --v
Ian Zernycf1eb3c2020-09-24 08:27:23 +0200275def git_message_dev(version, bugs):
Morten Krogh-Jespersendbbf9a82020-08-11 21:38:08 +0200276 return """Update D8 R8 to %s
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200277
Ian Zernyacfaf292020-09-24 07:14:56 +0200278This is a development snapshot, it's fine to use for studio canary
279build, but not for BETA or release, for those we would need a release
280version of R8 binaries. This build IS suitable for preview release
281but IS NOT suitable for public release.
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200282
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200283Built here: go/r8-releases/raw/%s
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200284Test: ./gradlew check
Ian Zernyfec00092022-03-16 08:25:07 +0100285Bug: %s""" % (version, version, '\nBug: '.join(map(bug_fmt, bugs)))
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200286
287
Morten Krogh-Jespersena1396cd2019-10-02 16:14:40 +0200288def git_message_release(version, bugs):
289 return """D8 R8 version %s
290
291Built here: go/r8-releases/raw/%s/
292Test: ./gradlew check
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +0100293
Ian Zernyfec00092022-03-16 08:25:07 +0100294Bug: %s""" % (version, version, '\nBug: '.join(map(bug_fmt, bugs)))
Morten Krogh-Jespersena1396cd2019-10-02 16:14:40 +0200295
Ian Zernyfec00092022-03-16 08:25:07 +0100296def bug_fmt(bug):
297 return "b/%s" % bug
Morten Krogh-Jespersena1396cd2019-10-02 16:14:40 +0200298
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200299def prepare_studio(args):
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200300 assert args.version
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +0200301 assert os.path.exists(args.studio), ("Could not find STUDIO path %s"
302 % args.studio)
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200303
304 def release_studio(options):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100305 print("Releasing for STUDIO")
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200306 if options.dry_run:
307 return 'DryRun: omitting studio release for %s' % options.version
308
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +0100309 if 'dev' in options.version:
Ian Zernycf1eb3c2020-09-24 08:27:23 +0200310 git_message = git_message_dev(options.version, options.bug)
Morten Krogh-Jespersend86a3012020-02-21 15:06:13 +0100311 r8_checkout = utils.REPO_ROOT
312 return release_studio_or_aosp(
313 r8_checkout, args.studio, options, git_message)
314 else:
315 with utils.TempDir() as temp:
316 checkout_r8(temp, options.version[0:options.version.rindex('.')])
317 git_message = git_message_release(options.version, options.bug)
318 return release_studio_or_aosp(temp, args.studio, options, git_message)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200319
320 return release_studio
321
322
323def g4_cp(old, new, file):
324 subprocess.check_call('g4 cp {%s,%s}/%s' % (old, new, file), shell=True)
325
326
327def g4_open(file):
Søren Gjesse08967662020-05-06 19:46:32 +0200328 if not os.access(file, os.W_OK):
329 subprocess.check_call('g4 open %s' % file, shell=True)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200330
331
Rico Wind8d008ca2020-04-22 12:13:15 +0200332def g4_change(version):
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200333 return subprocess.check_output(
Rico Wind8d008ca2020-04-22 12:13:15 +0200334 'g4 change --desc "Update R8 to version %s\n"' % (version),
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100335 shell=True).decode('utf-8')
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200336
Morten Krogh-Jespersen1f2f5142020-09-21 11:20:23 +0200337def get_cl_id(c4_change_output):
338 startIndex = c4_change_output.find('Change ') + len('Change ')
339 endIndex = c4_change_output.find(' ', startIndex)
340 cl = c4_change_output[startIndex:endIndex]
341 assert cl.isdigit()
342 return cl
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200343
344def sed(pattern, replace, path):
345 with open(path, "r") as sources:
346 lines = sources.readlines()
347 with open(path, "w") as sources:
348 for line in lines:
349 sources.write(re.sub(pattern, replace, line))
350
351
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +0200352def download_file(version, file, dst):
Ian Zerny86c4cfd2022-01-17 13:43:37 +0100353 dir = 'raw' if len(version) != 40 else 'raw/main'
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100354 urllib.request.urlretrieve(
Ian Zerny86c4cfd2022-01-17 13:43:37 +0100355 ('https://storage.googleapis.com/r8-releases/%s/%s/%s' % (dir, version, file)),
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200356 dst)
357
Søren Gjesseb093b672020-06-23 16:23:10 +0200358def download_gfile(gfile, dst):
359 if not gfile.startswith('/bigstore/r8-releases'):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100360 print('Unexpected gfile prefix for %s' % gfile)
Søren Gjesseb093b672020-06-23 16:23:10 +0200361 sys.exit(1)
362
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100363 urllib.request.urlretrieve(
Søren Gjesseb093b672020-06-23 16:23:10 +0200364 'https://storage.googleapis.com/%s' % gfile[len('/bigstore/'):],
365 dst)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200366
367def blaze_run(target):
368 return subprocess.check_output(
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100369 'blaze run %s' % target, shell=True, stderr=subprocess.STDOUT).decode('utf-8')
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200370
371
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200372def prepare_google3(args):
373 assert args.version
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200374 # Check if an existing client exists.
Søren Gjesse7e0ef852019-12-04 13:52:33 +0100375 if not args.use_existing_work_branch:
Søren Gjesse08967662020-05-06 19:46:32 +0200376 check_no_google3_client(args, args.p4_client)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200377
378 def release_google3(options):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100379 print("Releasing for Google 3")
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200380 if options.dry_run:
381 return 'DryRun: omitting g3 release for %s' % options.version
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200382
383 google3_base = subprocess.check_output(
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100384 ['p4', 'g4d', '-f', args.p4_client]).decode('utf-8').rstrip()
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200385 third_party_r8 = os.path.join(google3_base, 'third_party', 'java', 'r8')
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200386 today = datetime.date.today()
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200387 with utils.ChangedWorkingDirectory(third_party_r8):
Rico Wind8d008ca2020-04-22 12:13:15 +0200388 # download files
389 g4_open('full.jar')
390 g4_open('src.jar')
391 g4_open('lib.jar')
392 g4_open('lib.jar.map')
Morten Krogh-Jespersen04527942022-08-02 13:50:11 +0200393 g4_open('retrace_full.jar')
Morten Krogh-Jespersen98ee89a2021-10-25 20:59:02 +0200394 g4_open('retrace_lib.jar')
Morten Krogh-Jespersen04527942022-08-02 13:50:11 +0200395 g4_open('retrace_lib.jar.map')
Rico Wind369a21c2020-08-25 14:47:05 +0200396 g4_open('desugar_jdk_libs_configuration.jar')
Rico Wind8d008ca2020-04-22 12:13:15 +0200397 download_file(options.version, 'r8-full-exclude-deps.jar', 'full.jar')
Morten Krogh-Jespersen04527942022-08-02 13:50:11 +0200398 download_file(options.version, 'r8-full-exclude-deps.jar', 'retrace_full.jar')
Rico Wind8d008ca2020-04-22 12:13:15 +0200399 download_file(options.version, 'r8-src.jar', 'src.jar')
400 download_file(options.version, 'r8lib-exclude-deps.jar', 'lib.jar')
401 download_file(
402 options.version, 'r8lib-exclude-deps.jar.map', 'lib.jar.map')
Morten Krogh-Jespersen04527942022-08-02 13:50:11 +0200403 download_file(
404 options.version, 'r8lib-exclude-deps.jar.map', 'retrace_lib.jar.map')
Rico Wind369a21c2020-08-25 14:47:05 +0200405 download_file(options.version, 'desugar_jdk_libs_configuration.jar',
406 'desugar_jdk_libs_configuration.jar')
Morten Krogh-Jespersen98ee89a2021-10-25 20:59:02 +0200407 download_file(options.version, 'r8retrace-exclude-deps.jar', 'retrace_lib.jar')
Rico Wind8d008ca2020-04-22 12:13:15 +0200408 g4_open('METADATA')
Søren Gjessee4f90c62022-06-27 12:47:45 +0200409 metadata_path = os.path.join(third_party_r8, 'METADATA')
410 match_count = 0
411 version_match_regexp = r'[1-9]\.[0-9]{1,2}\.[0-9]{1,3}-dev'
412 for line in open(metadata_path, 'r'):
413 result = re.search(version_match_regexp, line)
414 if result:
415 match_count = match_count + 1
Christoffer Quist Adamsende104252023-08-24 13:22:27 +0200416 if match_count != 7:
417 print((
418 "Could not find the previous -dev release string to replace in "
419 + "METADATA. Expected to find is mentioned 7 times, but "
420 + "found %s occurrences. Please update %s manually and run "
421 + "again with options --google3 "
422 + "--use-existing-work-branch.")
423 % (match_count, metadata_path))
Søren Gjessee4f90c62022-06-27 12:47:45 +0200424 sys.exit(1)
425 sed(version_match_regexp, options.version, metadata_path)
Rico Wind8d008ca2020-04-22 12:13:15 +0200426 sed(r'\{ year.*\}',
427 ('{ year: %i month: %i day: %i }'
428 % (today.year, today.month, today.day)),
Søren Gjessee4f90c62022-06-27 12:47:45 +0200429 metadata_path)
Rico Wind8d008ca2020-04-22 12:13:15 +0200430 subprocess.check_output('chmod u+w *', shell=True)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200431
432 with utils.ChangedWorkingDirectory(google3_base):
433 blaze_result = blaze_run('//third_party/java/r8:d8 -- --version')
434
435 assert options.version in blaze_result
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200436
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100437 if not options.no_upload:
Morten Krogh-Jespersen1f2f5142020-09-21 11:20:23 +0200438 change_result = g4_change(options.version)
439 change_result += 'Run \'(g4d ' + args.p4_client \
440 + ' && tap_presubmit -p all --train -c ' \
Søren Gjesse8a5f3df2021-06-09 14:48:40 +0200441 + get_cl_id(change_result) + ')\' for running TAP global' \
442 + ' presubmit using the train.\n' \
443 + 'Run \'(g4d ' + args.p4_client \
444 + ' && tap_presubmit -p all --notrain --detach --email' \
445 + ' --skip_flaky_targets --skip_already_failing -c ' \
446 + get_cl_id(change_result) + ')\' for running an isolated' \
447 + ' TAP global presubmit.'
Morten Krogh-Jespersen1f2f5142020-09-21 11:20:23 +0200448 return change_result
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200449
450 return release_google3
451
452
Morten Krogh-Jespersen04527942022-08-02 13:50:11 +0200453def prepare_google3_retrace(args):
454 assert args.version
455 # Check if an existing client exists.
456 if not args.use_existing_work_branch:
457 check_no_google3_client(args, args.p4_client)
458
459 def release_google3_retrace(options):
460 print("Releasing Retrace for Google 3")
461 if options.dry_run:
462 return 'DryRun: omitting g3 release for %s' % options.version
463
464 google3_base = subprocess.check_output(
465 ['p4', 'g4d', '-f', args.p4_client]).decode('utf-8').rstrip()
466 third_party_r8 = os.path.join(google3_base, 'third_party', 'java', 'r8')
467 with utils.ChangedWorkingDirectory(third_party_r8):
468 # download files
469 g4_open('retrace_full.jar')
470 g4_open('retrace_lib.jar')
471 g4_open('retrace_lib.jar.map')
472 download_file(options.version, 'r8-full-exclude-deps.jar', 'retrace_full.jar')
473 download_file(options.version, 'r8retrace-exclude-deps.jar', 'retrace_lib.jar')
474 download_file(
475 options.version, 'r8lib-exclude-deps.jar.map', 'retrace_lib.jar.map')
476 g4_open('METADATA')
477 metadata_path = os.path.join(third_party_r8, 'METADATA')
478 match_count = 0
479 version_match_regexp = r'[1-9]\.[0-9]{1,2}\.[0-9]{1,3}-dev/r8retrace-exclude-deps.jar'
480 for line in open(metadata_path, 'r'):
481 result = re.search(version_match_regexp, line)
482 if result:
483 match_count = match_count + 1
484 if match_count != 1:
485 print(("Could not find the previous retrace release string to replace in " +
486 "METADATA. Expected to find is mentioned 1 times. Please update %s " +
487 "manually and run again with options --google3retrace " +
488 "--use-existing-work-branch.") % metadata_path)
489 sys.exit(1)
490 sed(version_match_regexp, options.version + "/r8retrace-exclude-deps.jar", metadata_path)
491 subprocess.check_output('chmod u+w *', shell=True)
492
493 with utils.ChangedWorkingDirectory(google3_base):
494 blaze_result = blaze_run('//third_party/java/r8:retrace -- --version')
495
496 print(blaze_result)
497 assert options.version in blaze_result
498
499 if not options.no_upload:
500 change_result = g4_change(options.version)
501 change_result += 'Run \'(g4d ' + args.p4_client \
502 + ' && tap_presubmit -p all --train -c ' \
503 + get_cl_id(change_result) + ')\' for running TAP global' \
504 + ' presubmit using the train.\n' \
505 + 'Run \'(g4d ' + args.p4_client \
506 + ' && tap_presubmit -p all --notrain --detach --email' \
507 + ' --skip_flaky_targets --skip_already_failing -c ' \
508 + get_cl_id(change_result) + ')\' for running an isolated' \
509 + ' TAP global presubmit.'
510 return change_result
511
512 return release_google3_retrace
513
Søren Gjesse73355ec2020-06-29 09:19:44 +0200514def update_desugar_library_in_studio(args):
515 assert os.path.exists(args.studio), ("Could not find STUDIO path %s"
516 % args.studio)
517
518 def make_release(args):
519 library_version = args.update_desugar_library_in_studio[0]
520 configuration_version = args.update_desugar_library_in_studio[1]
521 change_name = 'update-desugar-library-dependencies'
522
523 with utils.ChangedWorkingDirectory(args.studio):
524 if not args.use_existing_work_branch:
525 subprocess.call(['repo', 'abandon', change_name])
526 if not args.no_sync:
527 subprocess.check_call(['repo', 'sync', '-cq', '-j', '16'])
528
529 cmd = ['tools/base/bazel/bazel',
530 'run',
531 '//tools/base/bazel:add_dependency',
532 '--',
533 '--repo=https://maven.google.com com.android.tools:desugar_jdk_libs:%s' % library_version]
534 utils.PrintCmd(cmd)
535 subprocess.check_call(" ".join(cmd), shell=True)
536 cmd = ['tools/base/bazel/bazel', 'shutdown']
537 utils.PrintCmd(cmd)
538 subprocess.check_call(cmd)
539
540 prebuilts_tools = os.path.join(args.studio, 'prebuilts', 'tools')
541 with utils.ChangedWorkingDirectory(prebuilts_tools):
542 if not args.use_existing_work_branch:
543 with utils.ChangedWorkingDirectory(prebuilts_tools):
544 subprocess.check_call(['repo', 'start', change_name])
545 m2_dir = os.path.join(
546 'common', 'm2', 'repository', 'com', 'android', 'tools')
547 subprocess.check_call(
548 ['git',
549 'add',
550 os.path.join(m2_dir, DESUGAR_JDK_LIBS, library_version)])
551 subprocess.check_call(
552 ['git',
553 'add',
554 os.path.join(
555 m2_dir, DESUGAR_JDK_LIBS_CONFIGURATION, configuration_version)])
556
557 git_message = ("""Update library desugaring dependencies
558
559 com.android.tools:desugar_jdk_libs:%s
560 com.android.tools:desugar_jdk_libs_configuration:%s
561
562Bug: %s
563Test: L8ToolTest, L8DexDesugarTest"""
564 % (library_version,
565 configuration_version,
Ian Zernyfec00092022-03-16 08:25:07 +0100566 '\nBug: '.join(map(bug_fmt, args.bug))))
Søren Gjesse73355ec2020-06-29 09:19:44 +0200567
568 if not args.use_existing_work_branch:
569 subprocess.check_call(['git', 'commit', '-a', '-m', git_message])
570 else:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100571 print('Not committing when --use-existing-work-branch. '
Søren Gjesse73355ec2020-06-29 09:19:44 +0200572 + 'Commit message should be:\n\n'
573 + git_message
574 + '\n')
575 # Don't upload if requested not to, or if changes are not committed due
576 # to --use-existing-work-branch
577 if not args.no_upload and not args.use_existing_work_branch:
578 process = subprocess.Popen(['repo', 'upload', '.', '--verify'],
579 stdin=subprocess.PIPE)
580 return process.communicate(input='y\n')[0]
581
582 return make_release
583
584
Søren Gjesse975c5df2019-12-10 13:48:05 +0100585def prepare_desugar_library(args):
586
587 def make_release(args):
588 library_version = args.desugar_library[0]
Søren Gjesseb093b672020-06-23 16:23:10 +0200589 configuration_version = args.desugar_library[1]
Søren Gjesse975c5df2019-12-10 13:48:05 +0100590
Søren Gjessee78b1652022-06-30 12:38:36 +0200591 # TODO(b/237636871): Cleanup and generalize.
Søren Gjesse3e459092023-01-05 09:40:28 +0100592 if (not (library_version.startswith('1.1')
593 or library_version.startswith('1.2')
594 or library_version.startswith('2.0'))):
Søren Gjessee78b1652022-06-30 12:38:36 +0200595 print("Release script does not support desugared library version %s"
596 % library_version)
597 sys.exit(1)
598
Søren Gjesse3e459092023-01-05 09:40:28 +0100599 postfixes = ['']
600 if library_version.startswith('1.2'):
601 postfixes = ['_legacy']
602 if library_version.startswith('2.0'):
603 postfixes = ['_minimal', '', '_nio']
Søren Gjesseb093b672020-06-23 16:23:10 +0200604
Søren Gjesse975c5df2019-12-10 13:48:05 +0100605 with utils.TempDir() as temp:
606 with utils.ChangedWorkingDirectory(temp):
Søren Gjesse3e459092023-01-05 09:40:28 +0100607 artifacts = []
608 for postfix in postfixes:
609 group_postfix = ('' if postfix == '_legacy' else postfix)
610 archive_postfix = (postfix if library_version.startswith('1.1') else '_jdk11' + postfix)
611 library_jar = DESUGAR_JDK_LIBS + postfix + '.jar'
612 library_archive = DESUGAR_JDK_LIBS + archive_postfix + '.zip'
613 configuration_archive = DESUGAR_JDK_LIBS_CONFIGURATION + archive_postfix + '.zip'
614 library_gfile = ('/bigstore/r8-releases/raw/%s/%s/%s'
615 % (DESUGAR_JDK_LIBS + group_postfix, library_version, library_archive))
616 configuration_gfile = ('/bigstore/r8-releases/raw/main/%s/%s'
617 % (configuration_version, configuration_archive))
Søren Gjesse975c5df2019-12-10 13:48:05 +0100618
Søren Gjesse3e459092023-01-05 09:40:28 +0100619 download_gfile(library_gfile, library_archive)
620 download_gfile(configuration_gfile, configuration_archive)
621 check_configuration(configuration_archive, group_postfix)
622 artifacts.append(library_gfile)
623 artifacts.append(configuration_gfile)
Søren Gjesseb093b672020-06-23 16:23:10 +0200624
Søren Gjesse3e459092023-01-05 09:40:28 +0100625 release_id = gmaven_publisher_stage(args, artifacts)
Søren Gjesseb093b672020-06-23 16:23:10 +0200626
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100627 print("Staged Release ID " + release_id + ".\n")
Søren Gjessef637d9d2022-08-24 15:32:55 +0200628 library_artifact_id = \
629 '%s:%s:%s' % (ANDROID_TOOLS_PACKAGE, DESUGAR_JDK_LIBS, library_version)
Søren Gjesseb093b672020-06-23 16:23:10 +0200630 gmaven_publisher_stage_redir_test_info(
631 release_id,
Søren Gjessef637d9d2022-08-24 15:32:55 +0200632 library_artifact_id,
Søren Gjesseb093b672020-06-23 16:23:10 +0200633 library_jar)
634
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100635 print("")
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100636 answer = input("Continue with publishing [y/N]:")
Søren Gjesse975c5df2019-12-10 13:48:05 +0100637
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100638 if answer != 'y':
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100639 print('Aborting release to Google maven')
Søren Gjesseb093b672020-06-23 16:23:10 +0200640 sys.exit(1)
Søren Gjesse975c5df2019-12-10 13:48:05 +0100641
Søren Gjesseb093b672020-06-23 16:23:10 +0200642 gmaven_publisher_publish(args, release_id)
643
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100644 print("")
645 print("Published. Use the email workflow for approval.")
Søren Gjesse975c5df2019-12-10 13:48:05 +0100646
647 return make_release
648
649
Søren Gjesse3e459092023-01-05 09:40:28 +0100650def check_configuration(configuration_archive, postfix):
Søren Gjesseb093b672020-06-23 16:23:10 +0200651 zip = zipfile.ZipFile(configuration_archive)
Søren Gjesse975c5df2019-12-10 13:48:05 +0100652 zip.extractall()
653 dirs = os.listdir(
Søren Gjesse3e459092023-01-05 09:40:28 +0100654 os.path.join('com', 'android', 'tools', DESUGAR_JDK_LIBS_CONFIGURATION + postfix))
Søren Gjesse975c5df2019-12-10 13:48:05 +0100655 if len(dirs) != 1:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100656 print('Unexpected archive content, %s' + dirs)
Søren Gjesse975c5df2019-12-10 13:48:05 +0100657 sys.exit(1)
658
659 version = dirs[0]
660 pom_file = os.path.join(
661 'com',
662 'android',
663 'tools',
Søren Gjesse3e459092023-01-05 09:40:28 +0100664 DESUGAR_JDK_LIBS_CONFIGURATION + postfix,
Søren Gjesse975c5df2019-12-10 13:48:05 +0100665 version,
Søren Gjesse3e459092023-01-05 09:40:28 +0100666 '%s-%s.pom' % (DESUGAR_JDK_LIBS_CONFIGURATION + postfix, version))
Søren Gjesse975c5df2019-12-10 13:48:05 +0100667 version_from_pom = extract_version_from_pom(pom_file)
668 if version != version_from_pom:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100669 print('Version mismatch, %s != %s' % (version, version_from_pom))
Søren Gjesse975c5df2019-12-10 13:48:05 +0100670 sys.exit(1)
Søren Gjesse07b6aea2019-12-12 11:11:58 +0100671
672def check_no_google3_client(args, client_name):
673 if not args.use_existing_work_branch:
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100674 clients = subprocess.check_output('g4 myclients', shell=True).decode('utf-8')
Søren Gjesse07b6aea2019-12-12 11:11:58 +0100675 if ':%s:' % client_name in clients:
Søren Gjessee4f90c62022-06-27 12:47:45 +0200676 if args.delete_work_branch:
677 subprocess.check_call('g4 citc -d -f %s' % client_name, shell=True)
678 else:
679 print(("Remove the existing '%s' client before continuing " +
680 "(force delete: 'g4 citc -d -f %s'), " +
681 "or use either --use-existing-work-branch or " +
682 "--delete-work-branch.") % (client_name, client_name))
683 sys.exit(1)
Søren Gjesse07b6aea2019-12-12 11:11:58 +0100684
685
Søren Gjesse975c5df2019-12-10 13:48:05 +0100686def extract_version_from_pom(pom_file):
687 ns = "http://maven.apache.org/POM/4.0.0"
688 xml.etree.ElementTree.register_namespace('', ns)
689 tree = xml.etree.ElementTree.ElementTree()
690 tree.parse(pom_file)
691 return tree.getroot().find("{%s}version" % ns).text
692
Søren Gjesse376b74c2020-06-22 08:42:44 +0200693
694GMAVEN_PUBLISH_STAGE_RELEASE_ID_PATTERN = re.compile('Release ID = ([0-9a-f\-]+)')
695
Søren Gjesseb093b672020-06-23 16:23:10 +0200696
697def gmaven_publisher_stage(args, gfiles):
Søren Gjesse376b74c2020-06-22 08:42:44 +0200698 if args.dry_run:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100699 print('Dry-run, would have staged %s' % gfiles)
Søren Gjesse376b74c2020-06-22 08:42:44 +0200700 return 'dry-run-release-id'
701
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100702 print("Staging: %s" % ', '.join(gfiles))
703 print("")
Søren Gjesse376b74c2020-06-22 08:42:44 +0200704
Søren Gjesseb093b672020-06-23 16:23:10 +0200705 cmd = [GMAVEN_PUBLISHER, 'stage', '--gfile', ','.join(gfiles)]
Søren Gjesse376b74c2020-06-22 08:42:44 +0200706 output = subprocess.check_output(cmd)
707
708 # Expect output to contain:
709 # [INFO] 06/19/2020 09:35:12 CEST: >>>>>>>>>> Staged
710 # [INFO] 06/19/2020 09:35:12 CEST: Release ID = 9171d015-18f6-4a90-9984-1c362589dc1b
711 # [INFO] 06/19/2020 09:35:12 CEST: Stage Path = /bigstore/studio_staging/maven2/sgjesse/9171d015-18f6-4a90-9984-1c362589dc1b
712
Søren Gjesse7b151112021-02-16 14:32:32 +0100713 matches = GMAVEN_PUBLISH_STAGE_RELEASE_ID_PATTERN.findall(output.decode("utf-8"))
Søren Gjesse376b74c2020-06-22 08:42:44 +0200714 if matches == None or len(matches) > 1:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100715 print("Could not determine the release ID from the gmaven_publisher " +
716 "output. Expected a line with 'Release ID = <release id>'.")
717 print("Output was:")
718 print(output)
Søren Gjesse376b74c2020-06-22 08:42:44 +0200719 sys.exit(1)
720
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100721 print(output)
Søren Gjesse376b74c2020-06-22 08:42:44 +0200722
723 release_id = matches[0]
724 return release_id
725
Søren Gjesseb093b672020-06-23 16:23:10 +0200726
727def gmaven_publisher_stage_redir_test_info(release_id, artifact, dst):
728
729 redir_command = ("/google/data/ro/teams/android-devtools-infra/tools/redir "
730 + "--alsologtostderr "
Søren Gjesse44eee512021-09-24 11:44:11 +0200731 + "--gcs_bucket_path=/bigstore/gmaven-staging/${USER}/%s "
Søren Gjesseb093b672020-06-23 16:23:10 +0200732 + "--port=1480") % release_id
733
734 get_command = ("mvn org.apache.maven.plugins:maven-dependency-plugin:2.4:get "
735 + "-Dmaven.repo.local=/tmp/maven_repo_local "
736 + "-DremoteRepositories=http://localhost:1480 "
737 + "-Dartifact=%s "
738 + "-Ddest=%s") % (artifact, dst)
739
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100740 print("""To test the staged content with 'redir' run:
Søren Gjesseb093b672020-06-23 16:23:10 +0200741
742%s
743
Søren Gjessee78b1652022-06-30 12:38:36 +0200744Then add the following repository to settings.gradle to search the 'redir'
745repository:
Søren Gjesseb093b672020-06-23 16:23:10 +0200746
Søren Gjessee78b1652022-06-30 12:38:36 +0200747dependencyResolutionManagement {
748 repositories {
749 maven {
750 url 'http://localhost:1480'
751 allowInsecureProtocol true
752 }
Søren Gjesse44eee512021-09-24 11:44:11 +0200753 }
Søren Gjessee78b1652022-06-30 12:38:36 +0200754}
755
756and add the following repository to gradle.build for for the staged version:
757
758dependencies {
759 coreLibraryDesugaring('%s') {
760 changing = true
Søren Gjesseb093b672020-06-23 16:23:10 +0200761 }
762}
763
764Use this commands to get artifact from 'redir':
765
766rm -rf /tmp/maven_repo_local
767%s
Søren Gjesse44eee512021-09-24 11:44:11 +0200768""" % (redir_command, artifact, get_command))
Søren Gjesseb093b672020-06-23 16:23:10 +0200769
770
Søren Gjesse376b74c2020-06-22 08:42:44 +0200771def gmaven_publisher_publish(args, release_id):
Søren Gjesse376b74c2020-06-22 08:42:44 +0200772 if args.dry_run:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100773 print('Dry-run, would have published %s' % release_id)
Søren Gjesse376b74c2020-06-22 08:42:44 +0200774 return
775
776 cmd = [GMAVEN_PUBLISHER, 'publish', release_id]
777 output = subprocess.check_output(cmd)
Søren Gjesse975c5df2019-12-10 13:48:05 +0100778
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100779def branch_change_diff(diff, old_version, new_version):
780 invalid_line = None
Søren Gjesse25ef5522021-05-05 08:17:00 +0200781 for line in str(diff).splitlines():
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100782 if line.startswith('-R8') and \
783 line != "-R8_DEV_BRANCH = '%s'" % old_version:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100784 print(line)
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100785 invalid_line = line
786 elif line.startswith('+R8') and \
787 line != "+R8_DEV_BRANCH = '%s'" % new_version:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100788 print(line)
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100789 invalid_line = line
790 return invalid_line
791
792
793def validate_branch_change_diff(version_diff_output, old_version, new_version):
794 invalid = branch_change_diff(version_diff_output, old_version, new_version)
795 if invalid:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100796 print("")
797 print("The diff for the branch change in tools/release.py is not as expected:")
798 print("")
799 print("=" * 80)
800 print(version_diff_output)
801 print("=" * 80)
802 print("")
803 print("Validate the uploaded CL before landing.")
804 print("")
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100805
806
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100807def prepare_branch(args):
808 branch_version = args.new_dev_branch[0]
809 commithash = args.new_dev_branch[1]
810
811 current_semver = utils.check_basic_semver_version(
812 R8_DEV_BRANCH, ", current release branch version should be x.y", 2)
813 semver = utils.check_basic_semver_version(
814 branch_version, ", release branch version should be x.y", 2)
815 if not semver.larger_than(current_semver):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100816 print('New branch version "'
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100817 + branch_version
818 + '" must be strictly larger than the current "'
819 + R8_DEV_BRANCH
820 + '"')
821 sys.exit(1)
822
823 def make_branch(options):
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100824 with utils.TempDir() as temp:
825 subprocess.check_call(['git', 'clone', utils.REPO_SOURCE, temp])
826 with utils.ChangedWorkingDirectory(temp):
827 subprocess.check_call(['git', 'branch', branch_version, commithash])
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100828
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100829 subprocess.check_call(['git', 'checkout', branch_version])
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100830
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100831 # Rewrite the version, commit and validate.
Rico Wind1b52acf2021-03-21 12:36:55 +0100832 old_version = 'main'
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100833 full_version = branch_version + '.0-dev'
Søren Gjesse61d8bf42023-04-18 17:33:19 +0200834 version_prefix = 'public static final String LABEL = "'
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100835 sed(version_prefix + old_version,
836 version_prefix + full_version,
837 R8_VERSION_FILE)
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100838
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100839 subprocess.check_call([
840 'git', 'commit', '-a', '-m', 'Version %s' % full_version])
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100841
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100842 version_diff_output = subprocess.check_output([
843 'git', 'diff', '%s..HEAD' % commithash])
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100844
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100845 validate_version_change_diff(version_diff_output, old_version, full_version)
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100846
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100847 # Double check that we want to create a new release branch.
848 if not options.dry_run:
Christoffer Quist Adamsend408d8d2021-01-26 19:50:39 +0100849 answer = input('Create new branch for %s [y/N]:' % branch_version)
850 if answer != 'y':
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100851 print('Aborting new branch for %s' % branch_version)
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100852 sys.exit(1)
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100853
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100854 maybe_check_call(options, [
855 'git', 'push', 'origin', 'HEAD:%s' % branch_version])
856 maybe_tag(options, full_version)
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100857
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100858 print('Updating tools/r8_release.py to make new dev releases on %s'
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100859 % branch_version)
860
861 subprocess.check_call(['git', 'new-branch', 'update-release-script'])
862
863 # Check this file for the setting of the current dev branch.
864 result = None
Søren Gjesse27251592019-11-06 17:35:23 +0100865 for line in open(THIS_FILE_RELATIVE, 'r'):
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100866 result = re.match(
867 r"^R8_DEV_BRANCH = '(\d+).(\d+)'", line)
868 if result:
869 break
870 if not result or not result.group(1):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100871 print('Failed to find version label in %s' % THIS_FILE_RELATIVE)
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100872 sys.exit(1)
873
874 # Update this file with the new dev branch.
875 sed("R8_DEV_BRANCH = '%s.%s" % (result.group(1), result.group(2)),
876 "R8_DEV_BRANCH = '%s.%s" % (str(semver.major), str(semver.minor)),
Søren Gjesse27251592019-11-06 17:35:23 +0100877 THIS_FILE_RELATIVE)
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100878
Søren Gjesse27251592019-11-06 17:35:23 +0100879 message = \
880 'Prepare %s for branch %s' % (THIS_FILE_RELATIVE, branch_version)
Søren Gjesseddeb02e2019-11-06 15:48:07 +0100881 subprocess.check_call(['git', 'commit', '-a', '-m', message])
882
883 branch_diff_output = subprocess.check_output(['git', 'diff', 'HEAD~'])
884
885 validate_branch_change_diff(
886 branch_diff_output, R8_DEV_BRANCH, branch_version)
887
888 maybe_check_call(options, ['git', 'cl', 'upload', '-f', '-m', message])
889
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100890 print('')
891 print('Make sure to send out the branch change CL for review.')
892 print('')
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +0100893
894 return make_branch
895
896
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200897def parse_options():
898 result = argparse.ArgumentParser(description='Release r8')
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200899 group = result.add_mutually_exclusive_group()
900 group.add_argument('--dev-release',
Rico Wind1b52acf2021-03-21 12:36:55 +0100901 metavar=('<main hash>'),
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200902 help='The hash to use for the new dev version of R8')
Søren Gjesse975c5df2019-12-10 13:48:05 +0100903 group.add_argument('--version',
904 metavar=('<version>'),
905 help='The new version of R8 (e.g., 1.4.51) to release to selected channels')
906 group.add_argument('--desugar-library',
907 nargs=2,
908 metavar=('<version>', '<configuration hash>'),
909 help='The new version of com.android.tools:desugar_jdk_libs')
Søren Gjesse73355ec2020-06-29 09:19:44 +0200910 group.add_argument('--update-desugar-library-in-studio',
911 nargs=2,
912 metavar=('<version>', '<configuration version>'),
913 help='Update studio mirror of com.android.tools:desugar_jdk_libs')
Søren Gjesse975c5df2019-12-10 13:48:05 +0100914 group.add_argument('--new-dev-branch',
915 nargs=2,
Rico Wind1b52acf2021-03-21 12:36:55 +0100916 metavar=('<version>', '<main hash>'),
Søren Gjesse975c5df2019-12-10 13:48:05 +0100917 help='Create a new branch starting a version line (e.g. 2.0)')
Rico Wind140a5642019-11-26 10:44:21 +0100918 result.add_argument('--dev-pre-cherry-pick',
Rico Wind1b52acf2021-03-21 12:36:55 +0100919 metavar=('<main hash(s)>'),
Rico Wind140a5642019-11-26 10:44:21 +0100920 default=[],
921 action='append',
922 help='List of commits to cherry pick before doing full '
923 'merge, mostly used for reverting cherry picks')
Søren Gjesseb8dec612019-10-10 09:15:43 +0200924 result.add_argument('--no-sync', '--no_sync',
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200925 default=False,
926 action='store_true',
927 help='Do not sync repos before uploading')
Morten Krogh-Jespersena1396cd2019-10-02 16:14:40 +0200928 result.add_argument('--bug',
Søren Gjesse53539ae2019-11-06 09:47:01 +0100929 metavar=('<bug(s)>'),
Morten Krogh-Jespersena1396cd2019-10-02 16:14:40 +0200930 default=[],
931 action='append',
932 help='List of bugs for release version')
Søren Gjesse5aa4a682022-08-26 09:17:27 +0200933 result.add_argument('--no-bugs',
934 default=False,
935 action='store_true',
936 help='Allow Studio release without specifying any bugs')
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +0200937 result.add_argument('--studio',
Søren Gjesse53539ae2019-11-06 09:47:01 +0100938 metavar=('<path>'),
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +0200939 help='Release for studio by setting the path to a studio '
940 'checkout')
941 result.add_argument('--aosp',
Søren Gjesse53539ae2019-11-06 09:47:01 +0100942 metavar=('<path>'),
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +0200943 help='Release for aosp by setting the path to the '
944 'checkout')
Søren Gjesse376b74c2020-06-22 08:42:44 +0200945 result.add_argument('--maven',
946 default=False,
947 action='store_true',
948 help='Release to Google Maven')
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +0200949 result.add_argument('--google3',
950 default=False,
951 action='store_true',
952 help='Release for google 3')
Morten Krogh-Jespersen04527942022-08-02 13:50:11 +0200953 result.add_argument('--google3retrace',
954 default=False,
955 action='store_true',
956 help='Release retrace for google 3')
Søren Gjesse08967662020-05-06 19:46:32 +0200957 result.add_argument('--p4-client',
958 default='update-r8',
959 metavar=('<client name>'),
960 help='P4 client name for google 3')
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100961 result.add_argument('--use-existing-work-branch', '--use_existing_work_branch',
962 default=False,
963 action='store_true',
964 help='Use existing work branch/CL in aosp/studio/google3')
Søren Gjessee4f90c62022-06-27 12:47:45 +0200965 result.add_argument('--delete-work-branch', '--delete_work_branch',
966 default=False,
967 action='store_true',
968 help='Delete CL in google3')
Søren Gjesse5f90ec42019-12-02 16:03:51 +0100969 result.add_argument('--no-upload', '--no_upload',
970 default=False,
971 action='store_true',
972 help="Don't upload for code review")
Ian Zerny59dfa4c2019-10-25 10:34:36 +0200973 result.add_argument('--dry-run',
974 default=False,
975 action='store_true',
976 help='Only perform non-commiting tasks and print others.')
Søren Gjesse975c5df2019-12-10 13:48:05 +0100977 result.add_argument('--dry-run-output', '--dry_run_output',
978 default=os.getcwd(),
979 metavar=('<path>'),
980 help='Location for dry run output.')
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200981 args = result.parse_args()
Søren Gjesse5aa4a682022-08-26 09:17:27 +0200982 if (len(args.bug) > 0 and args.no_bugs):
983 print("Use of '--bug' and '--no-bugs' are mutually exclusive")
984 sys.exit(1)
985
Søren Gjesse376b74c2020-06-22 08:42:44 +0200986 if (args.studio
987 and args.version
988 and not 'dev' in args.version
Søren Gjesse5aa4a682022-08-26 09:17:27 +0200989 and args.bug == []
990 and not args.no_bugs):
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +0100991 print("When releasing a release version to Android Studio add the "
Søren Gjesse376b74c2020-06-22 08:42:44 +0200992 + "list of bugs by using '--bug'")
Morten Krogh-Jespersena1396cd2019-10-02 16:14:40 +0200993 sys.exit(1)
994
Morten Krogh-Jespersen52d3ab02019-10-29 08:57:06 +0100995 if args.version and not 'dev' in args.version and args.google3:
Ian Zerny86c4cfd2022-01-17 13:43:37 +0100996 print("WARNING: You should not roll a release version into google 3")
Morten Krogh-Jespersen52d3ab02019-10-29 08:57:06 +0100997
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +0200998 return args
999
1000
1001def main():
1002 args = parse_options()
1003 targets_to_run = []
Ian Zerny59dfa4c2019-10-25 10:34:36 +02001004
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +01001005 if args.new_dev_branch:
1006 if args.google3 or args.studio or args.aosp:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +01001007 print('Cannot create a branch and roll at the same time.')
Søren Gjesse4e5c6fe2019-11-05 17:17:43 +01001008 sys.exit(1)
1009 targets_to_run.append(prepare_branch(args))
1010
Ian Zerny59dfa4c2019-10-25 10:34:36 +02001011 if args.dev_release:
1012 if args.google3 or args.studio or args.aosp:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +01001013 print('Cannot create a dev release and roll at the same time.')
Ian Zerny59dfa4c2019-10-25 10:34:36 +02001014 sys.exit(1)
1015 targets_to_run.append(prepare_release(args))
1016
Søren Gjesse975c5df2019-12-10 13:48:05 +01001017 if (args.google3
Søren Gjesse376b74c2020-06-22 08:42:44 +02001018 or args.maven
Søren Gjesse975c5df2019-12-10 13:48:05 +01001019 or (args.studio and not args.no_sync)
Søren Gjesse53ef9172020-06-10 15:04:01 +02001020 or (args.desugar_library and not args.dry_run)):
Morten Krogh-Jespersenec3047b2020-08-18 13:09:06 +02001021 utils.check_gcert()
Søren Gjesseb8dec612019-10-10 09:15:43 +02001022
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +02001023 if args.google3:
Ian Zerny59dfa4c2019-10-25 10:34:36 +02001024 targets_to_run.append(prepare_google3(args))
Morten Krogh-Jespersen04527942022-08-02 13:50:11 +02001025 if args.google3retrace:
1026 targets_to_run.append(prepare_google3_retrace(args))
Søren Gjesse73355ec2020-06-29 09:19:44 +02001027 if args.studio and not args.update_desugar_library_in_studio:
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +02001028 targets_to_run.append(prepare_studio(args))
Morten Krogh-Jespersen00db27f2019-10-02 16:14:46 +02001029 if args.aosp:
Morten Krogh-Jespersenb4a7acc2019-10-02 10:46:32 +02001030 targets_to_run.append(prepare_aosp(args))
Søren Gjesse376b74c2020-06-22 08:42:44 +02001031 if args.maven:
1032 targets_to_run.append(prepare_maven(args))
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +02001033
Søren Gjesse975c5df2019-12-10 13:48:05 +01001034 if args.desugar_library:
1035 targets_to_run.append(prepare_desugar_library(args))
1036
Søren Gjesse73355ec2020-06-29 09:19:44 +02001037 if args.update_desugar_library_in_studio:
1038 if not args.studio:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +01001039 print("--studio required")
Søren Gjesse73355ec2020-06-29 09:19:44 +02001040 sys.exit(1)
1041 if args.bug == []:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +01001042 print("Update studio mirror of com.android.tools:desugar_jdk_libs "
Søren Gjesse73355ec2020-06-29 09:19:44 +02001043 + "requires at least one bug by using '--bug'")
1044 sys.exit(1)
1045 targets_to_run.append(update_desugar_library_in_studio(args))
1046
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +02001047 final_results = []
1048 for target_closure in targets_to_run:
1049 final_results.append(target_closure(args))
1050
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +01001051 print('\n\n**************************************************************')
1052 print('PRINTING SUMMARY')
1053 print('**************************************************************\n\n')
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +02001054
1055 for result in final_results:
1056 if result is not None:
Morten Krogh-Jespersen8a4d1ca2021-01-19 08:27:02 +01001057 print(result)
Morten Krogh-Jespersen1947a862019-09-26 14:06:48 +02001058
1059
1060if __name__ == '__main__':
1061 sys.exit(main())