| #!/usr/bin/env python |
| # Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| README = """ |
| Automatically add or remove a specific legacy flag to multiple Skia client repos. |
| |
| This would only work on Google desktop. |
| |
| Example usage: |
| $ python toggle_legacy_flag.py SK_SUPPORT_LEGACY_SOMETHING \\ |
| -a /data/android -c ~/chromium/src -g legacyflag |
| |
| If you only need to add the flag to one repo, for example, Android, please give |
| only -a (--android-dir) argument: |
| $ python toggle_legacy_flag.py SK_SUPPORT_LEGACY_SOMETHING -a /data/android |
| |
| """ |
| |
| import os, sys |
| import argparse |
| import subprocess |
| import getpass |
| from random import randint |
| |
| |
| ANDROID_TOOLS_DIR = os.path.join( |
| os.path.dirname(os.path.dirname(os.path.abspath(__file__))), |
| 'android') |
| |
| |
| def toggle_android(args): |
| sys.path.append(ANDROID_TOOLS_DIR) |
| import upload_to_android |
| |
| modifier = upload_to_android.AndroidLegacyFlagModifier(args.flag) |
| upload_to_android.upload_to_android(args.android_dir, modifier) |
| |
| |
| def toggle_chromium(args): |
| os.chdir(args.chromium_dir) |
| |
| branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) |
| branch = branch.strip() |
| |
| EXPECTED_STASH_OUT = "No local changes to save" |
| stash_output = subprocess.check_output(['git', 'stash']).strip() |
| |
| if branch != "master" or stash_output != EXPECTED_STASH_OUT: |
| print ("Please checkout a clean master branch at your chromium repo (%s) " |
| "before running this script") % args.chromium_dir |
| if stash_output != EXPECTED_STASH_OUT: |
| subprocess.check_call(['git', 'stash', 'pop']) |
| exit(1) |
| |
| # Update the repository to avoid conflicts |
| subprocess.check_call(['git', 'pull']) |
| subprocess.check_call(['gclient', 'sync']); |
| |
| # Use random number to avoid branch name collision. |
| # We'll delete the branch in the end. |
| random = randint(1, 10000) |
| subprocess.check_call(['git', 'checkout', '-b', 'legacyflag_%d' % random]) |
| |
| try: |
| config_file = os.path.join('skia', 'config', 'SkUserConfig.h') |
| with open(config_file) as f: |
| lines = f.readlines() |
| |
| flag_line = "#define %s\n" % args.flag |
| if flag_line in lines: |
| index = lines.index(flag_line) |
| del lines[index-1 : index +2] |
| verb = "Remove" |
| else: |
| separator = ( |
| "/////////////////////////" |
| " Imported from BUILD.gn and skia_common.gypi\n") |
| content = ("#ifndef {0}\n" |
| "#define {0}\n" |
| "#endif\n\n").format(args.flag) |
| lines.insert(lines.index(separator), content) |
| verb = "Add" |
| |
| with open(config_file, 'w') as f: |
| for line in lines: |
| f.write(line) |
| |
| message = "%s %s" % (verb, args.flag) |
| |
| subprocess.check_call('git commit -a -m "%s"' % message, shell=True) |
| subprocess.check_call('git cl upload -m "%s" -f' % message, |
| shell=True) |
| finally: |
| subprocess.check_call(['git', 'checkout', 'master']) |
| subprocess.check_call(['git', 'branch', '-D', 'legacyflag_%d' % random]) |
| |
| |
| def toggle_google3(args): |
| G3_SCRIPT_DIR = os.path.expanduser("~/skia-g3/scripts") |
| if not os.path.isdir(G3_SCRIPT_DIR): |
| print ("Google3 directory unavailable.\n" |
| "Please see " |
| "https://sites.google.com/a/google.com/skia/rebaseline#g3_flag " |
| "for Google3 setup.") |
| exit(1) |
| sys.path.append(G3_SCRIPT_DIR) |
| import citc_flag |
| |
| citc_flag.toggle_google3(args.google3, args.flag) |
| |
| |
| def main(): |
| if len(sys.argv) <= 1 or sys.argv[1] == '-h' or sys.argv[1] == '--help': |
| print README |
| |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| '--android-dir', '-a', required=False, |
| help='Directory where an Android checkout will be created (if it does ' |
| 'not already exist). Note: ~1GB space will be used.') |
| parser.add_argument( |
| '--chromium-dir', '-c', required=False, |
| help='Directory of an EXISTING Chromium checkout (e.g., ~/chromium/src)') |
| parser.add_argument( |
| '--google3', '-g', required=False, |
| help='Google3 workspace to be created (if it does not already exist).') |
| parser.add_argument('flag', type=str, help='legacy flag name') |
| |
| args = parser.parse_args() |
| |
| if not args.android_dir and not args.chromium_dir and not args.google3: |
| print """ |
| Nothing to do. Please give me at least one of these three arguments: |
| -a (--android-dir) |
| -c (--chromium-dir) |
| -g (--google3) |
| """ |
| exit(1) |
| |
| end_message = "CLs generated. Now go review and land them:\n" |
| if args.chromium_dir: |
| args.chromium_dir = os.path.expanduser(args.chromium_dir) |
| toggle_chromium(args) |
| end_message += " * https://chromium-review.googlesource.com\n" |
| if args.google3: |
| toggle_google3(args) |
| end_message += " * http://goto.google.com/cl\n" |
| if args.android_dir: |
| args.android_dir = os.path.expanduser(args.android_dir) |
| toggle_android(args) |
| end_message += " * http://goto.google.com/androidcl\n" |
| |
| print end_message |
| |
| |
| if __name__ == '__main__': |
| main() |