1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 15:24:46 -05:00

Avoid using temporary directory in install.py

This commit is contained in:
Andy Hayden 2018-08-31 21:53:10 -07:00 committed by Ryan Dahl
parent 3d063223cc
commit c0ef797fc9

View file

@ -1,66 +1,69 @@
#!/usr/bin/env python #!/usr/bin/env python
# Copyright 2018 the Deno authors. All rights reserved. MIT license. # Copyright 2018 the Deno authors. All rights reserved. MIT license.
from __future__ import print_function from __future__ import print_function
import os
import io
import json import json
import os
import re
import shutil
import sys import sys
import tempfile import tempfile
import shutil import zipfile
import gzip import zlib
from zipfile import ZipFile
import re
try: try:
from urllib.request import urlopen from urllib.request import urlopen
except ImportError: except ImportError:
from urllib2 import urlopen from urllib2 import urlopen
releases_url_html = "https://github.com/denoland/deno/releases/latest" RELEASES_URL = "https://github.com/denoland/deno/releases/latest"
install_dir = os.path.join(tempfile.gettempdir(), "deno_install") FILENAME_LOOKUP = {
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", "darwin": "deno_osx_x64.gz",
# python3 sys.platform returns linux ( python2 returns linux2 ) "linux": "deno_linux_x64.gz", # python3
"linux": "deno_linux_x64.gz", "linux2": "deno_linux_x64.gz", # python2
"linux2": "deno_linux_x64.gz",
"win32": "deno_win_x64.zip", "win32": "deno_win_x64.zip",
"cygwin": "deno_win_x64.zip" "cygwin": "deno_win_x64.zip"
}[sys.platform] }
def latest_release_url():
try:
filename = FILENAME_LOOKUP[sys.platform]
except KeyError:
print("Unable to locate appropriate filename for", sys.platform)
sys.exit(1)
html = urlopen(RELEASES_URL).read().decode('utf-8')
urls = re.findall(r'href=[\'"]?([^\'" >]+)', html)
matching = [u for u in urls if filename in u] matching = [u for u in urls if filename in u]
if len(matching) != 1: if len(matching) != 1:
print("Bad download url") print("Unable to find download url for", filename)
print("urls", urls)
print("matching", matching)
sys.exit(1) sys.exit(1)
return "https://github.com" + matching[0] return "https://github.com" + matching[0]
def main(): def main():
latest_url = get_latest_url()
latest_fn = dlfile(latest_url)
bin_dir = deno_bin_dir() bin_dir = deno_bin_dir()
exe_fn = os.path.join(bin_dir, "deno") exe_fn = os.path.join(bin_dir, "deno")
if "zip" in latest_fn: url = latest_release_url()
with ZipFile(latest_fn, 'r') as z: print("Downloading", url)
compressed = urlopen(url).read()
if url.endswith(".zip"):
with zipfile.ZipFile(io.BytesIO(compressed), 'r') as z:
with open(exe_fn, 'wb+') as exe: with open(exe_fn, 'wb+') as exe:
exe.write(z.read('deno.exe')) exe.write(z.read('deno.exe'))
else: else:
with gzip.open(latest_fn, 'rb') as f: # Note: gzip.decompress is not available in python2.
content = f.read() content = zlib.decompress(compressed, 15 + 32)
with open(exe_fn, 'wb+') as exe: with open(exe_fn, 'wb+') as exe:
exe.write(content) exe.write(content)
os.chmod(exe_fn, 0o744) os.chmod(exe_fn, 0o744)
print("DENO_EXE: " + exe_fn) print("DENO_EXE: " + exe_fn)
print("Now manually add %s to your $PATH" % bin_dir) print("Now manually add %s to your $PATH" % bin_dir)
print("Example:") print("Example:")
@ -76,24 +79,13 @@ def mkdir(d):
def deno_bin_dir(): def deno_bin_dir():
install_dir = home home = os.path.expanduser("~")
d = os.path.join(install_dir, ".deno") d = os.path.join(home, ".deno")
b = os.path.join(d, "bin")
mkdir(d) mkdir(d)
b = os.path.join(d, "bin")
mkdir(b) mkdir(b)
return 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__': if __name__ == '__main__':
main() main()