From b748138ed69a531c70a20107b85e812cbe95ab3e Mon Sep 17 00:00:00 2001 From: Hugo Osvaldo Barrera Date: Mon, 3 Mar 2025 10:33:59 +0100 Subject: [PATCH] Use plain sh for the pre-commit script Bash is currently a dependency of pre-commit. It is only used in the pre-commit script, and the only bash-specific feature that is used is a single array. Use the `args` array instead, which works on plain sh (e.g.: POSIX sh). This change drops bash as a runtime dependency. Tested with busybox sh(ash) and OpenBSD's sh(ksh). --- pre_commit/commands/install_uninstall.py | 9 +-------- pre_commit/resources/hook-tmpl | 11 ++++++----- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/pre_commit/commands/install_uninstall.py b/pre_commit/commands/install_uninstall.py index d19e0d47..be22b056 100644 --- a/pre_commit/commands/install_uninstall.py +++ b/pre_commit/commands/install_uninstall.py @@ -94,17 +94,10 @@ def _install_hook_script( before, rest = contents.split(TEMPLATE_START) _, after = rest.split(TEMPLATE_END) - # on windows always use `/bin/sh` since `bash` might not be on PATH - # though we use bash-specific features `sh` on windows is actually - # bash in "POSIXLY_CORRECT" mode which still supports the features we - # use: subshells / arrays - if sys.platform == 'win32': # pragma: win32 cover - hook_file.write('#!/bin/sh\n') - hook_file.write(before + TEMPLATE_START) hook_file.write(f'INSTALL_PYTHON={shlex.quote(sys.executable)}\n') args_s = shlex.join(args) - hook_file.write(f'ARGS=({args_s})\n') + hook_file.write(f"ARGS='{args_s}'\n") hook_file.write(TEMPLATE_END + after) make_executable(hook_path) diff --git a/pre_commit/resources/hook-tmpl b/pre_commit/resources/hook-tmpl index 53d29f95..beb483cf 100755 --- a/pre_commit/resources/hook-tmpl +++ b/pre_commit/resources/hook-tmpl @@ -1,19 +1,20 @@ -#!/usr/bin/env bash +#!/bin/sh # File generated by pre-commit: https://pre-commit.com # ID: 138fd403232d2ddd5efb44317e38bf03 # start templated INSTALL_PYTHON='' -ARGS=(hook-impl) +ARGS="hook-impl" # end templated HERE="$(cd "$(dirname "$0")" && pwd)" -ARGS+=(--hook-dir "$HERE" -- "$@") +set -- $ARGS --hook-dir "$HERE" -- "$@" if [ -x "$INSTALL_PYTHON" ]; then - exec "$INSTALL_PYTHON" -mpre_commit "${ARGS[@]}" + exec "$INSTALL_PYTHON" -mpre_commit "$@" + elif command -v pre-commit > /dev/null; then - exec pre-commit "${ARGS[@]}" + exec pre-commit "$@" else echo '`pre-commit` not found. Did you forget to activate your virtualenv?' 1>&2 exit 1