1#!/usr/bin/env python3 2# Copyright (c) 2021 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"""This script is used to fetch reclient cfgs.""" 7 8import argparse 9import glob 10import os 11import posixpath 12import re 13import shutil 14import subprocess 15import sys 16 17THIS_DIR = os.path.abspath(os.path.dirname(__file__)) 18 19def ClangRevision(): 20 sys.path.insert(0, os.path.join(THIS_DIR, '..', '..', 21 'tools', 'clang', 'scripts')) 22 import update 23 sys.path.pop(0) 24 return update.PACKAGE_VERSION 25 26def NaclRevision(): 27 nacl_dir = os.path.join(THIS_DIR, '..', '..', 'native_client') 28 if not os.path.exists(nacl_dir): 29 return None 30 return subprocess.check_output( 31 ['git', 'log', '-1', '--format=%H'], 32 cwd= nacl_dir, 33 ).decode('utf-8').strip() 34 35def CipdEnsure(pkg_name, ref, directory): 36 print('ensure %s %s in %s' % (pkg_name, ref, directory)) 37 output = subprocess.check_output( 38 ['cipd', 'ensure', '-root', directory, 39 '-ensure-file', '-'], 40 input=('%s %s' % (pkg_name, ref)).encode('utf-8')) 41 print(output) 42 43def RbeProjectFromEnv(): 44 instance = os.environ.get('RBE_instance') 45 if not instance: 46 return None 47 m = re.fullmatch(r'projects/([-\w]+)/instances/[-\w]+', instance) 48 if not m: 49 return None 50 return m.group(1) 51 52def main(): 53 parser = argparse.ArgumentParser(description='fetch reclient cfgs') 54 parser.add_argument('--rbe_project', 55 help='RBE instance project id', 56 default=RbeProjectFromEnv()) 57 parser.add_argument('--cipd_prefix', 58 help='cipd package name prefix', 59 default='infra_internal/rbe/reclient_cfgs') 60 61 args = parser.parse_args() 62 if not args.rbe_project: 63 print('RBE project is not specified') 64 return 1 65 66 print('fetch reclient_cfgs for RBE project %s...' % args.rbe_project) 67 68 cipd_prefix = posixpath.join(args.cipd_prefix, args.rbe_project) 69 70 tool_revisions = { 71 'chromium-browser-clang': ClangRevision(), 72 'nacl': NaclRevision() 73 } 74 for toolchain in tool_revisions: 75 revision = tool_revisions[toolchain] 76 if not revision: 77 print('failed to detect %s revision' % toolchain) 78 continue 79 80 CipdEnsure(posixpath.join(cipd_prefix, toolchain), 81 ref='revision/' + revision, 82 directory=os.path.join(THIS_DIR, toolchain)) 83 if os.path.exists(os.path.join(THIS_DIR, 84 toolchain, 'win-cross-experiments')): 85 # copy in win-cross-experiments/toolchain 86 # as windows may not use symlinks. 87 wcedir = os.path.join(THIS_DIR, 'win-cross-experiments', toolchain) 88 if not os.path.exists(wcedir): 89 os.makedirs(wcedir, mode=0o755) 90 for cfg in glob.glob(os.path.join(THIS_DIR, toolchain, 91 'win-cross-experiments', '*.cfg')): 92 fname = os.path.join(wcedir, os.path.basename(cfg)) 93 if os.path.exists(fname): 94 os.chmod(fname, 0o777) 95 os.remove(fname) 96 print('Copy from %s to %s...' % (cfg, fname)) 97 shutil.copy(cfg, fname) 98 99 return 0 100 101if __name__ == '__main__': 102 sys.exit(main()) 103