fetch_reclient_cfgs.py 3.3 KB

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