summaryrefslogtreecommitdiffstats
path: root/pre_commit/languages
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2021-09-06 04:23:53 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2021-09-06 04:24:09 +0000
commit1968ada2d36e4508ef787e57f0e5f63214bcbad7 (patch)
tree69c01b5108b09faafa39e56ae48add8a2439f9db /pre_commit/languages
parentReleasing debian version 2.14.0-2. (diff)
downloadpre-commit-1968ada2d36e4508ef787e57f0e5f63214bcbad7.tar.xz
pre-commit-1968ada2d36e4508ef787e57f0e5f63214bcbad7.zip
Merging upstream version 2.15.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'pre_commit/languages')
-rw-r--r--pre_commit/languages/all.py2
-rw-r--r--pre_commit/languages/dart.py109
-rw-r--r--pre_commit/languages/helpers.py4
-rw-r--r--pre_commit/languages/python.py3
4 files changed, 115 insertions, 3 deletions
diff --git a/pre_commit/languages/all.py b/pre_commit/languages/all.py
index fde6000..d8a364c 100644
--- a/pre_commit/languages/all.py
+++ b/pre_commit/languages/all.py
@@ -7,6 +7,7 @@ from typing import Tuple
from pre_commit.hook import Hook
from pre_commit.languages import conda
from pre_commit.languages import coursier
+from pre_commit.languages import dart
from pre_commit.languages import docker
from pre_commit.languages import docker_image
from pre_commit.languages import dotnet
@@ -44,6 +45,7 @@ languages = {
# BEGIN GENERATED (testing/gen-languages-all)
'conda': Language(name='conda', ENVIRONMENT_DIR=conda.ENVIRONMENT_DIR, get_default_version=conda.get_default_version, healthy=conda.healthy, install_environment=conda.install_environment, run_hook=conda.run_hook), # noqa: E501
'coursier': Language(name='coursier', ENVIRONMENT_DIR=coursier.ENVIRONMENT_DIR, get_default_version=coursier.get_default_version, healthy=coursier.healthy, install_environment=coursier.install_environment, run_hook=coursier.run_hook), # noqa: E501
+ 'dart': Language(name='dart', ENVIRONMENT_DIR=dart.ENVIRONMENT_DIR, get_default_version=dart.get_default_version, healthy=dart.healthy, install_environment=dart.install_environment, run_hook=dart.run_hook), # noqa: E501
'docker': Language(name='docker', ENVIRONMENT_DIR=docker.ENVIRONMENT_DIR, get_default_version=docker.get_default_version, healthy=docker.healthy, install_environment=docker.install_environment, run_hook=docker.run_hook), # noqa: E501
'docker_image': Language(name='docker_image', ENVIRONMENT_DIR=docker_image.ENVIRONMENT_DIR, get_default_version=docker_image.get_default_version, healthy=docker_image.healthy, install_environment=docker_image.install_environment, run_hook=docker_image.run_hook), # noqa: E501
'dotnet': Language(name='dotnet', ENVIRONMENT_DIR=dotnet.ENVIRONMENT_DIR, get_default_version=dotnet.get_default_version, healthy=dotnet.healthy, install_environment=dotnet.install_environment, run_hook=dotnet.run_hook), # noqa: E501
diff --git a/pre_commit/languages/dart.py b/pre_commit/languages/dart.py
new file mode 100644
index 0000000..16e7554
--- /dev/null
+++ b/pre_commit/languages/dart.py
@@ -0,0 +1,109 @@
+import contextlib
+import os.path
+import shutil
+import tempfile
+from typing import Generator
+from typing import Sequence
+from typing import Tuple
+
+import pre_commit.constants as C
+from pre_commit.envcontext import envcontext
+from pre_commit.envcontext import PatchesT
+from pre_commit.envcontext import Var
+from pre_commit.hook import Hook
+from pre_commit.languages import helpers
+from pre_commit.prefix import Prefix
+from pre_commit.util import clean_path_on_failure
+from pre_commit.util import win_exe
+from pre_commit.util import yaml_load
+
+ENVIRONMENT_DIR = 'dartenv'
+
+get_default_version = helpers.basic_get_default_version
+healthy = helpers.basic_healthy
+
+
+def get_env_patch(venv: str) -> PatchesT:
+ return (
+ ('PATH', (os.path.join(venv, 'bin'), os.pathsep, Var('PATH'))),
+ )
+
+
+@contextlib.contextmanager
+def in_env(prefix: Prefix) -> Generator[None, None, None]:
+ directory = helpers.environment_dir(ENVIRONMENT_DIR, C.DEFAULT)
+ envdir = prefix.path(directory)
+ with envcontext(get_env_patch(envdir)):
+ yield
+
+
+def install_environment(
+ prefix: Prefix,
+ version: str,
+ additional_dependencies: Sequence[str],
+) -> None:
+ helpers.assert_version_default('dart', version)
+
+ envdir = prefix.path(helpers.environment_dir(ENVIRONMENT_DIR, version))
+ bin_dir = os.path.join(envdir, 'bin')
+
+ def _install_dir(prefix_p: Prefix, pub_cache: str) -> None:
+ dart_env = {**os.environ, 'PUB_CACHE': pub_cache}
+
+ with open(prefix_p.path('pubspec.yaml')) as f:
+ pubspec_contents = yaml_load(f)
+
+ helpers.run_setup_cmd(prefix_p, ('dart', 'pub', 'get'), env=dart_env)
+
+ for executable in pubspec_contents['executables']:
+ helpers.run_setup_cmd(
+ prefix_p,
+ (
+ 'dart', 'compile', 'exe',
+ '--output', os.path.join(bin_dir, win_exe(executable)),
+ prefix_p.path('bin', f'{executable}.dart'),
+ ),
+ env=dart_env,
+ )
+
+ with clean_path_on_failure(envdir):
+ os.makedirs(bin_dir)
+
+ with tempfile.TemporaryDirectory() as tmp:
+ _install_dir(prefix, tmp)
+
+ for dep_s in additional_dependencies:
+ with tempfile.TemporaryDirectory() as dep_tmp:
+ dep, _, version = dep_s.partition(':')
+ if version:
+ dep_cmd: Tuple[str, ...] = (dep, '--version', version)
+ else:
+ dep_cmd = (dep,)
+
+ helpers.run_setup_cmd(
+ prefix,
+ ('dart', 'pub', 'cache', 'add', *dep_cmd),
+ env={**os.environ, 'PUB_CACHE': dep_tmp},
+ )
+
+ # try and find the 'pubspec.yaml' that just got added
+ for root, _, filenames in os.walk(dep_tmp):
+ if 'pubspec.yaml' in filenames:
+ with tempfile.TemporaryDirectory() as copied:
+ pkg = os.path.join(copied, 'pkg')
+ shutil.copytree(root, pkg)
+ _install_dir(Prefix(pkg), dep_tmp)
+ break
+ else:
+ raise AssertionError(
+ f'could not find pubspec.yaml for {dep_s}',
+ )
+
+
+def run_hook(
+ hook: Hook,
+ file_args: Sequence[str],
+ color: bool,
+) -> Tuple[int, bytes]:
+ with in_env(hook.prefix):
+ return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
diff --git a/pre_commit/languages/helpers.py b/pre_commit/languages/helpers.py
index 29138fd..276ce16 100644
--- a/pre_commit/languages/helpers.py
+++ b/pre_commit/languages/helpers.py
@@ -48,8 +48,8 @@ def exe_exists(exe: str) -> bool:
)
-def run_setup_cmd(prefix: Prefix, cmd: Tuple[str, ...]) -> None:
- cmd_output_b(*cmd, cwd=prefix.prefix_dir)
+def run_setup_cmd(prefix: Prefix, cmd: Tuple[str, ...], **kwargs: Any) -> None:
+ cmd_output_b(*cmd, cwd=prefix.prefix_dir, **kwargs)
@overload
diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py
index 43b7280..faa6029 100644
--- a/pre_commit/languages/python.py
+++ b/pre_commit/languages/python.py
@@ -21,6 +21,7 @@ from pre_commit.util import CalledProcessError
from pre_commit.util import clean_path_on_failure
from pre_commit.util import cmd_output
from pre_commit.util import cmd_output_b
+from pre_commit.util import win_exe
ENVIRONMENT_DIR = 'py_env'
@@ -172,7 +173,7 @@ def healthy(prefix: Prefix, language_version: str) -> bool:
if not os.path.exists(pyvenv_cfg):
return False
- exe_name = 'python.exe' if sys.platform == 'win32' else 'python'
+ exe_name = win_exe('python')
py_exe = prefix.path(bin_dir(envdir), exe_name)
cfg = _read_pyvenv_cfg(pyvenv_cfg)