diff options
-rw-r--r-- | README.md | 6 | ||||
-rwxr-xr-x | tools/install.py | 99 | ||||
-rwxr-xr-x | tools/install_test.py | 33 | ||||
-rwxr-xr-x | tools/test.py | 3 |
4 files changed, 141 insertions, 0 deletions
@@ -50,6 +50,12 @@ * Aims to be browser compatible. +## Install + +``` +curl -sSf https://raw.githubusercontent.com/denoland/deno/master/tools/install.py | python +``` + ## Status diff --git a/tools/install.py b/tools/install.py new file mode 100755 index 000000000..c01439a61 --- /dev/null +++ b/tools/install.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# Copyright 2018 the Deno authors. All rights reserved. MIT license. +from __future__ import print_function +import os +import json +import sys +import tempfile +import shutil +import gzip +from zipfile import ZipFile +import re +try: + from urllib.request import urlopen +except ImportError: + from urllib2 import urlopen + +releases_url_html = "https://github.com/denoland/deno/releases/latest" +install_dir = os.path.join(tempfile.gettempdir(), "deno_install") +home = os.path.expanduser("~") + +def get_latest_url(): + res = urlopen(releases_url_html) + html = res.read().decode('utf-8') + urls = re.findall(r'href=[\'"]?([^\'" >]+)', html) + + filename = { + "darwin": "deno_osx_x64.gz", + # python3 sys.platform returns linux ( python2 returns linux2 ) + "linux": "deno_linux_x64.gz", + "linux2": "deno_linux_x64.gz", + "win32": "deno_win_x64.zip", + "cygwin": "deno_win_x64.zip" + }[sys.platform] + + matching = [u for u in urls if filename in u] + + if len(matching) != 1: + print("Bad download url") + print("urls", urls) + print("matching", matching) + sys.exit(1) + + return "https://github.com" + matching[0] + + +def main(): + latest_url = get_latest_url() + latest_fn = dlfile(latest_url) + + bin_dir = deno_bin_dir() + exe_fn = os.path.join(bin_dir, "deno") + + if "zip" in latest_fn: + with ZipFile(latest_fn, 'r') as z: + with open(exe_fn, 'wb+') as exe: + exe.write(z.read('deno.exe')) + else: + with gzip.open(latest_fn, 'rb') as f: + content = f.read() + with open(exe_fn, 'wb+') as exe: + exe.write(content) + + os.chmod(exe_fn, 0o744) + print("DENO_EXE: " + exe_fn) + print("Now manually add %s to your $PATH" % bin_dir) + print("Example:") + print() + print(" echo export PATH=\"%s\":\\$PATH >> $HOME/.bash_profile" % bin_dir) + print() + + +def mkdir(d): + if not os.path.exists(d): + print("mkdir", d) + os.mkdir(d) + + +def deno_bin_dir(): + install_dir = home + d = os.path.join(install_dir, ".deno") + b = os.path.join(d, "bin") + mkdir(d) + mkdir(b) + return b + + +def dlfile(url): + print("Downloading " + url) + f = urlopen(url) + mkdir(install_dir) + p = os.path.join(install_dir, os.path.basename(url)) + print("Writing " + p) + with open(p, "wb") as local_file: + local_file.write(f.read()) + return p + + +if __name__ == '__main__': + main()
\ No newline at end of file diff --git a/tools/install_test.py b/tools/install_test.py new file mode 100755 index 000000000..4a7221102 --- /dev/null +++ b/tools/install_test.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# Copyright 2018 the Deno authors. All rights reserved. MIT license. +import util +import sys +import shutil +import os +import subprocess + + +def main(): + PATTERN = "DENO_EXE: " + home = os.path.expanduser("~") + expected_bin_dir = os.path.join(home, ".deno", "bin") + print "Testing tools/install.py ... Expect deno installed to ", expected_bin_dir + if os.path.exists(expected_bin_dir): + shutil.rmtree(expected_bin_dir) + expected_fn = os.path.join(expected_bin_dir, "deno") + + cmd = [sys.executable, "tools/install.py"] + out = subprocess.check_output(cmd, universal_newlines=True) + actual_fn = None + for line in out.splitlines(): + print line + if PATTERN in line: + print "set actual" + actual_fn = line[len(PATTERN):] + assert actual_fn == expected_fn, "actual %s != expected %s" % (actual_fn, + expected_fn) + assert os.path.exists(actual_fn) + + +if __name__ == '__main__': + main() diff --git a/tools/test.py b/tools/test.py index 6e5cb548b..c06c9a28b 100755 --- a/tools/test.py +++ b/tools/test.py @@ -4,6 +4,7 @@ import os import sys from check_output_test import check_output_test +import install_test from util import executable_suffix, run, build_path from unit_tests import unit_tests from util_test import util_test @@ -51,6 +52,8 @@ def main(argv): check_exists(deno_ns_exe) check_output_test(deno_ns_exe) + install_test.main() + if __name__ == '__main__': sys.exit(main(sys.argv)) |