util.py 5.1 KB

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