xref: /aosp_15_r20/external/angle/third_party/abseil-cpp/roll_abseil.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*8975f5c5SAndroid Build Coastguard Worker
3*8975f5c5SAndroid Build Coastguard Worker"""Script to do the first step of Abseil roll into chromium.
4*8975f5c5SAndroid Build Coastguard Worker"""
5*8975f5c5SAndroid Build Coastguard Worker
6*8975f5c5SAndroid Build Coastguard Workerimport logging
7*8975f5c5SAndroid Build Coastguard Workerimport os
8*8975f5c5SAndroid Build Coastguard Workerimport re
9*8975f5c5SAndroid Build Coastguard Workerimport subprocess
10*8975f5c5SAndroid Build Coastguard Workerimport tempfile
11*8975f5c5SAndroid Build Coastguard Workerfrom datetime import datetime
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard WorkerABSL_URI = 'https://github.com/abseil/abseil-cpp.git'
14*8975f5c5SAndroid Build Coastguard Worker
15*8975f5c5SAndroid Build Coastguard Workerdef _PullAbseil(abseil_dir):
16*8975f5c5SAndroid Build Coastguard Worker  logging.info('Updating abseil...')
17*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['git', 'clone', ABSL_URI],
18*8975f5c5SAndroid Build Coastguard Worker                        cwd=abseil_dir)
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Workerdef _SyncChromium(chromium_dir):
21*8975f5c5SAndroid Build Coastguard Worker  logging.info('Updating chromium...')
22*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['git', 'checkout', 'main'], cwd=chromium_dir)
23*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['git', 'pull', '--rebase'], cwd=chromium_dir)
24*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['gclient', 'sync'], cwd=chromium_dir)
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Workerdef _UpdateChromiumReadme(readme_filename, abseil_dir):
28*8975f5c5SAndroid Build Coastguard Worker  logging.info('Updating ' + readme_filename)
29*8975f5c5SAndroid Build Coastguard Worker
30*8975f5c5SAndroid Build Coastguard Worker  stdout = subprocess.check_output(['git', 'log', '-n1', '--pretty=short'],
31*8975f5c5SAndroid Build Coastguard Worker                                   cwd=abseil_dir)
32*8975f5c5SAndroid Build Coastguard Worker  new_revision = re.search('commit\\s(.{40})', str(stdout)).group(1)
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker  with open(readme_filename, 'r+') as f:
35*8975f5c5SAndroid Build Coastguard Worker    content = f.read()
36*8975f5c5SAndroid Build Coastguard Worker    prefix = 'Revision: '
37*8975f5c5SAndroid Build Coastguard Worker    pos = content.find(prefix)
38*8975f5c5SAndroid Build Coastguard Worker    assert(pos > 0)
39*8975f5c5SAndroid Build Coastguard Worker    pos = pos + len(prefix)
40*8975f5c5SAndroid Build Coastguard Worker    old_revision = content[pos:pos+40]
41*8975f5c5SAndroid Build Coastguard Worker    f.seek(pos)
42*8975f5c5SAndroid Build Coastguard Worker    f.write(new_revision)
43*8975f5c5SAndroid Build Coastguard Worker
44*8975f5c5SAndroid Build Coastguard Worker  logging.info('Abseil old revision is ' + old_revision)
45*8975f5c5SAndroid Build Coastguard Worker  logging.info('Abseil new revision is ' + new_revision)
46*8975f5c5SAndroid Build Coastguard Worker  return old_revision[0:10] + '..' + new_revision[0:10]
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker
49*8975f5c5SAndroid Build Coastguard Workerdef _UpdateAbseilInChromium(abseil_dir, chromium_dir):
50*8975f5c5SAndroid Build Coastguard Worker logging.info('Syncing abseil in chromium/src/third_party...')
51*8975f5c5SAndroid Build Coastguard Worker exclude = [
52*8975f5c5SAndroid Build Coastguard Worker   '*BUILD.gn',
53*8975f5c5SAndroid Build Coastguard Worker   'DIR_METADATA',
54*8975f5c5SAndroid Build Coastguard Worker   'README.chromium',
55*8975f5c5SAndroid Build Coastguard Worker   'OWNERS',
56*8975f5c5SAndroid Build Coastguard Worker   '.gitignore',
57*8975f5c5SAndroid Build Coastguard Worker   '.git',
58*8975f5c5SAndroid Build Coastguard Worker   '*.gni',
59*8975f5c5SAndroid Build Coastguard Worker   '*clang-format',
60*8975f5c5SAndroid Build Coastguard Worker   'patches/*',
61*8975f5c5SAndroid Build Coastguard Worker   'patches',
62*8975f5c5SAndroid Build Coastguard Worker   'absl_hardening_test.cc',
63*8975f5c5SAndroid Build Coastguard Worker   'roll_abseil.py',
64*8975f5c5SAndroid Build Coastguard Worker   'generate_def_files.py',
65*8975f5c5SAndroid Build Coastguard Worker   '*.def',
66*8975f5c5SAndroid Build Coastguard Worker ]
67*8975f5c5SAndroid Build Coastguard Worker params = ['rsync', '-aP', abseil_dir, os.path.join(chromium_dir, 'third_party'), '--delete']
68*8975f5c5SAndroid Build Coastguard Worker for e in exclude:
69*8975f5c5SAndroid Build Coastguard Worker   params.append('--exclude={}'.format(e))
70*8975f5c5SAndroid Build Coastguard Worker subprocess.check_call(params, cwd=chromium_dir)
71*8975f5c5SAndroid Build Coastguard Worker
72*8975f5c5SAndroid Build Coastguard Worker
73*8975f5c5SAndroid Build Coastguard Workerdef _PatchAbseil(abseil_in_chromium_dir):
74*8975f5c5SAndroid Build Coastguard Worker  logging.info('Patching abseil...')
75*8975f5c5SAndroid Build Coastguard Worker  for patch in os.listdir(os.path.join(abseil_in_chromium_dir, 'patches')):
76*8975f5c5SAndroid Build Coastguard Worker    subprocess.check_call(['patch', '--strip', '1', '-i', os.path.join(abseil_in_chromium_dir, 'patches', patch)])
77*8975f5c5SAndroid Build Coastguard Worker
78*8975f5c5SAndroid Build Coastguard Worker  os.remove(os.path.join(abseil_in_chromium_dir, 'absl', 'base', 'internal', 'dynamic_annotations.h'))
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Workerdef _Commit(chromium_dir, hash_diff):
82*8975f5c5SAndroid Build Coastguard Worker  logging.info('Commit...')
83*8975f5c5SAndroid Build Coastguard Worker  desc="""Roll abseil_revision {0}
84*8975f5c5SAndroid Build Coastguard Worker
85*8975f5c5SAndroid Build Coastguard WorkerChange Log:
86*8975f5c5SAndroid Build Coastguard Workerhttps://chromium.googlesource.com/external/github.com/abseil/abseil-cpp/+log/{0}
87*8975f5c5SAndroid Build Coastguard WorkerFull diff:
88*8975f5c5SAndroid Build Coastguard Workerhttps://chromium.googlesource.com/external/github.com/abseil/abseil-cpp/+/{0}
89*8975f5c5SAndroid Build Coastguard WorkerBug: None""".format(hash_diff)
90*8975f5c5SAndroid Build Coastguard Worker
91*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['git', 'add', 'third_party/abseil-cpp'], cwd=chromium_dir)
92*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['git', 'commit', '-m', desc], cwd=chromium_dir)
93*8975f5c5SAndroid Build Coastguard Worker
94*8975f5c5SAndroid Build Coastguard Worker  logging.info('Upload...')
95*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['git', 'cl', 'upload', '-m', desc, '--bypass-hooks'], cwd=chromium_dir)
96*8975f5c5SAndroid Build Coastguard Worker
97*8975f5c5SAndroid Build Coastguard Worker
98*8975f5c5SAndroid Build Coastguard Workerdef _Roll():
99*8975f5c5SAndroid Build Coastguard Worker  chromium_dir = os.getcwd()
100*8975f5c5SAndroid Build Coastguard Worker  abseil_in_chromium_dir = os.path.join(chromium_dir, 'third_party', 'abseil-cpp')
101*8975f5c5SAndroid Build Coastguard Worker  _SyncChromium(chromium_dir)
102*8975f5c5SAndroid Build Coastguard Worker
103*8975f5c5SAndroid Build Coastguard Worker  branch_name = datetime.today().strftime('rolling-absl-%Y%m%d')
104*8975f5c5SAndroid Build Coastguard Worker  logging.info('Creating branch ' + branch_name + ' for the roll...')
105*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(['git', 'checkout', '-b', branch_name], cwd=chromium_dir)
106*8975f5c5SAndroid Build Coastguard Worker
107*8975f5c5SAndroid Build Coastguard Worker  with tempfile.TemporaryDirectory() as abseil_root:
108*8975f5c5SAndroid Build Coastguard Worker    _PullAbseil(abseil_root)
109*8975f5c5SAndroid Build Coastguard Worker    abseil_dir = os.path.join(abseil_root, 'abseil-cpp')
110*8975f5c5SAndroid Build Coastguard Worker    _UpdateAbseilInChromium(abseil_dir, chromium_dir)
111*8975f5c5SAndroid Build Coastguard Worker    hash_diff = _UpdateChromiumReadme(os.path.join(abseil_in_chromium_dir, 'README.chromium'),
112*8975f5c5SAndroid Build Coastguard Worker                                      abseil_dir)
113*8975f5c5SAndroid Build Coastguard Worker
114*8975f5c5SAndroid Build Coastguard Worker  _PatchAbseil(abseil_in_chromium_dir)
115*8975f5c5SAndroid Build Coastguard Worker  _Commit(chromium_dir, hash_diff)
116*8975f5c5SAndroid Build Coastguard Worker
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
119*8975f5c5SAndroid Build Coastguard Worker  logging.getLogger().setLevel(logging.INFO)
120*8975f5c5SAndroid Build Coastguard Worker
121*8975f5c5SAndroid Build Coastguard Worker  if os.getcwd().endswith('src') and os.path.exists('chrome/browser'):
122*8975f5c5SAndroid Build Coastguard Worker    _Roll()
123*8975f5c5SAndroid Build Coastguard Worker
124*8975f5c5SAndroid Build Coastguard Worker    logging.info("Next step is manual: Fix BUILD.gn files to match BUILD.bazel changes.")
125*8975f5c5SAndroid Build Coastguard Worker    logging.info("After that run generate_def_files.py. ")
126*8975f5c5SAndroid Build Coastguard Worker  else:
127*8975f5c5SAndroid Build Coastguard Worker    logging.error('Run this script from a chromium/src/ directory.')
128*8975f5c5SAndroid Build Coastguard Worker
129*8975f5c5SAndroid Build Coastguard Worker
130