--- a/virtualenv/res/lib/lib_create_env.py Tue Aug 27 22:18:57 2013 +0200
+++ b/virtualenv/res/lib/lib_create_env.py Wed Aug 28 11:16:03 2013 +0200
@@ -39,14 +39,18 @@
class ResourcesEnv(object):
- def __init__(self, src_base, urls, normal_installs):
+ def __init__(self, src_base, run_base, urls, normal_installs):
self.src_base = src_base
+ self.run_base = run_base
self.URLS = {}
self.__init_url(urls)
self.NORMAL_INSTALL = normal_installs
def get_src_base_path(self, fpath):
return os.path.abspath(os.path.join(self.src_base, fpath)).replace("\\","/")
+
+ def get_run_res_base_path(self, fpath):
+ return os.path.abspath(os.path.join(self.run_base, 'res', fpath)).replace("\\","/")
def __add_package_def(self, key, dict):
self.URLS[key] = dict
@@ -54,10 +58,14 @@
def __init_url(self, urls):
for key, url_dict in urls.items():
url_dict_copy = url_dict.copy()
+ if url_dict.get('install', {}).get('method','pip') == 'pip-req':
+ get_base_path = self.get_run_res_base_path
+ else:
+ get_base_path = self.get_src_base_path
if not url_dict['url'].startswith("http://"):
- url_dict_copy['url'] = self.get_src_base_path(url_dict['url'])
- url_dict_copy['local'] = self.get_src_base_path(url_dict['local'])
-
+ url_dict_copy['url'] = get_base_path(url_dict['url'])
+ url_dict_copy['local'] = get_base_path(url_dict['local'])
+
self.__add_package_def(key, url_dict_copy )
def ensure_dir(dir, logger):
@@ -184,13 +192,13 @@
install_zlib = gen_install_comp_lib("zlib", "ZLIB", [])
-def lib_generate_install_methods(path_locations, src_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None):
+def lib_generate_install_methods(path_locations, src_base, run_base, Logger, call_subprocess, normal_installs, options_to_add=None, urls= None):
all_urls = URLS.copy()
if urls is not None:
all_urls.update(urls)
- res_env = ResourcesEnv(src_base, all_urls, normal_installs)
+ res_env = ResourcesEnv(src_base, run_base, all_urls, normal_installs)
def filter_python_develop(line):
if not line.strip():
@@ -203,13 +211,13 @@
return Logger.NOTIFY
- def normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess):
- logger.notify("Install %s from %s with %s" % (key,res_env.URLS[key][res_source_key],method))
+ def normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess):
+ logger.notify("Install %s from %s with %s" % (key,res_path,method))
if method == 'pip':
if sys.platform == 'win32':
- args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_env.URLS[key][res_source_key]]
+ args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', res_path]
else:
- args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_env.URLS[key][res_source_key]]
+ args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', res_path]
if option_str :
args.append(option_str)
if res_source_key == 'local':
@@ -219,7 +227,27 @@
args.insert(2, '-f')
args.insert(3, res_env.get_src_base_path(""))
args.insert(4, '--no-index')
- logger.notify("Install %s from %s with %s args %s " % (key,res_env.URLS[key][res_source_key],method, repr(args)))
+ logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args)))
+ call_subprocess(args,
+ cwd=os.path.abspath(tmp_dir),
+ filter_stdout=filter_python_develop,
+ show_stdout=True,
+ extra_env=extra_env)
+ if method == 'pip-req':
+ if sys.platform == 'win32':
+ args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'pip')), 'install', '-r', res_path]
+ else:
+ args = [os.path.abspath(os.path.join(home_dir, 'bin', 'pip')), 'install', '-r', res_path]
+ if option_str :
+ args.append(option_str)
+ if res_source_key == 'local':
+ if extra_env is None:
+ extra_env = {}
+ extra_env["PIP_DOWNLOAD_CACHE"] = res_env.get_src_base_path("")
+ args.insert(2, '-f')
+ args.insert(3, res_env.get_src_base_path(""))
+ args.insert(4, '--no-index')
+ logger.notify("Install %s from %s with %s args %s " % (key,res_path,method, repr(args)))
call_subprocess(args,
cwd=os.path.abspath(tmp_dir),
filter_stdout=filter_python_develop,
@@ -227,9 +255,9 @@
extra_env=extra_env)
else:
if sys.platform == 'win32':
- args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_env.URLS[key][res_source_key]]
+ args = [os.path.abspath(os.path.join(home_dir, 'Scripts', 'easy_install')), res_path]
else:
- args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_env.URLS[key][res_source_key]]
+ args = [os.path.abspath(os.path.join(home_dir, 'bin', 'easy_install')), res_path]
if option_str :
args.insert(1,option_str)
call_subprocess(args,
@@ -272,9 +300,16 @@
logger.indent += 2
try:
for key in res_env.NORMAL_INSTALL:
- if key not in res_env.URLS:
- logger.notify("%s not found in def : passing" % (key,))
- install_options = res_env.URLS[key].get('install', None)
+ install_options = None
+ if isinstance(key, dict):
+ install_options = key.get('install', default_install_options)
+ install_options['method'] = 'pip-req'
+ res_path = res_env.get_run_res_base_path(key['requirement'])
+ else:
+ if key not in res_env.URLS:
+ logger.notify("%s not found in def : passing" % (key,))
+ install_options = res_env.URLS[key].get('install', None)
+ res_path = res_env.URLS[key][res_source_key]
if install_options is None:
install_options = default_install_options
method = install_options.get('method', default_install_options['method'])
@@ -293,7 +328,7 @@
elif method in globals() and callable(globals()[method]) and method not in ['pip', 'easy_install']:
globals()[method](option_str, extra_env, res_source_key, home_dir, lib_dir, tmp_dir, src_dir, res_env, logger, call_subprocess, filter_python_develop)
else:
- normal_install(key, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess)
+ normal_install(key, res_path, method, option_str, extra_env, res_source_key, home_dir, tmp_dir, res_env, logger, call_subprocess)
logger.notify("Clear source dir")
shutil.rmtree(src_dir)