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