diff --git a/pre_commit/languages/haskell.py b/pre_commit/languages/haskell.py index 28bca08cc..a1a744f35 100644 --- a/pre_commit/languages/haskell.py +++ b/pre_commit/languages/haskell.py @@ -43,12 +43,13 @@ def install_environment( raise FatalError('Expected .cabal files or additional_dependencies') bindir = os.path.join(envdir, 'bin') + storedir = os.path.join(envdir, 'store') os.makedirs(bindir, exist_ok=True) lang_base.setup_cmd(prefix, ('cabal', 'update')) lang_base.setup_cmd( prefix, ( - 'cabal', 'install', + 'cabal', '--store-dir', storedir, 'install', '--install-method', 'copy', '--installdir', bindir, *pkgs, diff --git a/tests/languages/haskell_test.py b/tests/languages/haskell_test.py index f888109bd..8254e7bb9 100644 --- a/tests/languages/haskell_test.py +++ b/tests/languages/haskell_test.py @@ -1,13 +1,43 @@ from __future__ import annotations +from unittest import mock + import pytest +import pre_commit.constants as C +from pre_commit import lang_base from pre_commit.errors import FatalError from pre_commit.languages import haskell +from pre_commit.prefix import Prefix from pre_commit.util import win_exe from testing.language_helpers import run_language +def test_install_uses_env_local_store(tmp_path): + hook_dir = tmp_path.joinpath('hook dir') + hook_dir.mkdir() + hook_dir.joinpath('example.cabal').touch() + prefix = Prefix(str(hook_dir)) + envdir = hook_dir.joinpath('hs_env-default') + + with mock.patch.object(lang_base, 'setup_cmd') as setup_cmd: + haskell.install_environment(prefix, C.DEFAULT, ()) + + assert setup_cmd.call_args_list == [ + mock.call(prefix, ('cabal', 'update')), + mock.call( + prefix, + ( + 'cabal', '--store-dir', str(envdir.joinpath('store')), + 'install', + '--install-method', 'copy', + '--installdir', str(envdir.joinpath('bin')), + 'example.cabal', + ), + ), + ] + + def test_run_example_executable(tmp_path): example_cabal = '''\ cabal-version: 2.4 @@ -41,6 +71,7 @@ def test_run_example_executable(tmp_path): def test_run_dep(tmp_path): result = run_language(tmp_path, haskell, 'hello', deps=['hello']) assert result == (0, b'Hello, World!\n') + assert tmp_path.joinpath('hs_env-default', 'store').is_dir() def test_run_empty(tmp_path):