util.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #!/usr/bin/env python3
  2. import contextlib
  3. import errno
  4. import json
  5. import os
  6. import shutil
  7. import subprocess
  8. import sys
  9. from urllib.request import urlopen
  10. import zipfile
  11. # from lib.config import is_verbose_mode
  12. def is_verbose_mode():
  13. return False
  14. ELECTRON_DIR = os.path.abspath(
  15. os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
  16. )
  17. TS_NODE = os.path.join(ELECTRON_DIR, 'node_modules', '.bin', 'ts-node')
  18. SRC_DIR = os.path.abspath(os.path.join(__file__, '..', '..', '..', '..'))
  19. if sys.platform in ['win32', 'cygwin']:
  20. TS_NODE += '.cmd'
  21. @contextlib.contextmanager
  22. def scoped_cwd(path):
  23. cwd = os.getcwd()
  24. os.chdir(path)
  25. try:
  26. yield
  27. finally:
  28. os.chdir(cwd)
  29. def download(text, url, path):
  30. safe_mkdir(os.path.dirname(path))
  31. with open(path, 'wb') as local_file:
  32. print("Downloading %s to %s" % (url, path))
  33. web_file = urlopen(url)
  34. info = web_file.info()
  35. if hasattr(info, 'getheader'):
  36. file_size = int(info.getheaders("Content-Length")[0])
  37. else:
  38. file_size = int(info.get("Content-Length")[0])
  39. downloaded_size = 0
  40. block_size = 4096
  41. ci = os.environ.get('CI') is not None
  42. while True:
  43. buf = web_file.read(block_size)
  44. if not buf:
  45. break
  46. downloaded_size += len(buf)
  47. local_file.write(buf)
  48. if not ci:
  49. percent = downloaded_size * 100. / file_size
  50. status = "\r%s %10d [%3.1f%%]" % (text, downloaded_size, percent)
  51. print(status, end=' ')
  52. if ci:
  53. print("%s done." % (text))
  54. else:
  55. print()
  56. return path
  57. def make_zip(zip_file_path, files, dirs):
  58. safe_unlink(zip_file_path)
  59. if sys.platform == 'darwin':
  60. allfiles = files + dirs
  61. execute(['zip', '-r', '-y', zip_file_path] + allfiles)
  62. else:
  63. zip_file = zipfile.ZipFile(zip_file_path, "w", zipfile.ZIP_DEFLATED,
  64. allowZip64=True)
  65. for filename in files:
  66. zip_file.write(filename, filename)
  67. for dirname in dirs:
  68. for root, _, filenames in os.walk(dirname):
  69. for f in filenames:
  70. zip_file.write(os.path.join(root, f))
  71. zip_file.close()
  72. def rm_rf(path):
  73. try:
  74. shutil.rmtree(path)
  75. except OSError:
  76. pass
  77. def safe_unlink(path):
  78. try:
  79. os.unlink(path)
  80. except OSError as e:
  81. if e.errno != errno.ENOENT:
  82. raise
  83. def safe_mkdir(path):
  84. try:
  85. os.makedirs(path)
  86. except OSError as e:
  87. if e.errno != errno.EEXIST:
  88. raise
  89. def execute(argv, env=None, cwd=None):
  90. if env is None:
  91. env = os.environ
  92. if is_verbose_mode():
  93. print(' '.join(argv))
  94. try:
  95. output = subprocess.check_output(argv, stderr=subprocess.STDOUT,
  96. env=env, cwd=cwd)
  97. if is_verbose_mode():
  98. print(output)
  99. return output
  100. except subprocess.CalledProcessError as e:
  101. print(e.output)
  102. raise e
  103. def get_electron_branding():
  104. SOURCE_ROOT = os.path.abspath(os.path.join(__file__, '..', '..', '..'))
  105. branding_file_path = os.path.join(
  106. SOURCE_ROOT, 'shell', 'app', 'BRANDING.json')
  107. with open(branding_file_path) as f:
  108. return json.load(f)
  109. cached_electron_version = None
  110. def get_electron_version():
  111. global cached_electron_version
  112. if cached_electron_version is None:
  113. cached_electron_version = str.strip(execute([
  114. 'node',
  115. '-p',
  116. 'require("./script/lib/get-version").getElectronVersion()'
  117. ], cwd=ELECTRON_DIR).decode())
  118. return cached_electron_version
  119. def store_artifact(prefix, key_prefix, files):
  120. # Azure Storage
  121. azput(prefix, key_prefix, files)
  122. def azput(prefix, key_prefix, files):
  123. env = os.environ.copy()
  124. output = execute([
  125. 'node',
  126. os.path.join(os.path.dirname(__file__), 'azput.js'),
  127. '--prefix', prefix,
  128. '--key_prefix', key_prefix,
  129. ] + files, env)
  130. print(output)
  131. def get_out_dir():
  132. out_dir = 'Debug'
  133. override = os.environ.get('ELECTRON_OUT_DIR')
  134. if override is not None:
  135. out_dir = override
  136. return os.path.join(SRC_DIR, 'out', out_dir)
  137. # NOTE: This path is not created by gn, it is used as a scratch zone by our
  138. # upload scripts
  139. def get_dist_dir():
  140. return os.path.join(get_out_dir(), 'gen', 'electron_dist')
  141. def get_electron_exec():
  142. out_dir = get_out_dir()
  143. if sys.platform == 'darwin':
  144. return '{0}/Electron.app/Contents/MacOS/Electron'.format(out_dir)
  145. if sys.platform == 'win32':
  146. return '{0}/electron.exe'.format(out_dir)
  147. if sys.platform == 'linux':
  148. return '{0}/electron'.format(out_dir)
  149. raise Exception(
  150. "get_electron_exec: unexpected platform '{0}'".format(sys.platform))
  151. def get_buildtools_executable(name):
  152. buildtools = os.path.realpath(os.path.join(ELECTRON_DIR, '..', 'buildtools'))
  153. chromium_platform = {
  154. 'darwin': 'mac',
  155. 'linux': 'linux64',
  156. 'linux2': 'linux64',
  157. 'win32': 'win',
  158. 'cygwin': 'win',
  159. }[sys.platform]
  160. path = os.path.join(buildtools, chromium_platform, name)
  161. if sys.platform == 'win32':
  162. path += '.exe'
  163. return path
  164. def get_linux_binaries():
  165. return [
  166. 'chrome-sandbox',
  167. 'chrome_crashpad_handler',
  168. get_electron_branding()['project_name'],
  169. 'libEGL.so',
  170. 'libGLESv2.so',
  171. 'libffmpeg.so',
  172. 'libvk_swiftshader.so',
  173. ]