From fc82bf3f95c25f53f19b5a6680149885f54217e0 Mon Sep 17 00:00:00 2001 From: carlos-alm Date: Sun, 17 May 2026 21:35:10 -0600 Subject: [PATCH] fix(hooks): guard-git.sh uses [[:space:]] in sed for BSD compatibility BSD sed (default on macOS) does not interpret \s as whitespace, so the cd-prefix and git -C normalization regexes silently produced no output. detect_work_dir then fell back to the shell cwd's branch, blocking valid pushes from worktrees with non-conformant cwd names. Closes #1132 --- .claude/hooks/guard-git.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.claude/hooks/guard-git.sh b/.claude/hooks/guard-git.sh index 46f96759..2e1238bc 100644 --- a/.claude/hooks/guard-git.sh +++ b/.claude/hooks/guard-git.sh @@ -33,8 +33,8 @@ fi # the opening `"` of a quoted path (which would leave a trailing `path"` in # NCOMMAND). The pattern re-anchors on `git`, so multi-`-C` chains (e.g. # `git -C /a -C /b push`) need a second pass to collapse the residual `-C`. -NCOMMAND=$(echo "$COMMAND" | sed -E 's/(^|\s|&&\s*)git[[:space:]]+-C[[:space:]]+"[^"]+"/\1git/g; s/(^|\s|&&\s*)git[[:space:]]+-C[[:space:]]+[^"[:space:]][^[:space:]]*/\1git/g') -NCOMMAND=$(echo "$NCOMMAND" | sed -E 's/(^|\s|&&\s*)git[[:space:]]+-C[[:space:]]+"[^"]+"/\1git/g; s/(^|\s|&&\s*)git[[:space:]]+-C[[:space:]]+[^"[:space:]][^[:space:]]*/\1git/g') +NCOMMAND=$(echo "$COMMAND" | sed -E 's/(^|[[:space:]]|&&[[:space:]]*)git[[:space:]]+-C[[:space:]]+"[^"]+"/\1git/g; s/(^|[[:space:]]|&&[[:space:]]*)git[[:space:]]+-C[[:space:]]+[^"[:space:]][^[:space:]]*/\1git/g') +NCOMMAND=$(echo "$NCOMMAND" | sed -E 's/(^|[[:space:]]|&&[[:space:]]*)git[[:space:]]+-C[[:space:]]+"[^"]+"/\1git/g; s/(^|[[:space:]]|&&[[:space:]]*)git[[:space:]]+-C[[:space:]]+[^"[:space:]][^[:space:]]*/\1git/g') deny() { local reason="$1" @@ -121,7 +121,7 @@ detect_work_dir() { work_dir=$(echo "$search_str" | sed -nE 's/.*-C[[:space:]]+"([^"]+)".*/\1/p;t;s/.*-C[[:space:]]+([^[:space:]]+).*/\1/p') fi if [ -z "$work_dir" ] && echo "$COMMAND" | grep -qE '^\s*cd\s+'; then - work_dir=$(echo "$COMMAND" | sed -nE 's/^\s*cd\s+"?([^"&]+)"?\s*&&.*/\1/p') + work_dir=$(echo "$COMMAND" | sed -nE 's/^[[:space:]]*cd[[:space:]]+"?([^"&]+)"?[[:space:]]*&&.*/\1/p') fi # Trim trailing whitespace work_dir="${work_dir%"${work_dir##*[![:space:]]}"}"