util.py 5.2 KB

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