Skip to content

Commit

Permalink
Merge pull request #2669 from pre-commit/env_dir
Browse files Browse the repository at this point in the history
simplify environment_dir
  • Loading branch information
asottile committed Jan 2, 2023
2 parents 10f835c + 05c8911 commit c787efd
Show file tree
Hide file tree
Showing 17 changed files with 77 additions and 103 deletions.
6 changes: 2 additions & 4 deletions pre_commit/languages/conda.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]:
directory = helpers.environment_dir(ENVIRONMENT_DIR, language_version)
envdir = prefix.path(directory)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir)):
yield

Expand All @@ -65,11 +64,10 @@ def install_environment(
additional_dependencies: Sequence[str],
) -> None:
helpers.assert_version_default('conda', version)
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)

conda_exe = _conda_exe()

env_dir = prefix.path(directory)
env_dir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
cmd_output_b(
conda_exe, 'env', 'create', '-p', env_dir, '--file',
'environment.yml', cwd=prefix.prefix_dir,
Expand Down
11 changes: 5 additions & 6 deletions pre_commit/languages/coursier.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def install_environment(
'executables in the application search path',
)

envdir = prefix.path(helpers.environment_dir(ENVIRONMENT_DIR, version))
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
channel = prefix.path('.pre-commit-channel')
for app_descriptor in os.listdir(channel):
_, app_file = os.path.split(app_descriptor)
Expand All @@ -62,11 +62,10 @@ def get_env_patch(target_dir: str) -> PatchesT: # pragma: win32 no cover
@contextlib.contextmanager
def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]: # pragma: win32 no cover
target_dir = prefix.path(
helpers.environment_dir(ENVIRONMENT_DIR, get_default_version()),
)
with envcontext(get_env_patch(target_dir)):
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir)):
yield


Expand All @@ -75,5 +74,5 @@ def run_hook(
file_args: Sequence[str],
color: bool,
) -> tuple[int, bytes]: # pragma: win32 no cover
with in_env(hook.prefix):
with in_env(hook.prefix, hook.language_version):
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
5 changes: 2 additions & 3 deletions pre_commit/languages/dart.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ def get_env_patch(venv: str) -> PatchesT:

@contextlib.contextmanager
def in_env(prefix: Prefix) -> Generator[None, None, None]:
directory = helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT)
envdir = prefix.path(directory)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)
with envcontext(get_env_patch(envdir)):
yield

Expand All @@ -44,7 +43,7 @@ def install_environment(
) -> None:
helpers.assert_version_default('dart', version)

envdir = prefix.path(helpers.environment_dir(ENVIRONMENT_DIR, version))
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
bin_dir = os.path.join(envdir, 'bin')

def _install_dir(prefix_p: Prefix, pub_cache: str) -> None:
Expand Down
4 changes: 1 addition & 3 deletions pre_commit/languages/docker.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,7 @@ def install_environment(
helpers.assert_version_default('docker', version)
helpers.assert_no_additional_deps('docker', additional_dependencies)

directory = prefix.path(
helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT),
)
directory = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)

# Docker doesn't really have relevant disk environment, but pre-commit
# still needs to cleanup its state files on failure
Expand Down
5 changes: 2 additions & 3 deletions pre_commit/languages/dotnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ def get_env_patch(venv: str) -> PatchesT:

@contextlib.contextmanager
def in_env(prefix: Prefix) -> Generator[None, None, None]:
directory = helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT)
envdir = prefix.path(directory)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)
with envcontext(get_env_patch(envdir)):
yield

Expand Down Expand Up @@ -62,7 +61,7 @@ def install_environment(
helpers.assert_version_default('dotnet', version)
helpers.assert_no_additional_deps('dotnet', additional_dependencies)

envdir = prefix.path(helpers.environment_dir(ENVIRONMENT_DIR, version))
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
build_dir = 'pre-commit-build'

# Build & pack nupkg file
Expand Down
8 changes: 2 additions & 6 deletions pre_commit/languages/golang.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,7 @@ def get_env_patch(venv: str) -> PatchesT:

@contextlib.contextmanager
def in_env(prefix: Prefix) -> Generator[None, None, None]:
envdir = prefix.path(
helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT),
)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)
with envcontext(get_env_patch(envdir)):
yield

Expand All @@ -60,9 +58,7 @@ def install_environment(
additional_dependencies: Sequence[str],
) -> None:
helpers.assert_version_default('golang', version)
directory = prefix.path(
helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT),
)
directory = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)

remote = git.get_remote_url(prefix.prefix_dir)
repo_src_dir = os.path.join(directory, 'src', guess_go_dir(remote))
Expand Down
4 changes: 2 additions & 2 deletions pre_commit/languages/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ def run_setup_cmd(prefix: Prefix, cmd: tuple[str, ...], **kwargs: Any) -> None:
cmd_output_b(*cmd, cwd=prefix.prefix_dir, **kwargs)


def environment_dir(d: str, language_version: str) -> str:
return f'{d}-{language_version}'
def environment_dir(prefix: Prefix, d: str, language_version: str) -> str:
return prefix.path(f'{d}-{language_version}')


def assert_version_default(binary: str, version: str) -> None:
Expand Down
10 changes: 3 additions & 7 deletions pre_commit/languages/lua.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,10 @@ def get_env_patch(d: str) -> PatchesT: # pragma: win32 no cover
)


def _envdir(prefix: Prefix) -> str: # pragma: win32 no cover
directory = helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT)
return prefix.path(directory)


@contextlib.contextmanager # pragma: win32 no cover
def in_env(prefix: Prefix) -> Generator[None, None, None]:
with envcontext(get_env_patch(_envdir(prefix))):
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)
with envcontext(get_env_patch(envdir)):
yield


Expand All @@ -62,7 +58,7 @@ def install_environment(
) -> None: # pragma: win32 no cover
helpers.assert_version_default('lua', version)

envdir = _envdir(prefix)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)
with in_env(prefix):
# luarocks doesn't bootstrap a tree prior to installing
# so ensure the directory exists.
Expand Down
10 changes: 3 additions & 7 deletions pre_commit/languages/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,6 @@ def get_default_version() -> str:
return C.DEFAULT


def _envdir(prefix: Prefix, version: str) -> str:
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
return prefix.path(directory)


def get_env_patch(venv: str) -> PatchesT:
if sys.platform == 'cygwin': # pragma: no cover
_, win_venv, _ = cmd_output('cygpath', '-w', venv)
Expand Down Expand Up @@ -68,7 +63,8 @@ def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]:
with envcontext(get_env_patch(_envdir(prefix, language_version))):
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir)):
yield


Expand All @@ -85,7 +81,7 @@ def install_environment(
prefix: Prefix, version: str, additional_dependencies: Sequence[str],
) -> None:
assert prefix.exists('package.json')
envdir = _envdir(prefix, version)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)

# https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx?f=255&MSPPError=-2147217396#maxpath
if sys.platform == 'win32': # pragma: no cover
Expand Down
8 changes: 2 additions & 6 deletions pre_commit/languages/perl.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,6 @@
health_check = helpers.basic_health_check


def _envdir(prefix: Prefix, version: str) -> str:
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
return prefix.path(directory)


def get_env_patch(venv: str) -> PatchesT:
return (
('PATH', (os.path.join(venv, 'bin'), os.pathsep, Var('PATH'))),
Expand All @@ -42,7 +37,8 @@ def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]:
with envcontext(get_env_patch(_envdir(prefix, language_version))):
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir)):
yield


Expand Down
8 changes: 3 additions & 5 deletions pre_commit/languages/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,13 @@ def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]:
directory = helpers.environment_dir(ENVIRONMENT_DIR, language_version)
envdir = prefix.path(directory)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir)):
yield


def health_check(prefix: Prefix, language_version: str) -> str | None:
directory = helpers.environment_dir(ENVIRONMENT_DIR, language_version)
envdir = prefix.path(directory)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
pyvenv_cfg = os.path.join(envdir, 'pyvenv.cfg')

# created with "old" virtualenv
Expand Down Expand Up @@ -207,7 +205,7 @@ def install_environment(
version: str,
additional_dependencies: Sequence[str],
) -> None:
envdir = prefix.path(helpers.environment_dir(ENVIRONMENT_DIR, version))
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
venv_cmd = [sys.executable, '-mvirtualenv', envdir]
python = norm_version(version)
if python is not None:
Expand Down
8 changes: 2 additions & 6 deletions pre_commit/languages/r.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,11 @@ def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]:
envdir = _get_env_dir(prefix, language_version)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir)):
yield


def _get_env_dir(prefix: Prefix, version: str) -> str:
return prefix.path(helpers.environment_dir(ENVIRONMENT_DIR, version))


def _prefix_if_file_entry(entry: list[str], prefix: Prefix) -> Sequence[str]:
if entry[1] == '-e':
return entry[1:]
Expand Down Expand Up @@ -93,7 +89,7 @@ def install_environment(
version: str,
additional_dependencies: Sequence[str],
) -> None:
env_dir = _get_env_dir(prefix, version)
env_dir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)
os.makedirs(env_dir, exist_ok=True)
shutil.copy(prefix.path('renv.lock'), env_dir)
shutil.copytree(prefix.path('renv'), os.path.join(env_dir, 'renv'))
Expand Down
10 changes: 4 additions & 6 deletions pre_commit/languages/ruby.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,7 @@ def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]:
envdir = prefix.path(
helpers.environment_dir(ENVIRONMENT_DIR, language_version),
)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir, language_version)):
yield

Expand All @@ -88,14 +86,14 @@ def _install_rbenv(
prefix: Prefix,
version: str,
) -> None: # pragma: win32 no cover
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)

_extract_resource('rbenv.tar.gz', prefix.path('.'))
shutil.move(prefix.path('rbenv'), prefix.path(directory))
shutil.move(prefix.path('rbenv'), envdir)

# Only install ruby-build if the version is specified
if version != C.DEFAULT:
plugins_dir = prefix.path(directory, 'plugins')
plugins_dir = os.path.join(envdir, 'plugins')
_extract_resource('ruby-download.tar.gz', plugins_dir)
_extract_resource('ruby-build.tar.gz', plugins_dir)

Expand Down
14 changes: 4 additions & 10 deletions pre_commit/languages/rust.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,6 @@ def _rust_toolchain(language_version: str) -> str:
return language_version


def _envdir(prefix: Prefix, version: str) -> str:
directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
return prefix.path(directory)


def get_env_patch(target_dir: str, version: str) -> PatchesT:
return (
('CARGO_HOME', target_dir),
Expand All @@ -71,9 +66,8 @@ def in_env(
prefix: Prefix,
language_version: str,
) -> Generator[None, None, None]:
with envcontext(
get_env_patch(_envdir(prefix, language_version), language_version),
):
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, language_version)
with envcontext(get_env_patch(envdir, language_version)):
yield


Expand Down Expand Up @@ -125,7 +119,7 @@ def install_environment(
version: str,
additional_dependencies: Sequence[str],
) -> None:
directory = _envdir(prefix, version)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, version)

# There are two cases where we might want to specify more dependencies:
# as dependencies for the library being built, and as binary packages
Expand Down Expand Up @@ -160,7 +154,7 @@ def install_environment(

for args in packages_to_install:
cmd_output_b(
'cargo', 'install', '--bins', '--root', directory, *args,
'cargo', 'install', '--bins', '--root', envdir, *args,
cwd=prefix.prefix_dir,
)

Expand Down
12 changes: 4 additions & 8 deletions pre_commit/languages/swift.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ def get_env_patch(venv: str) -> PatchesT: # pragma: win32 no cover

@contextlib.contextmanager # pragma: win32 no cover
def in_env(prefix: Prefix) -> Generator[None, None, None]:
envdir = prefix.path(
helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT),
)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)
with envcontext(get_env_patch(envdir)):
yield

Expand All @@ -40,17 +38,15 @@ def install_environment(
) -> None: # pragma: win32 no cover
helpers.assert_version_default('swift', version)
helpers.assert_no_additional_deps('swift', additional_dependencies)
directory = prefix.path(
helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT),
)
envdir = helpers.environment_dir(prefix, ENVIRONMENT_DIR, C.DEFAULT)

# Build the swift package
os.mkdir(directory)
os.mkdir(envdir)
cmd_output_b(
'swift', 'build',
'-C', prefix.prefix_dir,
'-c', BUILD_CONFIG,
'--build-path', os.path.join(directory, BUILD_DIR),
'--build-path', os.path.join(envdir, BUILD_DIR),
)


Expand Down
14 changes: 10 additions & 4 deletions pre_commit/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,11 @@ def _hook_installed(hook: Hook) -> bool:
if lang.ENVIRONMENT_DIR is None:
return True

venv = environment_dir(lang.ENVIRONMENT_DIR, hook.language_version)
venv = hook.prefix.path(venv)
venv = environment_dir(
hook.prefix,
lang.ENVIRONMENT_DIR,
hook.language_version,
)
return (
_read_state(venv) == _state(hook.additional_dependencies) and
not lang.health_check(hook.prefix, hook.language_version)
Expand All @@ -61,8 +64,11 @@ def _hook_install(hook: Hook) -> None:
lang = languages[hook.language]
assert lang.ENVIRONMENT_DIR is not None

venv = environment_dir(lang.ENVIRONMENT_DIR, hook.language_version)
venv = hook.prefix.path(venv)
venv = environment_dir(
hook.prefix,
lang.ENVIRONMENT_DIR,
hook.language_version,
)

# There's potentially incomplete cleanup from previous runs
# Clean it up!
Expand Down

0 comments on commit c787efd

Please sign in to comment.