From 11b4baf92e52d725325f47e2bd0fe9a14069224a Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 28 Feb 2015 21:44:32 -0800 Subject: [PATCH 1/2] npm install without curl --- nodeenv.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/nodeenv.py b/nodeenv.py index c9cb185..4a42333 100644 --- a/nodeenv.py +++ b/nodeenv.py @@ -589,16 +589,27 @@ def install_npm(env_dir, src_dir, opt): """ logger.info(' * Install npm.js (%s) ... ' % opt.npm, extra=dict(continued=True)) - cmd = [ - '. %s && curl --location --silent %s | ' - 'clean=%s npm_install=%s bash && deactivate_node' % ( - pipes.quote(join(env_dir, 'bin', 'activate')), - 'https://www.npmjs.org/install.sh', - 'no' if opt.no_npm_clean else 'yes', - opt.npm - ) - ] - callit(cmd, opt.verbose, True) + npm_contents = urlopen('https://www.npmjs.org/install.sh').read() + env = dict( + os.environ, + clean='no' if opt.no_npm_clean else 'yes', + npm_install=opt.npm, + ) + proc = subprocess.Popen( + ( + 'bash', '-c', + '. {0} && exec bash'.format( + pipes.quote(join(env_dir, 'bin', 'activate')), + ) + ), + env=env, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + ) + out, _ = proc.communicate(npm_contents) + if opt.verbose: + logger.info(out) logger.info('done.') From e350cd5db076f3525d839742adabef521ac9047b Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 28 Feb 2015 22:00:26 -0800 Subject: [PATCH 2/2] No longer require curl or tar --- README.rst | 2 -- README.ru.rst | 2 -- nodeenv.py | 46 +++++++++++++++++----------------------------- 3 files changed, 17 insertions(+), 33 deletions(-) diff --git a/README.rst b/README.rst index bba86ae..47b6aef 100644 --- a/README.rst +++ b/README.rst @@ -74,9 +74,7 @@ For nodeenv * python (>= 2.6) * make -* curl * tail -* tar For node.js ^^^^^^^^^^^ diff --git a/README.ru.rst b/README.ru.rst index cffe69d..c3eb130 100644 --- a/README.ru.rst +++ b/README.ru.rst @@ -59,9 +59,7 @@ Nodeenv можно установить с помощью `easy_install`_:: ^^^^^^^^^^^ * make -* curl * tail -* tar Для node.js ^^^^^^^^^^^ diff --git a/nodeenv.py b/nodeenv.py index 4a42333..f980d53 100644 --- a/nodeenv.py +++ b/nodeenv.py @@ -10,6 +10,8 @@ :license: BSD, see LICENSE for more details. """ +import contextlib +import io import sys import os import re @@ -18,6 +20,7 @@ import operator import optparse import subprocess +import tarfile import pipes try: # pragma: no cover (py2 only) @@ -443,33 +446,24 @@ def get_node_src_url(version, postfix=''): return node_url +@contextlib.contextmanager +def tarfile_open(*args, **kwargs): + """Compatibility layer because py26.""" + tf = tarfile.open(*args, **kwargs) + try: + yield tf + finally: + tf.close() + + def download_node(node_url, src_dir, env_dir, opt): """ Download source code """ - cmd = [] - cmd.append('curl') - cmd.append('--silent') - cmd.append('-L') - cmd.append(node_url) - cmd.append('|') - cmd.append('tar') - cmd.append('xzf') - cmd.append('-') - cmd.append('-C') - cmd.append(pipes.quote(src_dir)) - cmd.extend(['--exclude', 'ChangeLog']) - cmd.extend(['--exclude', 'LICENSE']) - cmd.extend(['--exclude', 'README.md']) - try: - callit(cmd, opt.verbose, True, env_dir) - logger.info(') ', extra=dict(continued=True)) - except OSError: - postfix = '-RC1' - logger.info('%s) ' % postfix, extra=dict(continued=True)) - new_node_url = get_node_src_url(opt.node, postfix) - cmd[cmd.index(node_url)] = new_node_url - callit(cmd, opt.verbose, True, env_dir) + tar_contents = io.BytesIO(urlopen(node_url).read()) + with tarfile_open(fileobj=tar_contents) as tarfile_obj: + tarfile_obj.extractall(src_dir) + logger.info(')', extra=dict(continued=True)) def get_node_src_url_postfix(opt): @@ -810,12 +804,6 @@ def main(): Config._dump() return - for exe in ('curl', 'tar'): - if not is_installed(exe): - print('Error: "%s" not installed.' % exe) - print('Please, install it via apt/yum/etc and try again.') - return sys.exit(1) - opt, args = parse_args(check=False) Config._load(opt.config_file, opt.verbose)