• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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