diff options
| author | Seungmin Ryu <yakkle@gmail.com> | 2020-02-26 17:17:01 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-26 08:17:01 +0000 |
| commit | c3453b6c381d28377c8e0115bf1124b2ca7b3c2b (patch) | |
| tree | a0fba9154991f4d4c6d89158a97550e02b8de64f /src/virtualenv/seed/embed | |
| parent | 45d2802651cda42f3202945fee73835253782b4e (diff) | |
| download | virtualenv-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.py | 3 | ||||
| -rw-r--r-- | src/virtualenv/seed/embed/pip_invoke.py | 4 | ||||
| -rw-r--r-- | src/virtualenv/seed/embed/wheels/acquire.py | 12 |
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 |
