util.py 5.2 KB

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