|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +import contextlib |
| 4 | +import os.path |
| 5 | +from typing import Generator |
| 6 | +from typing import Sequence |
| 7 | + |
| 8 | +from pre_commit import lang_base |
| 9 | +from pre_commit.envcontext import envcontext |
| 10 | +from pre_commit.envcontext import PatchesT |
| 11 | +from pre_commit.envcontext import Var |
| 12 | +from pre_commit.errors import FatalError |
| 13 | +from pre_commit.prefix import Prefix |
| 14 | + |
| 15 | +ENVIRONMENT_DIR = 'hs_env' |
| 16 | +get_default_version = lang_base.basic_get_default_version |
| 17 | +health_check = lang_base.basic_health_check |
| 18 | +run_hook = lang_base.basic_run_hook |
| 19 | + |
| 20 | + |
| 21 | +def get_env_patch(target_dir: str) -> PatchesT: |
| 22 | + bin_path = os.path.join(target_dir, 'bin') |
| 23 | + return (('PATH', (bin_path, os.pathsep, Var('PATH'))),) |
| 24 | + |
| 25 | + |
| 26 | +@contextlib.contextmanager |
| 27 | +def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: |
| 28 | + envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) |
| 29 | + with envcontext(get_env_patch(envdir)): |
| 30 | + yield |
| 31 | + |
| 32 | + |
| 33 | +def install_environment( |
| 34 | + prefix: Prefix, |
| 35 | + version: str, |
| 36 | + additional_dependencies: Sequence[str], |
| 37 | +) -> None: |
| 38 | + lang_base.assert_version_default('haskell', version) |
| 39 | + envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) |
| 40 | + |
| 41 | + pkgs = [*prefix.star('.cabal'), *additional_dependencies] |
| 42 | + if not pkgs: |
| 43 | + raise FatalError('Expected .cabal files or additional_dependencies') |
| 44 | + |
| 45 | + bindir = os.path.join(envdir, 'bin') |
| 46 | + os.makedirs(bindir, exist_ok=True) |
| 47 | + lang_base.setup_cmd(prefix, ('cabal', 'update')) |
| 48 | + lang_base.setup_cmd( |
| 49 | + prefix, |
| 50 | + ( |
| 51 | + 'cabal', 'install', |
| 52 | + '--install-method', 'copy', |
| 53 | + '--installdir', bindir, |
| 54 | + *pkgs, |
| 55 | + ), |
| 56 | + ) |
0 commit comments