Skip to content

Commit 5b459d2

Browse files
fix for #13 on windows
1 parent b2f1997 commit 5b459d2

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

node/installer.py

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
import traceback
33
import threading
44
import os
5-
import tarfile
5+
import tarfile, zipfile
66
import urllib
77
import json
8+
import shutil
89
import node_variables
910
from animation_loader import AnimationLoader
1011
from repeated_timer import RepeatedTimer
@@ -13,7 +14,8 @@
1314
class DownloadNodeJS(object):
1415
def __init__(self, node_version):
1516
self.NODE_JS_VERSION = node_version
16-
self.NODE_JS_BINARY_URL = "https://nodejs.org/dist/"+self.NODE_JS_VERSION+"/node-"+self.NODE_JS_VERSION+"-"+node_variables.NODE_JS_OS+"-"+node_variables.NODE_JS_ARCHITECTURE+".tar.gz"
17+
self.NODE_JS_TAR_EXTENSION = ".zip" if node_variables.NODE_JS_OS == "win" else ".tar.gz"
18+
self.NODE_JS_BINARY_URL = "https://nodejs.org/dist/"+self.NODE_JS_VERSION+"/node-"+self.NODE_JS_VERSION+"-"+node_variables.NODE_JS_OS+"-"+node_variables.NODE_JS_ARCHITECTURE+self.NODE_JS_TAR_EXTENSION
1719
self.NODE_JS_BINARY_TARFILE_NAME = self.NODE_JS_BINARY_URL.split('/')[-1]
1820
self.NODE_JS_BINARY_TARFILE_FULL_PATH = os.path.join(node_variables.NODE_JS_BINARIES_FOLDER_PLATFORM, self.NODE_JS_BINARY_TARFILE_NAME)
1921
self.animation_loader = AnimationLoader(["[= ]", "[ = ]", "[ = ]", "[ = ]", "[ =]", "[ = ]", "[ = ]", "[ = ]"], 0.067, "Downloading: "+self.NODE_JS_BINARY_URL+" ")
@@ -23,7 +25,10 @@ def __init__(self, node_version):
2325
os.makedirs(node_variables.NODE_JS_BINARIES_FOLDER_PLATFORM)
2426
def download(self):
2527
try :
26-
urllib.request.urlretrieve(self.NODE_JS_BINARY_URL, self.NODE_JS_BINARY_TARFILE_FULL_PATH)
28+
request = urllib.request.Request(self.NODE_JS_BINARY_URL)
29+
request.add_header('User-agent', r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1')
30+
with urllib.request.urlopen(request) as response, open(self.NODE_JS_BINARY_TARFILE_FULL_PATH, 'wb') as out_file:
31+
shutil.copyfileobj(response, out_file)
2732
except Exception as err :
2833
traceback.print_exc()
2934
self.on_error(err)
@@ -37,12 +42,22 @@ def start(self):
3742
if self.animation_loader :
3843
self.interval_animation = RepeatedTimer(self.animation_loader.sec, self.animation_loader.animate)
3944
def extract(self):
40-
with tarfile.open(self.NODE_JS_BINARY_TARFILE_FULL_PATH, "r:gz") as tar :
41-
for member in tar.getmembers() :
42-
if(member.name.endswith("/bin/node")) :
43-
member.name = node_variables.NODE_JS_PATH_EXECUTABLE
44-
tar.extract(member, node_variables.NODE_JS_BINARIES_FOLDER_PLATFORM)
45-
break
45+
if self.NODE_JS_TAR_EXTENSION != ".zip" :
46+
with tarfile.open(self.NODE_JS_BINARY_TARFILE_FULL_PATH, "r:gz") as tar :
47+
for member in tar.getmembers() :
48+
if member.name.endswith("/bin/node") :
49+
member.name = node_variables.NODE_JS_PATH_EXECUTABLE
50+
tar.extract(member, node_variables.NODE_JS_BINARIES_FOLDER_PLATFORM)
51+
break
52+
else :
53+
with zipfile.ZipFile(self.NODE_JS_BINARY_TARFILE_FULL_PATH, "r") as zip_file :
54+
for member in zip_file.namelist() :
55+
if member.endswith("/node.exe") :
56+
with zip_file.open(member) as node_file:
57+
with open(os.path.join(node_variables.NODE_JS_BINARIES_FOLDER_PLATFORM, "node.exe"), "wb") as target :
58+
shutil.copyfileobj(node_file, target)
59+
break
60+
4661
def on_error(self, err):
4762
self.animation_loader.on_complete()
4863
self.interval_animation.stop()
@@ -93,9 +108,10 @@ def install(node_version=""):
93108
if node_version != node_js.getCurrentNodeJSVersion() :
94109
DownloadNodeJS( node_version ).start()
95110

96-
for thread in threading.enumerate() :
97-
if thread.getName() == "checkUpgradeNodeJS" and thread.is_alive() :
98-
return
99-
thread = threading.Thread(target=checkUpgrade, name="checkUpgradeNodeJS")
100-
thread.setDaemon(True)
101-
thread.start()
111+
if nodejs_already_installed :
112+
for thread in threading.enumerate() :
113+
if thread.getName() == "checkUpgradeNodeJS" and thread.is_alive() :
114+
return
115+
thread = threading.Thread(target=checkUpgrade, name="checkUpgradeNodeJS")
116+
thread.setDaemon(True)
117+
thread.start()

0 commit comments

Comments
 (0)