blob: 9176de40e84980826f449f3fe725f6cc2885a382 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright (c) 2021 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.
"""This script is used to fetch reclient cfgs."""
import argparse
import glob
import os
import posixpath
import re
import shutil
import subprocess
import sys
THIS_DIR = os.path.abspath(os.path.dirname(__file__))
def ClangRevision():
sys.path.insert(0, os.path.join(THIS_DIR, '..', '..',
'tools', 'clang', 'scripts'))
import update
sys.path.pop(0)
return update.PACKAGE_VERSION
def NaclRevision():
nacl_dir = os.path.join(THIS_DIR, '..', '..', 'native_client')
if not os.path.exists(nacl_dir):
return None
return subprocess.check_output(
['git', 'log', '-1', '--format=%H'],
cwd= nacl_dir,
).decode('utf-8').strip()
def CipdEnsure(pkg_name, ref, directory):
print('ensure %s %s in %s' % (pkg_name, ref, directory))
output = subprocess.check_output(
['cipd', 'ensure', '-root', directory,
'-ensure-file', '-'],
input=('%s %s' % (pkg_name, ref)).encode('utf-8'))
print(output)
def RbeProjectFromEnv():
instance = os.environ.get('RBE_instance')
if not instance:
return None
m = re.fullmatch(r'projects/([-\w]+)/instances/[-\w]+', instance)
if not m:
return None
return m.group(1)
def main():
parser = argparse.ArgumentParser(description='fetch reclient cfgs')
parser.add_argument('--rbe_project',
help='RBE instance project id',
default=RbeProjectFromEnv())
parser.add_argument('--cipd_prefix',
help='cipd package name prefix',
default='infra_internal/rbe/reclient_cfgs')
args = parser.parse_args()
if not args.rbe_project:
print('RBE project is not specified')
return 1
print('fetch reclient_cfgs for RBE project %s...' % args.rbe_project)
cipd_prefix = posixpath.join(args.cipd_prefix, args.rbe_project)
tool_revisions = {
'chromium-browser-clang': ClangRevision(),
'nacl': NaclRevision()
}
for toolchain in tool_revisions:
revision = tool_revisions[toolchain]
if not revision:
print('failed to detect %s revision' % toolchain)
continue
CipdEnsure(posixpath.join(cipd_prefix, toolchain),
ref='revision/' + revision,
directory=os.path.join(THIS_DIR, toolchain))
if os.path.exists(os.path.join(THIS_DIR,
toolchain, 'win-cross-experiments')):
# copy in win-cross-experiments/toolchain
# as windows may not use symlinks.
wcedir = os.path.join(THIS_DIR, 'win-cross-experiments', toolchain)
if not os.path.exists(wcedir):
os.makedirs(wcedir, mode=0o755)
for cfg in glob.glob(os.path.join(THIS_DIR, toolchain,
'win-cross-experiments', '*.cfg')):
fname = os.path.join(wcedir, os.path.basename(cfg))
if os.path.exists(fname):
os.chmod(fname, 0o777)
os.remove(fname)
print('Copy from %s to %s...' % (cfg, fname))
shutil.copy(cfg, fname)
return 0
if __name__ == '__main__':
sys.exit(main())