summaryrefslogtreecommitdiff
path: root/src/virtualenv/seed/embed
diff options
context:
space:
mode:
authorSeungmin Ryu <yakkle@gmail.com>2020-02-26 17:17:01 +0900
committerGitHub <noreply@github.com>2020-02-26 08:17:01 +0000
commitc3453b6c381d28377c8e0115bf1124b2ca7b3c2b (patch)
treea0fba9154991f4d4c6d89158a97550e02b8de64f /src/virtualenv/seed/embed
parent45d2802651cda42f3202945fee73835253782b4e (diff)
downloadvirtualenv-c3453b6c381d28377c8e0115bf1124b2ca7b3c2b.tar.gz
handle application data folder is read only (#1661)
* fixed FileNotFoundError when directory isn't writable (#1640) - when using docker, if `user_data_dir()` isn't writable directory, `default_data_dir()` use `system temp directory` + `virtualenv`. for example, tempdir is `/tmp`, it use `/tmp/virtualenv` * start making the app-data more explicit and robust Signed-off-by: Bernat Gabor <bgabor8@bloomberg.net> * fix Windows * fix docs Signed-off-by: Bernat Gabor <bgabor8@bloomberg.net> Co-authored-by: Bernát Gábor <gaborjbernat@gmail.com>
Diffstat (limited to 'src/virtualenv/seed/embed')
-rw-r--r--src/virtualenv/seed/embed/base_embed.py3
-rw-r--r--src/virtualenv/seed/embed/pip_invoke.py4
-rw-r--r--src/virtualenv/seed/embed/wheels/acquire.py12
3 files changed, 10 insertions, 9 deletions
diff --git a/src/virtualenv/seed/embed/base_embed.py b/src/virtualenv/seed/embed/base_embed.py
index 753eeb2..98ba65f 100644
--- a/src/virtualenv/seed/embed/base_embed.py
+++ b/src/virtualenv/seed/embed/base_embed.py
@@ -31,12 +31,13 @@ class BaseEmbed(Seeder):
self.no_pip = options.no_pip
self.no_setuptools = options.no_setuptools
self.no_wheel = options.no_wheel
+ self.app_data = options.app_data.folder
def package_version(self):
return {package: getattr(self, "{}_version".format(package)) for package in self.packages}
@classmethod
- def add_parser_arguments(cls, parser, interpreter):
+ def add_parser_arguments(cls, parser, interpreter, app_data):
group = parser.add_mutually_exclusive_group()
group.add_argument(
"--download",
diff --git a/src/virtualenv/seed/embed/pip_invoke.py b/src/virtualenv/seed/embed/pip_invoke.py
index 4b35ee5..c007af3 100644
--- a/src/virtualenv/seed/embed/pip_invoke.py
+++ b/src/virtualenv/seed/embed/pip_invoke.py
@@ -24,7 +24,7 @@ class PipInvoke(BaseEmbed):
if not self.enabled:
return
with self.get_pip_install_cmd(creator.exe, creator.interpreter.version_release_str) as cmd:
- with pip_wheel_env_run(creator.interpreter.version_release_str) as env:
+ with pip_wheel_env_run(creator.interpreter.version_release_str, self.app_data) as env:
logging.debug("pip seed by running: %s", LogCmd(cmd, env))
process = Popen(cmd, env=env)
process.communicate()
@@ -40,7 +40,7 @@ class PipInvoke(BaseEmbed):
cmd.append("{}{}".format(key, "=={}".format(ver) if ver is not None else ""))
with ExitStack() as stack:
folders = set()
- for context in (ensure_file_on_disk(get_bundled_wheel(p, version)) for p in self.packages):
+ for context in (ensure_file_on_disk(get_bundled_wheel(p, version), self.app_data) for p in self.packages):
folders.add(stack.enter_context(context).parent)
for folder in folders:
cmd.extend(["--find-links", str(folder)])
diff --git a/src/virtualenv/seed/embed/wheels/acquire.py b/src/virtualenv/seed/embed/wheels/acquire.py
index 3be475f..dd25acc 100644
--- a/src/virtualenv/seed/embed/wheels/acquire.py
+++ b/src/virtualenv/seed/embed/wheels/acquire.py
@@ -21,7 +21,7 @@ from . import BUNDLE_SUPPORT, MAX
BUNDLE_FOLDER = Path(os.path.abspath(__file__)).parent
-def get_wheels(for_py_version, wheel_cache_dir, extra_search_dir, download, packages):
+def get_wheels(for_py_version, wheel_cache_dir, extra_search_dir, download, packages, app_data):
# not all wheels are compatible with all python versions, so we need to py version qualify it
processed = copy(packages)
# 1. acquire from bundle
@@ -30,7 +30,7 @@ def get_wheels(for_py_version, wheel_cache_dir, extra_search_dir, download, pack
acquire_from_dir(processed, for_py_version, wheel_cache_dir, extra_search_dir)
# 3. download from the internet
if download and processed:
- download_wheel(processed, for_py_version, wheel_cache_dir)
+ download_wheel(processed, for_py_version, wheel_cache_dir, app_data)
# in the end just get the wheels
wheels = _get_wheels(wheel_cache_dir, packages)
@@ -126,7 +126,7 @@ def _get_wheels(from_folder, packages):
return wheels
-def download_wheel(packages, for_py_version, to_folder):
+def download_wheel(packages, for_py_version, to_folder, app_data):
to_download = list(p if v is None else "{}={}".format(p, v) for p, v in packages.items())
logging.debug("download wheels %s", to_download)
cmd = [
@@ -145,7 +145,7 @@ def download_wheel(packages, for_py_version, to_folder):
cmd.extend(to_download)
# pip has no interface in python - must be a new sub-process
- with pip_wheel_env_run("{}{}".format(*sys.version_info[0:2])) as env:
+ with pip_wheel_env_run("{}{}".format(*sys.version_info[0:2]), app_data) as env:
process = Popen(cmd, env=env, stdout=subprocess.PIPE)
process.communicate()
if process.returncode != 0:
@@ -153,7 +153,7 @@ def download_wheel(packages, for_py_version, to_folder):
@contextmanager
-def pip_wheel_env_run(version):
+def pip_wheel_env_run(version, app_data):
env = os.environ.copy()
env.update(
{
@@ -161,7 +161,7 @@ def pip_wheel_env_run(version):
for k, v in {"PIP_USE_WHEEL": "1", "PIP_USER": "0", "PIP_NO_INPUT": "1"}.items()
}
)
- with ensure_file_on_disk(get_bundled_wheel("pip", version)) as pip_wheel_path:
+ with ensure_file_on_disk(get_bundled_wheel("pip", version), app_data) as pip_wheel_path:
# put the bundled wheel onto the path, and use it to do the bootstrap operation
env[str("PYTHONPATH")] = str(pip_wheel_path)
yield env