Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | README = """ |
Yuqian Li | 5e9dfdb | 2017-11-10 11:58:01 -0500 | [diff] [blame] | 7 | Automatically add or remove a specific legacy flag to multiple Skia client repos. |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 8 | |
| 9 | This would only work on Google desktop. |
| 10 | |
| 11 | Example usage: |
Yuqian Li | 5e9dfdb | 2017-11-10 11:58:01 -0500 | [diff] [blame] | 12 | $ python toggle_legacy_flag.py SK_SUPPORT_LEGACY_SOMETHING \\ |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 13 | -a /data/android -c ~/chromium/src -g legacyflag |
| 14 | |
| 15 | If you only need to add the flag to one repo, for example, Android, please give |
| 16 | only -a (--android-dir) argument: |
Yuqian Li | 5e9dfdb | 2017-11-10 11:58:01 -0500 | [diff] [blame] | 17 | $ python toggle_legacy_flag.py SK_SUPPORT_LEGACY_SOMETHING -a /data/android |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 18 | |
| 19 | """ |
| 20 | |
| 21 | import os, sys |
| 22 | import argparse |
| 23 | import subprocess |
| 24 | import getpass |
| 25 | from random import randint |
| 26 | |
| 27 | |
| 28 | ANDROID_TOOLS_DIR = os.path.join( |
| 29 | os.path.dirname(os.path.dirname(os.path.abspath(__file__))), |
| 30 | 'android') |
| 31 | |
| 32 | |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 33 | def toggle_android(args): |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 34 | sys.path.append(ANDROID_TOOLS_DIR) |
| 35 | import upload_to_android |
| 36 | |
Yuqian Li | ee6784d | 2017-10-31 10:14:25 -0400 | [diff] [blame] | 37 | modifier = upload_to_android.AndroidLegacyFlagModifier(args.flag) |
| 38 | upload_to_android.upload_to_android(args.android_dir, modifier) |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 39 | |
| 40 | |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 41 | def toggle_chromium(args): |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 42 | os.chdir(args.chromium_dir) |
| 43 | |
| 44 | branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) |
| 45 | branch = branch.strip() |
| 46 | |
| 47 | EXPECTED_STASH_OUT = "No local changes to save" |
| 48 | stash_output = subprocess.check_output(['git', 'stash']).strip() |
| 49 | |
| 50 | if branch != "master" or stash_output != EXPECTED_STASH_OUT: |
| 51 | print ("Please checkout a clean master branch at your chromium repo (%s) " |
| 52 | "before running this script") % args.chromium_dir |
| 53 | if stash_output != EXPECTED_STASH_OUT: |
| 54 | subprocess.check_call(['git', 'stash', 'pop']) |
| 55 | exit(1) |
| 56 | |
Yuqian Li | 427293c | 2017-11-06 17:46:40 -0500 | [diff] [blame] | 57 | # Update the repository to avoid conflicts |
| 58 | subprocess.check_call(['git', 'pull']) |
| 59 | subprocess.check_call(['gclient', 'sync']); |
| 60 | |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 61 | # Use random number to avoid branch name collision. |
| 62 | # We'll delete the branch in the end. |
| 63 | random = randint(1, 10000) |
| 64 | subprocess.check_call(['git', 'checkout', '-b', 'legacyflag_%d' % random]) |
| 65 | |
| 66 | try: |
| 67 | config_file = os.path.join('skia', 'config', 'SkUserConfig.h') |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 68 | with open(config_file) as f: |
| 69 | lines = f.readlines() |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 70 | |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 71 | flag_line = "#define %s\n" % args.flag |
| 72 | if flag_line in lines: |
| 73 | index = lines.index(flag_line) |
| 74 | del lines[index-1 : index +2] |
| 75 | verb = "Remove" |
| 76 | else: |
| 77 | separator = ( |
| 78 | "/////////////////////////" |
| 79 | " Imported from BUILD.gn and skia_common.gypi\n") |
| 80 | content = ("#ifndef {0}\n" |
| 81 | "#define {0}\n" |
| 82 | "#endif\n\n").format(args.flag) |
| 83 | lines.insert(lines.index(separator), content) |
| 84 | verb = "Add" |
| 85 | |
| 86 | with open(config_file, 'w') as f: |
| 87 | for line in lines: |
| 88 | f.write(line) |
| 89 | |
| 90 | message = "%s %s" % (verb, args.flag) |
| 91 | |
| 92 | subprocess.check_call('git commit -a -m "%s"' % message, shell=True) |
| 93 | subprocess.check_call('git cl upload -m "%s" -f' % message, |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 94 | shell=True) |
| 95 | finally: |
| 96 | subprocess.check_call(['git', 'checkout', 'master']) |
| 97 | subprocess.check_call(['git', 'branch', '-D', 'legacyflag_%d' % random]) |
| 98 | |
| 99 | |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 100 | def toggle_google3(args): |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 101 | G3_SCRIPT_DIR = os.path.expanduser("~/skia-g3/scripts") |
| 102 | if not os.path.isdir(G3_SCRIPT_DIR): |
| 103 | print ("Google3 directory unavailable.\n" |
| 104 | "Please see " |
| 105 | "https://sites.google.com/a/google.com/skia/rebaseline#g3_flag " |
| 106 | "for Google3 setup.") |
| 107 | exit(1) |
| 108 | sys.path.append(G3_SCRIPT_DIR) |
| 109 | import citc_flag |
| 110 | |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 111 | citc_flag.toggle_google3(args.google3, args.flag) |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 112 | |
| 113 | |
| 114 | def main(): |
| 115 | if len(sys.argv) <= 1 or sys.argv[1] == '-h' or sys.argv[1] == '--help': |
| 116 | print README |
| 117 | |
| 118 | parser = argparse.ArgumentParser() |
| 119 | parser.add_argument( |
| 120 | '--android-dir', '-a', required=False, |
| 121 | help='Directory where an Android checkout will be created (if it does ' |
| 122 | 'not already exist). Note: ~1GB space will be used.') |
| 123 | parser.add_argument( |
| 124 | '--chromium-dir', '-c', required=False, |
| 125 | help='Directory of an EXISTING Chromium checkout (e.g., ~/chromium/src)') |
| 126 | parser.add_argument( |
| 127 | '--google3', '-g', required=False, |
| 128 | help='Google3 workspace to be created (if it does not already exist).') |
| 129 | parser.add_argument('flag', type=str, help='legacy flag name') |
| 130 | |
| 131 | args = parser.parse_args() |
| 132 | |
| 133 | if not args.android_dir and not args.chromium_dir and not args.google3: |
| 134 | print """ |
| 135 | Nothing to do. Please give me at least one of these three arguments: |
| 136 | -a (--android-dir) |
| 137 | -c (--chromium-dir) |
| 138 | -g (--google3) |
| 139 | """ |
| 140 | exit(1) |
| 141 | |
| 142 | end_message = "CLs generated. Now go review and land them:\n" |
| 143 | if args.chromium_dir: |
| 144 | args.chromium_dir = os.path.expanduser(args.chromium_dir) |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 145 | toggle_chromium(args) |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 146 | end_message += " * https://chromium-review.googlesource.com\n" |
| 147 | if args.google3: |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 148 | toggle_google3(args) |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 149 | end_message += " * http://goto.google.com/cl\n" |
| 150 | if args.android_dir: |
| 151 | args.android_dir = os.path.expanduser(args.android_dir) |
Yuqian Li | bb4b489 | 2017-11-08 13:00:08 -0500 | [diff] [blame] | 152 | toggle_android(args) |
Yuqian Li | 33e2fad | 2017-10-24 14:42:57 -0400 | [diff] [blame] | 153 | end_message += " * http://goto.google.com/androidcl\n" |
| 154 | |
| 155 | print end_message |
| 156 | |
| 157 | |
| 158 | if __name__ == '__main__': |
| 159 | main() |