1
0
Fork 0

Adding upstream version 2.6.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-09 21:20:56 +01:00
parent bb6dbf8636
commit 155c6d8e29
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
9 changed files with 111 additions and 41 deletions

View file

@ -1,3 +1,18 @@
2.6.0 - 2020-07-01
==================
### Fixes
- Fix node hooks when `NPM_CONFIG_USERCONFIG` is set
- #1521 PR by @asottile.
- #1516 issue by @rkm.
### Features
- Skip `rbenv` / `ruby-download` if system ruby is available
- #1509 PR by @asottile.
- Partial support for ruby on windows (if system ruby is installed)
- #1509 PR by @asottile.
- #201 issue by @asottile.
2.5.1 - 2020-06-09 2.5.1 - 2020-06-09
================== ==================

View file

@ -4,12 +4,16 @@
- The complete test suite depends on having at least the following installed - The complete test suite depends on having at least the following installed
(possibly not a complete list) (possibly not a complete list)
- git (A sufficiently newer version is required to run pre-push tests) - git (Version 2.24.0 or above is required to run pre-merge-commit tests)
- python2 (Required by a test which checks different python versions) - python2 (Required by a test which checks different python versions)
- python3 (Required by a test which checks different python versions) - python3 (Required by a test which checks different python versions)
- tox (or virtualenv) - tox (or virtualenv)
- ruby + gem - ruby + gem
- docker - docker
- conda
- cargo (required by tests for rust dependencies)
- go (required by tests for go dependencies)
- swift
### Setting up an environment ### Setting up an environment

View file

@ -19,6 +19,7 @@ jobs:
toxenvs: [py37] toxenvs: [py37]
os: windows os: windows
pre_test: pre_test:
- task: UseRubyVersion@0
- powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts" - powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts"
displayName: Add conda to PATH displayName: Add conda to PATH
- powershell: | - powershell: |

View file

@ -10,6 +10,7 @@ import pre_commit.constants as C
from pre_commit import parse_shebang from pre_commit import parse_shebang
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import UNSET
from pre_commit.envcontext import Var from pre_commit.envcontext import Var
from pre_commit.hook import Hook from pre_commit.hook import Hook
from pre_commit.languages import helpers from pre_commit.languages import helpers
@ -56,6 +57,8 @@ def get_env_patch(venv: str) -> PatchesT:
('NODE_VIRTUAL_ENV', venv), ('NODE_VIRTUAL_ENV', venv),
('NPM_CONFIG_PREFIX', install_prefix), ('NPM_CONFIG_PREFIX', install_prefix),
('npm_config_prefix', install_prefix), ('npm_config_prefix', install_prefix),
('NPM_CONFIG_USERCONFIG', UNSET),
('npm_config_userconfig', UNSET),
('NODE_PATH', os.path.join(venv, lib_dir, 'node_modules')), ('NODE_PATH', os.path.join(venv, lib_dir, 'node_modules')),
('PATH', (bin_dir(venv), os.pathsep, Var('PATH'))), ('PATH', (bin_dir(venv), os.pathsep, Var('PATH'))),
) )

View file

@ -1,4 +1,5 @@
import contextlib import contextlib
import functools
import os.path import os.path
import shutil import shutil
import tarfile import tarfile
@ -7,6 +8,7 @@ from typing import Sequence
from typing import Tuple from typing import Tuple
import pre_commit.constants as C import pre_commit.constants as C
from pre_commit import parse_shebang
from pre_commit.envcontext import envcontext from pre_commit.envcontext import envcontext
from pre_commit.envcontext import PatchesT from pre_commit.envcontext import PatchesT
from pre_commit.envcontext import UNSET from pre_commit.envcontext import UNSET
@ -19,33 +21,51 @@ from pre_commit.util import clean_path_on_failure
from pre_commit.util import resource_bytesio from pre_commit.util import resource_bytesio
ENVIRONMENT_DIR = 'rbenv' ENVIRONMENT_DIR = 'rbenv'
get_default_version = helpers.basic_get_default_version
healthy = helpers.basic_healthy healthy = helpers.basic_healthy
@functools.lru_cache(maxsize=1)
def get_default_version() -> str:
if all(parse_shebang.find_executable(exe) for exe in ('ruby', 'gem')):
return 'system'
else:
return C.DEFAULT
def get_env_patch( def get_env_patch(
venv: str, venv: str,
language_version: str, language_version: str,
) -> PatchesT: # pragma: win32 no cover ) -> PatchesT:
patches: PatchesT = ( patches: PatchesT = (
('GEM_HOME', os.path.join(venv, 'gems')), ('GEM_HOME', os.path.join(venv, 'gems')),
('GEM_PATH', UNSET), ('GEM_PATH', UNSET),
('RBENV_ROOT', venv),
('BUNDLE_IGNORE_CONFIG', '1'), ('BUNDLE_IGNORE_CONFIG', '1'),
(
'PATH', (
os.path.join(venv, 'gems', 'bin'), os.pathsep,
os.path.join(venv, 'shims'), os.pathsep,
os.path.join(venv, 'bin'), os.pathsep, Var('PATH'),
),
),
) )
if language_version != C.DEFAULT: if language_version == 'system':
patches += (('RBENV_VERSION', language_version),) patches += (
(
'PATH', (
os.path.join(venv, 'gems', 'bin'), os.pathsep,
Var('PATH'),
),
),
)
else: # pragma: win32 no cover
patches += (
('RBENV_ROOT', venv),
('RBENV_VERSION', language_version),
(
'PATH', (
os.path.join(venv, 'gems', 'bin'), os.pathsep,
os.path.join(venv, 'shims'), os.pathsep,
os.path.join(venv, 'bin'), os.pathsep, Var('PATH'),
),
),
)
return patches return patches
@contextlib.contextmanager # pragma: win32 no cover @contextlib.contextmanager
def in_env( def in_env(
prefix: Prefix, prefix: Prefix,
language_version: str, language_version: str,
@ -65,7 +85,7 @@ def _extract_resource(filename: str, dest: str) -> None:
def _install_rbenv( def _install_rbenv(
prefix: Prefix, prefix: Prefix,
version: str = C.DEFAULT, version: str,
) -> None: # pragma: win32 no cover ) -> None: # pragma: win32 no cover
directory = helpers.environment_dir(ENVIRONMENT_DIR, version) directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
@ -92,21 +112,22 @@ def _install_ruby(
def install_environment( def install_environment(
prefix: Prefix, version: str, additional_dependencies: Sequence[str], prefix: Prefix, version: str, additional_dependencies: Sequence[str],
) -> None: # pragma: win32 no cover ) -> None:
additional_dependencies = tuple(additional_dependencies) additional_dependencies = tuple(additional_dependencies)
directory = helpers.environment_dir(ENVIRONMENT_DIR, version) directory = helpers.environment_dir(ENVIRONMENT_DIR, version)
with clean_path_on_failure(prefix.path(directory)): with clean_path_on_failure(prefix.path(directory)):
# TODO: this currently will fail if there's no version specified and if version != 'system': # pragma: win32 no cover
# there's no system ruby installed. Is this ok? _install_rbenv(prefix, version)
_install_rbenv(prefix, version=version) with in_env(prefix, version):
with in_env(prefix, version): # Need to call this before installing so rbenv's directories
# Need to call this before installing so rbenv's directories are # are set up
# set up helpers.run_setup_cmd(prefix, ('rbenv', 'init', '-'))
helpers.run_setup_cmd(prefix, ('rbenv', 'init', '-')) # XXX: this will *always* fail if `version == C.DEFAULT`
if version != C.DEFAULT:
_install_ruby(prefix, version) _install_ruby(prefix, version)
# Need to call this after installing to set up the shims # Need to call this after installing to set up the shims
helpers.run_setup_cmd(prefix, ('rbenv', 'rehash')) helpers.run_setup_cmd(prefix, ('rbenv', 'rehash'))
with in_env(prefix, version):
helpers.run_setup_cmd( helpers.run_setup_cmd(
prefix, ('gem', 'build', *prefix.star('.gemspec')), prefix, ('gem', 'build', *prefix.star('.gemspec')),
) )
@ -123,6 +144,6 @@ def run_hook(
hook: Hook, hook: Hook,
file_args: Sequence[str], file_args: Sequence[str],
color: bool, color: bool,
) -> Tuple[int, bytes]: # pragma: win32 no cover ) -> Tuple[int, bytes]:
with in_env(hook.prefix, hook.language_version): with in_env(hook.prefix, hook.language_version):
return helpers.run_xargs(hook, hook.cmd, file_args, color=color) return helpers.run_xargs(hook, hook.cmd, file_args, color=color)

View file

@ -1,6 +1,6 @@
[metadata] [metadata]
name = pre_commit name = pre_commit
version = 2.5.1 version = 2.6.0
description = A framework for managing and maintaining multi-language pre-commit hooks. description = A framework for managing and maintaining multi-language pre-commit hooks.
long_description = file: README.md long_description = file: README.md
long_description_content_type = text/markdown long_description_content_type = text/markdown

View file

@ -38,10 +38,6 @@ skipif_cant_run_swift = pytest.mark.skipif(
parse_shebang.find_executable('swift') is None, parse_shebang.find_executable('swift') is None,
reason="swift isn't installed or can't be found", reason="swift isn't installed or can't be found",
) )
xfailif_windows_no_ruby = pytest.mark.xfail(
os.name == 'nt',
reason='Ruby support not yet implemented on windows.',
)
xfailif_windows = pytest.mark.xfail(os.name == 'nt', reason='windows') xfailif_windows = pytest.mark.xfail(os.name == 'nt', reason='windows')

View file

@ -1,15 +1,39 @@
import os.path import os.path
from unittest import mock
import pytest
import pre_commit.constants as C
from pre_commit import parse_shebang
from pre_commit.languages import ruby from pre_commit.languages import ruby
from pre_commit.prefix import Prefix from pre_commit.prefix import Prefix
from pre_commit.util import cmd_output from pre_commit.util import cmd_output
from testing.util import xfailif_windows_no_ruby from testing.util import xfailif_windows
@xfailif_windows_no_ruby ACTUAL_GET_DEFAULT_VERSION = ruby.get_default_version.__wrapped__
@pytest.fixture
def find_exe_mck():
with mock.patch.object(parse_shebang, 'find_executable') as mck:
yield mck
def test_uses_default_version_when_not_available(find_exe_mck):
find_exe_mck.return_value = None
assert ACTUAL_GET_DEFAULT_VERSION() == C.DEFAULT
def test_uses_system_if_both_gem_and_ruby_are_available(find_exe_mck):
find_exe_mck.return_value = '/path/to/exe'
assert ACTUAL_GET_DEFAULT_VERSION() == 'system'
@xfailif_windows # pragma: win32 no cover
def test_install_rbenv(tempdir_factory): def test_install_rbenv(tempdir_factory):
prefix = Prefix(tempdir_factory.get()) prefix = Prefix(tempdir_factory.get())
ruby._install_rbenv(prefix) ruby._install_rbenv(prefix, C.DEFAULT)
# Should have created rbenv directory # Should have created rbenv directory
assert os.path.exists(prefix.path('rbenv-default')) assert os.path.exists(prefix.path('rbenv-default'))
@ -18,7 +42,7 @@ def test_install_rbenv(tempdir_factory):
cmd_output('rbenv', '--help') cmd_output('rbenv', '--help')
@xfailif_windows_no_ruby @xfailif_windows # pragma: win32 no cover
def test_install_rbenv_with_version(tempdir_factory): def test_install_rbenv_with_version(tempdir_factory):
prefix = Prefix(tempdir_factory.get()) prefix = Prefix(tempdir_factory.get())
ruby._install_rbenv(prefix, version='1.9.3p547') ruby._install_rbenv(prefix, version='1.9.3p547')

View file

@ -34,7 +34,6 @@ from testing.util import get_resource_path
from testing.util import skipif_cant_run_docker from testing.util import skipif_cant_run_docker
from testing.util import skipif_cant_run_swift from testing.util import skipif_cant_run_swift
from testing.util import xfailif_windows from testing.util import xfailif_windows
from testing.util import xfailif_windows_no_ruby
def _norm_out(b): def _norm_out(b):
@ -235,6 +234,7 @@ def test_run_a_docker_image_hook(tempdir_factory, store, hook_id):
) )
@xfailif_windows # pragma: win32 no cover
def test_run_a_node_hook(tempdir_factory, store): def test_run_a_node_hook(tempdir_factory, store):
_test_hook_repo( _test_hook_repo(
tempdir_factory, store, 'node_hooks_repo', tempdir_factory, store, 'node_hooks_repo',
@ -260,7 +260,14 @@ def test_run_versioned_node_hook(tempdir_factory, store):
) )
@xfailif_windows_no_ruby @xfailif_windows # pragma: win32 no cover
def test_node_hook_with_npm_userconfig_set(tempdir_factory, store, tmpdir):
cfg = tmpdir.join('cfg')
cfg.write('cache=/dne\n')
with mock.patch.dict(os.environ, NPM_CONFIG_USERCONFIG=str(cfg)):
test_run_a_node_hook(tempdir_factory, store)
def test_run_a_ruby_hook(tempdir_factory, store): def test_run_a_ruby_hook(tempdir_factory, store):
_test_hook_repo( _test_hook_repo(
tempdir_factory, store, 'ruby_hooks_repo', tempdir_factory, store, 'ruby_hooks_repo',
@ -268,7 +275,7 @@ def test_run_a_ruby_hook(tempdir_factory, store):
) )
@xfailif_windows_no_ruby @xfailif_windows # pragma: win32 no cover
def test_run_versioned_ruby_hook(tempdir_factory, store): def test_run_versioned_ruby_hook(tempdir_factory, store):
_test_hook_repo( _test_hook_repo(
tempdir_factory, store, 'ruby_versioned_hooks_repo', tempdir_factory, store, 'ruby_versioned_hooks_repo',
@ -278,7 +285,7 @@ def test_run_versioned_ruby_hook(tempdir_factory, store):
) )
@xfailif_windows_no_ruby @xfailif_windows # pragma: win32 no cover
def test_run_ruby_hook_with_disable_shared_gems( def test_run_ruby_hook_with_disable_shared_gems(
tempdir_factory, tempdir_factory,
store, store,
@ -524,7 +531,6 @@ def test_additional_dependencies_roll_forward(tempdir_factory, store):
assert 'mccabe' not in cmd_output('pip', 'freeze', '-l')[1] assert 'mccabe' not in cmd_output('pip', 'freeze', '-l')[1]
@xfailif_windows_no_ruby # pragma: win32 no cover
def test_additional_ruby_dependencies_installed(tempdir_factory, store): def test_additional_ruby_dependencies_installed(tempdir_factory, store):
path = make_repo(tempdir_factory, 'ruby_hooks_repo') path = make_repo(tempdir_factory, 'ruby_hooks_repo')
config = make_config_from_repo(path) config = make_config_from_repo(path)