@@ -90,7 +90,7 @@ class Config(object):
90
90
# Defaults
91
91
node = 'latest'
92
92
npm = 'latest'
93
- with_npm = True if is_WIN or is_CYGWIN else False
93
+ with_npm = False
94
94
jobs = '2'
95
95
without_ssl = False
96
96
debug = False
@@ -380,21 +380,25 @@ def mkdir(path):
380
380
logger .debug (' * Directory %s already exists' , path )
381
381
382
382
383
+ def make_executable (filename ):
384
+ mode_0755 = (stat .S_IRWXU | stat .S_IXGRP |
385
+ stat .S_IRGRP | stat .S_IROTH | stat .S_IXOTH )
386
+ os .chmod (filename , mode_0755 )
387
+
388
+
383
389
# noinspection PyArgumentList
384
390
def writefile (dest , content , overwrite = True , append = False ):
385
391
"""
386
392
Create file and write content in it
387
393
"""
388
- mode_0755 = (stat .S_IRWXU | stat .S_IXGRP |
389
- stat .S_IRGRP | stat .S_IROTH | stat .S_IXOTH )
390
394
content = to_utf8 (content )
391
395
if is_PY3 and type (content ) != bytes :
392
396
content = bytes (content , 'utf-8' )
393
397
if not os .path .exists (dest ):
394
398
logger .debug (' * Writing %s ... ' , dest , extra = dict (continued = True ))
395
399
with open (dest , 'wb' ) as f :
396
400
f .write (content )
397
- os . chmod (dest , mode_0755 )
401
+ make_executable (dest )
398
402
logger .debug ('done.' )
399
403
return
400
404
else :
@@ -512,7 +516,8 @@ def get_node_bin_url(version):
512
516
'arch' : archmap [platform .machine ()],
513
517
}
514
518
if is_WIN or is_CYGWIN :
515
- filename = 'win-%(arch)s/node.exe' % sysinfo
519
+ postfix = '-win-%(arch)s.zip' % sysinfo
520
+ filename = '%s-v%s%s' % (get_binary_prefix (), version , postfix )
516
521
else :
517
522
postfix = '-%(system)s-%(arch)s.tar.gz' % sysinfo
518
523
filename = '%s-v%s%s' % (get_binary_prefix (), version , postfix )
@@ -543,18 +548,24 @@ def download_node_src(node_url, src_dir, opt, prefix):
543
548
logger .info ('.' , extra = dict (continued = True ))
544
549
545
550
if is_WIN or is_CYGWIN :
546
- writefile (join (src_dir , 'node.exe' ), dl_contents .read ())
551
+ ctx = zipfile .ZipFile (dl_contents )
552
+ members = operator .methodcaller ('namelist' )
553
+ member_name = lambda s : s # noqa: E731
547
554
else :
548
- with tarfile_open (fileobj = dl_contents ) as tarfile_obj :
549
- member_list = tarfile_obj .getmembers ()
550
- extract_list = []
551
- for member in member_list :
552
- node_ver = opt .node .replace ('.' , '\.' )
553
- rexp_string = "%s-v%s[^/]*/(README\.md|CHANGELOG\.md|LICENSE)" \
554
- % (prefix , node_ver )
555
- if re .match (rexp_string , member .name ) is None :
556
- extract_list .append (member )
557
- tarfile_obj .extractall (src_dir , extract_list )
555
+ ctx = tarfile_open (fileobj = dl_contents )
556
+ members = operator .methodcaller ('getmembers' )
557
+ member_name = operator .attrgetter ('name' )
558
+
559
+ with ctx as archive :
560
+ node_ver = re .escape (opt .node )
561
+ rexp_string = r"%s-v%s[^/]*/(README\.md|CHANGELOG\.md|LICENSE)" \
562
+ % (prefix , node_ver )
563
+ extract_list = [
564
+ member
565
+ for member in members (archive )
566
+ if re .match (rexp_string , member_name (member )) is None
567
+ ]
568
+ archive .extractall (src_dir , extract_list )
558
569
559
570
560
571
def urlopen (url ):
@@ -592,20 +603,26 @@ def copy_node_from_prebuilt(env_dir, src_dir, node_version):
592
603
logger .info ('.' , extra = dict (continued = True ))
593
604
prefix = get_binary_prefix ()
594
605
if is_WIN :
595
- src_exe = join (src_dir , 'node.exe' )
596
- dst_exe = join (env_dir , 'Scripts' , 'node.exe' )
597
- mkdir (join (env_dir , 'Scripts' ))
598
- callit (['copy' , '/Y' , '/L' , src_exe , dst_exe ], False , True )
606
+ dest = join (env_dir , 'Scripts' )
607
+ os .makedirs (dest )
599
608
elif is_CYGWIN :
600
- mkdir (join (env_dir , 'bin' ))
609
+ dest = join (env_dir , 'bin' )
610
+ os .makedirs (dest )
611
+ # write here to avoid https://bugs.python.org/issue35650
601
612
writefile (join (env_dir , 'bin' , 'node' ), CYGWIN_NODE )
602
- src_exe = join (src_dir , 'node.exe' )
603
- dst_exe = join (env_dir , 'bin' , 'node.exe' )
604
- callit (['cp' , '-a' , src_exe , dst_exe ], True , env_dir )
605
613
else :
606
- src_folder_tpl = src_dir + to_utf8 ('/%s-v%s*' % (prefix , node_version ))
607
- for src_folder in glob .glob (src_folder_tpl ):
608
- copytree (src_folder , env_dir , True )
614
+ dest = env_dir
615
+
616
+ src_folder_tpl = src_dir + to_utf8 ('/%s-v%s*' % (prefix , node_version ))
617
+ src_folder , = glob .glob (src_folder_tpl )
618
+ copytree (src_folder , dest , True )
619
+
620
+ if is_CYGWIN :
621
+ for filename in ('npm' , 'npx' , 'node.exe' ):
622
+ filename = join (env_dir , 'bin' , filename )
623
+ if os .path .exists (filename ):
624
+ make_executable (filename )
625
+
609
626
logger .info ('.' , extra = dict (continued = True ))
610
627
611
628
@@ -934,7 +951,7 @@ def handle_starttag(self, tag, attrs):
934
951
self .hrefs .append (dict (attrs ).get ('href' , '' ))
935
952
936
953
937
- VERSION_RE = re .compile ('\d+\.\d+\.\d+' )
954
+ VERSION_RE = re .compile (r '\d+\.\d+\.\d+' )
938
955
939
956
940
957
def _py2_cmp (a , b ):
@@ -1110,7 +1127,7 @@ def main():
1110
1127
exec __SHIM_NODE__ "$@"
1111
1128
"""
1112
1129
1113
- ACTIVATE_BAT = """\
1130
+ ACTIVATE_BAT = r """\
1114
1131
@echo off
1115
1132
set "NODE_VIRTUAL_ENV=__NODE_VIRTUAL_ENV__"
1116
1133
if not defined PROMPT (
@@ -1156,7 +1173,7 @@ def main():
1156
1173
:END
1157
1174
"""
1158
1175
1159
- ACTIVATE_PS1 = """\
1176
+ ACTIVATE_PS1 = r """\
1160
1177
function global:deactivate ([switch]$NonDestructive) {
1161
1178
# Revert to original values
1162
1179
if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
@@ -1203,7 +1220,7 @@ def main():
1203
1220
$env:PATH = "$env:NODE_VIRTUAL_ENV\Scripts;$env:PATH"
1204
1221
"""
1205
1222
1206
- ACTIVATE_SH = """
1223
+ ACTIVATE_SH = r """\
1207
1224
1208
1225
# This file must be used with "source bin/activate" *from bash*
1209
1226
# you cannot run it directly
0 commit comments