Skip to content

Commit bfe13b3

Browse files
committed
Use prebuilt windows zip which contains npm
1 parent 14e45a1 commit bfe13b3

File tree

3 files changed

+49
-33
lines changed

3 files changed

+49
-33
lines changed

.coveragerc

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ source =
55
omit =
66
.tox/*
77
/usr/*
8-
*/tmp*
98
setup.py
109
# Don't complain if non-runnable code isn't run
1110
*/__main__.py

nodeenv.py

+48-31
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class Config(object):
9090
# Defaults
9191
node = 'latest'
9292
npm = 'latest'
93-
with_npm = True if is_WIN or is_CYGWIN else False
93+
with_npm = False
9494
jobs = '2'
9595
without_ssl = False
9696
debug = False
@@ -380,21 +380,25 @@ def mkdir(path):
380380
logger.debug(' * Directory %s already exists', path)
381381

382382

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+
383389
# noinspection PyArgumentList
384390
def writefile(dest, content, overwrite=True, append=False):
385391
"""
386392
Create file and write content in it
387393
"""
388-
mode_0755 = (stat.S_IRWXU | stat.S_IXGRP |
389-
stat.S_IRGRP | stat.S_IROTH | stat.S_IXOTH)
390394
content = to_utf8(content)
391395
if is_PY3 and type(content) != bytes:
392396
content = bytes(content, 'utf-8')
393397
if not os.path.exists(dest):
394398
logger.debug(' * Writing %s ... ', dest, extra=dict(continued=True))
395399
with open(dest, 'wb') as f:
396400
f.write(content)
397-
os.chmod(dest, mode_0755)
401+
make_executable(dest)
398402
logger.debug('done.')
399403
return
400404
else:
@@ -512,7 +516,8 @@ def get_node_bin_url(version):
512516
'arch': archmap[platform.machine()],
513517
}
514518
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)
516521
else:
517522
postfix = '-%(system)s-%(arch)s.tar.gz' % sysinfo
518523
filename = '%s-v%s%s' % (get_binary_prefix(), version, postfix)
@@ -543,18 +548,24 @@ def download_node_src(node_url, src_dir, opt, prefix):
543548
logger.info('.', extra=dict(continued=True))
544549

545550
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
547554
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)
558569

559570

560571
def urlopen(url):
@@ -592,20 +603,26 @@ def copy_node_from_prebuilt(env_dir, src_dir, node_version):
592603
logger.info('.', extra=dict(continued=True))
593604
prefix = get_binary_prefix()
594605
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)
599608
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
601612
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)
605613
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+
609626
logger.info('.', extra=dict(continued=True))
610627

611628

@@ -934,7 +951,7 @@ def handle_starttag(self, tag, attrs):
934951
self.hrefs.append(dict(attrs).get('href', ''))
935952

936953

937-
VERSION_RE = re.compile('\d+\.\d+\.\d+')
954+
VERSION_RE = re.compile(r'\d+\.\d+\.\d+')
938955

939956

940957
def _py2_cmp(a, b):
@@ -1110,7 +1127,7 @@ def main():
11101127
exec __SHIM_NODE__ "$@"
11111128
"""
11121129

1113-
ACTIVATE_BAT = """\
1130+
ACTIVATE_BAT = r"""\
11141131
@echo off
11151132
set "NODE_VIRTUAL_ENV=__NODE_VIRTUAL_ENV__"
11161133
if not defined PROMPT (
@@ -1156,7 +1173,7 @@ def main():
11561173
:END
11571174
"""
11581175

1159-
ACTIVATE_PS1 = """\
1176+
ACTIVATE_PS1 = r"""\
11601177
function global:deactivate ([switch]$NonDestructive) {
11611178
# Revert to original values
11621179
if (Test-Path function:_OLD_VIRTUAL_PROMPT) {
@@ -1203,7 +1220,7 @@ def main():
12031220
$env:PATH = "$env:NODE_VIRTUAL_ENV\Scripts;$env:PATH"
12041221
"""
12051222

1206-
ACTIVATE_SH = """
1223+
ACTIVATE_SH = r"""\
12071224
12081225
# This file must be used with "source bin/activate" *from bash*
12091226
# you cannot run it directly

tox.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ commands =
1313
# Needed because we subprocess to ourselves
1414
coverage combine
1515
coverage report --show-missing --fail-under 55 # TODO: 100
16-
flake8 --ignore=W605,W504,E241 nodeenv.py tests setup.py
16+
flake8 nodeenv.py tests setup.py
1717

1818
[testenv:venv]
1919
envdir = venv-nodeenv

0 commit comments

Comments
 (0)