blob: 08fdac397c4a0c8db7f37b27fa037315f52ae887 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
import argparse
import os
import subprocess
import sys
import utils
def parse_options():
parser = argparse.ArgumentParser(description='Release r8')
parser.add_argument('--branch',
metavar=('<branch>'),
help='Branch to cherry-pick to')
parser.add_argument('--clean-checkout', '--clean_checkout',
default=False,
action='store_true',
help='Perform cherry picks in a clean checkout')
parser.add_argument('--no-upload', '--no_upload',
default=False,
action='store_true',
help='Do not upload to Gerrit')
parser.add_argument('hashes', metavar='<hash>', nargs='+',
help='Hashed to merge')
return parser.parse_args()
def run(args):
# Checkout the branch.
subprocess.check_output(['git', 'checkout', args.branch])
if (not args.clean_checkout):
for i in range(len(args.hashes) + 1):
branch = 'cherry-%d' % (i + 1)
print('Deleting branch %s' % branch)
subprocess.run(['git', 'branch', branch, '-D'])
count = 1
for hash in args.hashes:
branch = 'cherry-%d' % count
print('Cherry-picking %s in %s' % (hash, branch))
if (count == 1):
subprocess.run(['git', 'new-branch', branch, '--upstream', 'origin/%s' % args.branch])
else:
subprocess.run(['git', 'new-branch', branch, '--upstream-current'])
subprocess.run(['git', 'cherry-pick', hash])
question = ('Ready to continue (cwd %s, will not upload to Gerrit)' % os.getcwd()
if args.no_upload else
'Ready to upload %s (cwd %s)' % (branch, os.getcwd()))
answer = input(question + ' [y/N]?')
if answer != 'y':
print('Aborting new branch for %s' % branch_version)
sys.exit(1)
if (not args.no_upload):
subprocess.run(['git', 'cl', 'upload'])
count = count + 1
branch = 'cherry-%d' % count
subprocess.run(['git', 'new-branch', branch, '--upstream-current'])
editor = os.environ.get('VISUAL')
if not editor:
editor = os.environ.get('EDITOR')
if not editor:
editor = 'vi'
else:
print("Opening src/main/java/com/android/tools/r8/Version.java" +
" for version update with %" % editor)
subprocess.run([editor, 'src/main/java/com/android/tools/r8/Version.java'])
subprocess.run(['git', 'commit', '-a'])
if (not args.no_upload):
subprocess.run(['git', 'cl', 'upload'])
if (args.clean_checkout):
answer = input('Done, press enter to delete checkout in %s' % os.getcwd())
def main():
args = parse_options()
if (args.clean_checkout):
with utils.TempDir() as temp:
print("Performing cherry-picking in %s" % temp)
subprocess.check_call(['git', 'clone', utils.REPO_SOURCE, temp])
with utils.ChangedWorkingDirectory(temp):
run(args)
else:
# Run in current directory.
print("Performing cherry-picking in %s" % os.getcwd())
subprocess.check_output(['git', 'fetch', 'origin'])
run(args)
if __name__ == '__main__':
sys.exit(main())