diff --git a/justfile b/justfile index e92b5fb5f..ca02c4db3 100644 --- a/justfile +++ b/justfile @@ -74,13 +74,28 @@ prek-install-git-pre-commit-hook: _ensure_mise_tools_installed #!/usr/bin/env sh set -eu {{ just_executable() }} --justfile "{{ justfile() }}" mise exec -- prek install - hook="{{ justfile_directory() }}/.git/hooks/pre-commit" - # The installed git hook runs later under Git, outside this just/mise environment. - # Injecting PREK_HOME keeps prek's cache under var/prek instead of a global home dir, - # which is more predictable and works better in sandboxed tools like Codex/OpenCode. - if [ -f "$hook" ] && ! grep -q '^export PREK_HOME=' "$hook"; then - sed -i '2iexport PREK_HOME="{{ prek_home }}"' "$hook" - fi + # The installed git hooks run later under Git, outside this just/mise environment, + # so they need to be told how to find their tooling: + # + # - PREK_HOME keeps prek's cache under var/prek instead of a global home dir. + # - MISE_DATA_DIR / MISE_TRUSTED_CONFIG_PATHS make mise resolve against this project's + # own data directory. Without them mise falls back to the global one and silently + # installs a second copy of the tool there. + # - prek bakes the full path of the currently installed version into the hook + # (var/mise/installs/prek//...), which stops working as soon as the pinned + # version changes or old versions are pruned. Pointing at mise's shim instead makes + # the hook resolve whatever mise.toml pins, at the time it runs. + # + # Which hook files prek installs depends on `default_install_hook_types` in + # .pre-commit-config.yaml, so patch every hook file that prek generated. + for hook in "{{ justfile_directory() }}"/.git/hooks/*; do + [ -f "$hook" ] || continue + grep -q 'generated by prek' "$hook" || continue + grep -q '^export PREK_HOME=' "$hook" || sed -i '2iexport PREK_HOME="{{ prek_home }}"' "$hook" + grep -q '^export MISE_DATA_DIR=' "$hook" || sed -i '3iexport MISE_DATA_DIR="{{ mise_data_dir }}"' "$hook" + grep -q '^export MISE_TRUSTED_CONFIG_PATHS=' "$hook" || sed -i '4iexport MISE_TRUSTED_CONFIG_PATHS="{{ mise_trusted_config_paths }}"' "$hook" + sed -i 's#^PREK=".*"$#PREK="{{ mise_data_dir }}/shims/prek"#' "$hook" + done # Runs the playbook with --tags=install-all,ensure-matrix-users-created,start and optional arguments install-all *extra_args: (run-tags "install-all,ensure-matrix-users-created,start" extra_args)