@@ -33,12 +33,12 @@ def __init__(self, node_version):
3333 def download (self ):
3434 try :
3535 if os .path .exists (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM ):
36- shutil .rmtree (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
36+ self .rmtree (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
3737 os .makedirs (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
3838 else :
3939 os .makedirs (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
4040 if os .path .exists (node_variables .NODE_MODULES_PATH ):
41- shutil .rmtree (node_variables .NODE_MODULES_PATH )
41+ self .rmtree (node_variables .NODE_MODULES_PATH )
4242 request = urllib .request .Request (self .NODE_JS_BINARY_URL )
4343 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' )
4444 with urllib .request .urlopen (request ) as response :
@@ -62,13 +62,58 @@ def extract(self):
6262 member .name = sep .join (member .name .split (sep )[1 :])
6363 tar .extract (member , node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
6464 else :
65- with zipfile .ZipFile (self .NODE_JS_BINARY_TARFILE_FULL_PATH , "r" ) as zip_file :
66- for member in zip_file .namelist () :
67- if member .endswith ("/node.exe" ) :
68- with zip_file .open (member ) as node_file :
69- with open (os .path .join (node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM , "node.exe" ), "wb" ) as target :
70- shutil .copyfileobj (node_file , target )
71- break
65+ if node_variables .NODE_JS_OS == "win" :
66+ import string
67+ from ctypes import windll , c_int , c_wchar_p
68+ UNUSUED_DRIVE_LETTER = ""
69+ for letter in string .ascii_uppercase :
70+ if not os .path .exists (letter + ":" ) :
71+ UNUSUED_DRIVE_LETTER = letter + ":"
72+ break
73+ if not UNUSUED_DRIVE_LETTER :
74+ sublime .message_dialog ("Can't install node.js and npm! UNUSUED_DRIVE_LETTER not found." )
75+ return
76+ DefineDosDevice = windll .kernel32 .DefineDosDeviceW
77+ DefineDosDevice .argtypes = [ c_int , c_wchar_p , c_wchar_p ]
78+ DefineDosDevice (0 , UNUSUED_DRIVE_LETTER , node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
79+ try :
80+ with zipfile .ZipFile (self .NODE_JS_BINARY_TARFILE_FULL_PATH , "r" ) as zip_file :
81+ for member in zip_file .namelist () :
82+ if not member .endswith ("/" ) :
83+ with zip_file .open (member ) as node_file :
84+ with open (UNUSUED_DRIVE_LETTER + "\\ " + member .replace ("node-" + self .NODE_JS_VERSION + "-" + node_variables .NODE_JS_OS + "-" + node_variables .NODE_JS_ARCHITECTURE + "/" , "" ), "wb+" ) as target :
85+ shutil .copyfileobj (node_file , target )
86+ elif not member .endswith ("node-" + self .NODE_JS_VERSION + "-" + node_variables .NODE_JS_OS + "-" + node_variables .NODE_JS_ARCHITECTURE + "/" ):
87+ os .mkdir (UNUSUED_DRIVE_LETTER + "\\ " + member .replace ("node-" + self .NODE_JS_VERSION + "-" + node_variables .NODE_JS_OS + "-" + node_variables .NODE_JS_ARCHITECTURE + "/" , "" ))
88+ except Exception as e :
89+ print ("Error: " + traceback .format_exc ())
90+ finally :
91+ DefineDosDevice (2 , UNUSUED_DRIVE_LETTER , node_variables .NODE_JS_BINARIES_FOLDER_PLATFORM )
92+
93+ def rmtree (self , path ) :
94+ if node_variables .NODE_JS_OS == "win" :
95+ import string
96+ from ctypes import windll , c_int , c_wchar_p
97+ UNUSUED_DRIVE_LETTER = ""
98+ for letter in string .ascii_uppercase :
99+ if not os .path .exists (letter + ":" ) :
100+ UNUSUED_DRIVE_LETTER = letter + ":"
101+ break
102+ if not UNUSUED_DRIVE_LETTER :
103+ sublime .message_dialog ("Can't remove node.js! UNUSUED_DRIVE_LETTER not found." )
104+ return
105+ DefineDosDevice = windll .kernel32 .DefineDosDeviceW
106+ DefineDosDevice .argtypes = [ c_int , c_wchar_p , c_wchar_p ]
107+ DefineDosDevice (0 , UNUSUED_DRIVE_LETTER , path )
108+ try :
109+ shutil .rmtree (UNUSUED_DRIVE_LETTER )
110+ except Exception as e :
111+ print ("Error: " + traceback .format_exc ())
112+ finally :
113+ DefineDosDevice (2 , UNUSUED_DRIVE_LETTER , path )
114+ else :
115+ shutil .rmtree (path )
116+
72117
73118 def on_error (self , err ):
74119 self .animation_loader .on_complete ()
@@ -86,8 +131,6 @@ def on_complete(self):
86131 try :
87132 npm .getCurrentNPMVersion (True )
88133 except Exception as e :
89- if node_variables .NODE_JS_OS == "win" :
90- sublime .error_message ("Can't use \" npm\" ! To use features that requires \" npm\" , you must install it! Download it from https://nodejs.org site" )
91134 print ("Error: " + traceback .format_exc ())
92135 try :
93136 npm .install_all ()
@@ -128,8 +171,6 @@ def updateNPMDependencies():
128171 try :
129172 npm .getCurrentNPMVersion (True )
130173 except Exception as e :
131- if node_variables .NODE_JS_OS == "win" :
132- sublime .active_window ().status_message ("Can't use \" npm\" ! To use features that requires \" npm\" , you must install it! Download it from https://nodejs.org site" )
133174 print ("Error: " + traceback .format_exc ())
134175 return
135176
@@ -158,10 +199,12 @@ def install(node_version=""):
158199 nodejs_already_installed = already_installed ()
159200 if nodejs_can_start_download and not nodejs_already_installed :
160201 DownloadNodeJS ( node_version ).start ()
202+ return
161203 elif nodejs_can_start_download and nodejs_already_installed :
162204 node_js = NodeJS ()
163205 if node_version != node_js .getCurrentNodeJSVersion (True ) :
164206 DownloadNodeJS ( node_version ).start ()
207+ return
165208
166209 if nodejs_already_installed :
167- create_and_start_thread (updateNPMDependencies , "checkUpgradeNPM " )
210+ create_and_start_thread (updateNPMDependencies , "updateNPMDependencies " )
0 commit comments