aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/rebaseline/toggle_legacy_flag.py
blob: 80edeb2bc460fe494c31d7fdd283752c22e5088a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/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()