aboutsummaryrefslogtreecommitdiffstats
path: root/python/servo/util.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/servo/util.py')
-rw-r--r--python/servo/util.py151
1 files changed, 151 insertions, 0 deletions
diff --git a/python/servo/util.py b/python/servo/util.py
new file mode 100644
index 00000000000..24d3f411736
--- /dev/null
+++ b/python/servo/util.py
@@ -0,0 +1,151 @@
+# Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+# file at the top-level directory of this distribution.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
+
+from __future__ import absolute_import, print_function, unicode_literals
+
+import os
+import os.path as path
+import platform
+import sys
+from socket import error as socket_error
+import StringIO
+import tarfile
+import zipfile
+import urllib2
+
+
+def host_triple():
+ os_type = platform.system().lower()
+ if os_type == "linux":
+ os_type = "unknown-linux-gnu"
+ elif os_type == "darwin":
+ os_type = "apple-darwin"
+ elif os_type == "android":
+ os_type = "linux-androideabi"
+ elif os_type == "windows":
+ # If we are in a Visual Studio environment, use msvc
+ if os.getenv("PLATFORM") is not None:
+ os_type = "pc-windows-msvc"
+ elif os.getenv("MSYSTEM") is not None:
+ os_type = "pc-windows-gnu"
+ else:
+ os_type = "unknown"
+ elif os_type.startswith("mingw64_nt-") or os_type.startswith("cygwin_nt-"):
+ os_type = "pc-windows-gnu"
+ elif os_type == "freebsd":
+ os_type = "unknown-freebsd"
+ else:
+ os_type = "unknown"
+
+ cpu_type = platform.machine().lower()
+ if os_type.endswith("-msvc"):
+ # vcvars*.bat should set it properly
+ platform_env = os.environ.get("PLATFORM")
+ if platform_env == "X86":
+ cpu_type = "i686"
+ elif platform_env == "X64":
+ cpu_type = "x86_64"
+ else:
+ cpu_type = "unknown"
+ elif cpu_type in ["i386", "i486", "i686", "i768", "x86"]:
+ cpu_type = "i686"
+ elif cpu_type in ["x86_64", "x86-64", "x64", "amd64"]:
+ cpu_type = "x86_64"
+ elif cpu_type == "arm":
+ cpu_type = "arm"
+ else:
+ cpu_type = "unknown"
+
+ return "{}-{}".format(cpu_type, os_type)
+
+
+def download(desc, src, writer, start_byte=0):
+ if start_byte:
+ print("Resuming download of %s..." % desc)
+ else:
+ print("Downloading %s..." % desc)
+ dumb = (os.environ.get("TERM") == "dumb") or (not sys.stdout.isatty())
+
+ try:
+ req = urllib2.Request(src)
+ if start_byte:
+ req = urllib2.Request(src, headers={'Range': 'bytes={}-'.format(start_byte)})
+ resp = urllib2.urlopen(req)
+
+ fsize = None
+ if resp.info().getheader('Content-Length'):
+ fsize = int(resp.info().getheader('Content-Length').strip()) + start_byte
+
+ recved = start_byte
+ chunk_size = 8192
+
+ while True:
+ chunk = resp.read(chunk_size)
+ if not chunk:
+ break
+ recved += len(chunk)
+ if not dumb:
+ if fsize is not None:
+ pct = recved * 100.0 / fsize
+ print("\rDownloading %s: %5.1f%%" % (desc, pct), end="")
+
+ sys.stdout.flush()
+ writer.write(chunk)
+
+ if not dumb:
+ print()
+ except urllib2.HTTPError, e:
+ print("Download failed (%d): %s - %s" % (e.code, e.reason, src))
+ if e.code == 403:
+ print("No Rust compiler binary available for this platform. "
+ "Please see https://github.com/servo/servo/#prerequisites")
+ sys.exit(1)
+ except urllib2.URLError, e:
+ print("Error downloading Rust compiler: %s. The failing URL was: %s" % (e.reason, src))
+ sys.exit(1)
+ except socket_error, e:
+ print("Looks like there's a connectivity issue, check your Internet connection. %s" % (e))
+ sys.exit(1)
+ except KeyboardInterrupt:
+ writer.flush()
+ raise
+
+
+def download_bytes(desc, src):
+ content_writer = StringIO.StringIO()
+ download(desc, src, content_writer)
+ return content_writer.getvalue()
+
+
+def download_file(desc, src, dst):
+ tmp_path = dst + ".part"
+ try:
+ start_byte = path.getsize(tmp_path)
+ with open(tmp_path, 'ab') as fd:
+ download(desc, src, fd, start_byte=start_byte)
+ except os.error:
+ with open(tmp_path, 'wb') as fd:
+ download(desc, src, fd)
+ os.rename(tmp_path, dst)
+
+
+def extract(src, dst, movedir=None):
+ if src.endswith(".zip"):
+ zipfile.ZipFile(src).extractall(dst)
+ else:
+ tarfile.open(src).extractall(dst)
+
+ if movedir:
+ for f in os.listdir(movedir):
+ frm = path.join(movedir, f)
+ to = path.join(dst, f)
+ os.rename(frm, to)
+ os.rmdir(movedir)
+
+ os.remove(src)