mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 08:14:42 +04:00
fix: ensure env patch is applied for vanilla emulation
otherwise, installing the hooks when RENV_USER env variable is set (e.g. in RStudio with renv project) will result in executing the installation script in the wrong renv
This commit is contained in:
parent
cd429db5e2
commit
c2c061cf63
2 changed files with 37 additions and 13 deletions
|
|
@ -15,27 +15,50 @@ from pre_commit.envcontext import PatchesT
|
||||||
from pre_commit.envcontext import UNSET
|
from pre_commit.envcontext import UNSET
|
||||||
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 pre_commit.util import cmd_output_b
|
|
||||||
from pre_commit.util import win_exe
|
from pre_commit.util import win_exe
|
||||||
|
|
||||||
ENVIRONMENT_DIR = 'renv'
|
ENVIRONMENT_DIR = 'renv'
|
||||||
RSCRIPT_OPTS = ('--no-save', '--no-restore', '--no-site-file', '--no-environ')
|
|
||||||
get_default_version = lang_base.basic_get_default_version
|
get_default_version = lang_base.basic_get_default_version
|
||||||
|
|
||||||
|
_RENV_ACTIVATED_OPTS = (
|
||||||
|
'--no-save', '--no-restore', '--no-site-file', '--no-environ',
|
||||||
|
)
|
||||||
|
|
||||||
def _execute_vanilla_r_code_as_script(
|
|
||||||
|
def _execute_r(
|
||||||
code: str, *,
|
code: str, *,
|
||||||
prefix: Prefix, version: str, args: Sequence[str] = (), cwd: str,
|
prefix: Prefix, version: str, args: Sequence[str] = (), cwd: str,
|
||||||
|
cli_opts: Sequence[str],
|
||||||
) -> str:
|
) -> str:
|
||||||
with in_env(prefix, version), _r_code_in_tempfile(code) as f:
|
with in_env(prefix, version), _r_code_in_tempfile(code) as f:
|
||||||
_, out, _ = cmd_output(
|
_, out, _ = cmd_output(
|
||||||
_rscript_exec(), *RSCRIPT_OPTS, f, *args, cwd=cwd,
|
_rscript_exec(), *cli_opts, f, *args, cwd=cwd,
|
||||||
)
|
)
|
||||||
return out.rstrip('\n')
|
return out.rstrip('\n')
|
||||||
|
|
||||||
|
|
||||||
|
def _execute_r_in_renv(
|
||||||
|
code: str, *,
|
||||||
|
prefix: Prefix, version: str, args: Sequence[str] = (), cwd: str,
|
||||||
|
) -> str:
|
||||||
|
return _execute_r(
|
||||||
|
code=code, prefix=prefix, version=version, args=args, cwd=cwd,
|
||||||
|
cli_opts=_RENV_ACTIVATED_OPTS,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _execute_vanilla_r(
|
||||||
|
code: str, *,
|
||||||
|
prefix: Prefix, version: str, args: Sequence[str] = (), cwd: str,
|
||||||
|
) -> str:
|
||||||
|
return _execute_r(
|
||||||
|
code=code, prefix=prefix, version=version, args=args, cwd=cwd,
|
||||||
|
cli_opts=('--vanilla',),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _read_installed_version(envdir: str, prefix: Prefix, version: str) -> str:
|
def _read_installed_version(envdir: str, prefix: Prefix, version: str) -> str:
|
||||||
return _execute_vanilla_r_code_as_script(
|
return _execute_r_in_renv(
|
||||||
'cat(renv::settings$r.version())',
|
'cat(renv::settings$r.version())',
|
||||||
prefix=prefix, version=version,
|
prefix=prefix, version=version,
|
||||||
cwd=envdir,
|
cwd=envdir,
|
||||||
|
|
@ -43,7 +66,7 @@ def _read_installed_version(envdir: str, prefix: Prefix, version: str) -> str:
|
||||||
|
|
||||||
|
|
||||||
def _read_executable_version(envdir: str, prefix: Prefix, version: str) -> str:
|
def _read_executable_version(envdir: str, prefix: Prefix, version: str) -> str:
|
||||||
return _execute_vanilla_r_code_as_script(
|
return _execute_r_in_renv(
|
||||||
'cat(as.character(getRversion()))',
|
'cat(as.character(getRversion()))',
|
||||||
prefix=prefix, version=version,
|
prefix=prefix, version=version,
|
||||||
cwd=envdir,
|
cwd=envdir,
|
||||||
|
|
@ -53,7 +76,7 @@ def _read_executable_version(envdir: str, prefix: Prefix, version: str) -> str:
|
||||||
def _write_current_r_version(
|
def _write_current_r_version(
|
||||||
envdir: str, prefix: Prefix, version: str,
|
envdir: str, prefix: Prefix, version: str,
|
||||||
) -> None:
|
) -> None:
|
||||||
_execute_vanilla_r_code_as_script(
|
_execute_r_in_renv(
|
||||||
'renv::settings$r.version(as.character(getRversion()))',
|
'renv::settings$r.version(as.character(getRversion()))',
|
||||||
prefix=prefix, version=version,
|
prefix=prefix, version=version,
|
||||||
cwd=envdir,
|
cwd=envdir,
|
||||||
|
|
@ -161,7 +184,7 @@ def _cmd_from_hook(
|
||||||
_entry_validate(cmd)
|
_entry_validate(cmd)
|
||||||
|
|
||||||
cmd_part = _prefix_if_file_entry(cmd, prefix, is_local=is_local)
|
cmd_part = _prefix_if_file_entry(cmd, prefix, is_local=is_local)
|
||||||
return (cmd[0], *RSCRIPT_OPTS, *cmd_part, *args)
|
return (cmd[0], *_RENV_ACTIVATED_OPTS, *cmd_part, *args)
|
||||||
|
|
||||||
|
|
||||||
def install_environment(
|
def install_environment(
|
||||||
|
|
@ -204,14 +227,15 @@ def install_environment(
|
||||||
renv::install(prefix_dir)
|
renv::install(prefix_dir)
|
||||||
}}
|
}}
|
||||||
"""
|
"""
|
||||||
|
_execute_vanilla_r(
|
||||||
with _r_code_in_tempfile(r_code_inst_environment) as f:
|
r_code_inst_environment,
|
||||||
cmd_output_b(_rscript_exec(), '--vanilla', f, cwd=env_dir)
|
prefix=prefix, version=version, cwd=env_dir,
|
||||||
|
)
|
||||||
|
|
||||||
_write_current_r_version(envdir=env_dir, prefix=prefix, version=version)
|
_write_current_r_version(envdir=env_dir, prefix=prefix, version=version)
|
||||||
if additional_dependencies:
|
if additional_dependencies:
|
||||||
r_code_inst_add = 'renv::install(commandArgs(trailingOnly = TRUE))'
|
r_code_inst_add = 'renv::install(commandArgs(trailingOnly = TRUE))'
|
||||||
_execute_vanilla_r_code_as_script(
|
_execute_r_in_renv(
|
||||||
code=r_code_inst_add, prefix=prefix, version=version,
|
code=r_code_inst_add, prefix=prefix, version=version,
|
||||||
args=additional_dependencies,
|
args=additional_dependencies,
|
||||||
cwd=env_dir,
|
cwd=env_dir,
|
||||||
|
|
|
||||||
|
|
@ -286,7 +286,7 @@ def test_health_check_without_version(prefix, installed_environment, version):
|
||||||
prefix, env_dir = installed_environment
|
prefix, env_dir = installed_environment
|
||||||
|
|
||||||
# simulate old pre-commit install by unsetting the installed version
|
# simulate old pre-commit install by unsetting the installed version
|
||||||
r._execute_vanilla_r_code_as_script(
|
r._execute_r_in_renv(
|
||||||
f'renv::settings$r.version({version})',
|
f'renv::settings$r.version({version})',
|
||||||
prefix=prefix, version=C.DEFAULT, cwd=env_dir,
|
prefix=prefix, version=C.DEFAULT, cwd=env_dir,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue