2 Commits

Author SHA1 Message Date
ba53e6544b fix(tests): isolate test-git-hooks-install.sh from inherited GIT_* env vars
The test's own `git -C "$TEMP_REPO" init` silently re-targets an inherited
GIT_DIR instead of creating a repo in the temp dir when this test itself
runs inside a git hook (e.g. pre-push sets GIT_DIR to the invoking repo's
gitdir). Unset all GIT_* vars at the top of the script so the temp repo
fixture is actually isolated regardless of the calling context.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FNJWdVvdgvZCHi1hZGqgVQ
2026-07-05 12:52:52 +00:00
a43820725f fix(install): resolve git hooks dir via git plumbing, drop stale manifest fields
scripts/install.sh hardcoded $REPO_ROOT/.git/hooks, which breaks under any
git worktree checkout (.git is a file there, not a directory) — this is
what blocks every worktree-based agent from pushing cleanly. Resolve the
hooks directory via `git rev-parse --git-path hooks` instead, normalizing
to an absolute path since git returns it relative to the queried repo root
for plain checkouts but absolute for worktrees.

Also drops `agents`/`skills` fields from plugins/bin, plugins/core, and
plugins/gitea plugin.json where the referenced directories don't exist on
main yet (bin never had an agents/ dir; core and gitea's real skill/agent
content is still pending merge from an in-flight branch) — these were
failing scripts/check-manifests.sh and blocking pushes for unrelated work.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FNJWdVvdgvZCHi1hZGqgVQ
2026-07-05 12:44:26 +00:00
5 changed files with 36 additions and 11 deletions

View File

@@ -1,5 +1,4 @@
{
"agents": "agents/",
"author": {
"email": "defame1297@rkdr.net",
"name": "Defame1297"

View File

@@ -1,5 +1,4 @@
{
"agents": "agents/",
"author": {
"email": "defame1297@rkdr.net",
"name": "Defame1297"
@@ -16,8 +15,5 @@
"license": "MIT",
"mcpServers": ".mcp.json",
"name": "core",
"skills": [
"skills/"
],
"version": "1.0.0"
}

View File

@@ -1,5 +1,4 @@
{
"agents": "agents/",
"author": {
"email": "defame1297@rkdr.net",
"name": "Defame1297"
@@ -16,8 +15,5 @@
"license": "MIT",
"mcpServers": ".mcp.json",
"name": "gitea",
"skills": [
"skills/"
],
"version": "1.0.0"
}

View File

@@ -30,10 +30,16 @@ done
# Install git hooks into the current repo checkout
HOOKS_SRC="$REPO_ROOT/scripts/git-hooks"
if [[ -d "$HOOKS_SRC" ]]; then
# Unset inherited GIT_DIR/GIT_WORK_TREE — set by git when this script runs as
# a hook (e.g. pre-push), they override -C's directory-based discovery and
# would resolve against the invoking repo instead of $REPO_ROOT.
GIT_HOOKS_DIR="$(env -u GIT_DIR -u GIT_WORK_TREE git -C "$REPO_ROOT" rev-parse --git-path hooks)"
[[ "$GIT_HOOKS_DIR" = /* ]] || GIT_HOOKS_DIR="$REPO_ROOT/$GIT_HOOKS_DIR"
mkdir -p "$GIT_HOOKS_DIR"
for hook_file in "$HOOKS_SRC"/*; do
[[ -f "$hook_file" ]] || continue
hook_name="$(basename "$hook_file")"
dest_hook="$REPO_ROOT/.git/hooks/$hook_name"
dest_hook="$GIT_HOOKS_DIR/$hook_name"
cp "$hook_file" "$dest_hook"
chmod +x "$dest_hook"
done

View File

@@ -3,6 +3,12 @@
# Runs install.sh from a temp repo to avoid touching the real .git/hooks/.
set -euo pipefail
# This script may itself run inside a git hook (e.g. pre-push), which sets
# GIT_DIR/GIT_EXEC_PATH/etc. in the environment. `git init`/`git -C` below
# would silently re-target the inherited GIT_DIR instead of creating an
# isolated repo in $TEMP_REPO, so start from a clean slate.
for var in $(compgen -v | grep '^GIT_'); do unset "$var"; done
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PASS=0
FAIL=0
@@ -22,7 +28,7 @@ TEMP_HOME="$(mktemp -d)"
trap 'rm -rf "$TEMP_REPO" "$TEMP_HOME"' EXIT
mkdir -p "$TEMP_REPO/scripts"
mkdir -p "$TEMP_REPO/.git/hooks"
git -C "$TEMP_REPO" init -q
# Minimal deploy-manifest.sh — empty deploy lists so install.sh reaches the
# hook-copy block without attempting to copy files that don't exist in the
@@ -90,6 +96,28 @@ else
fi
rmdir "$HOOKS_SRC/not-a-hook"
# ---------------------------------------------------------------------------
echo ""
echo "--- hook install: resolves correctly when GIT_DIR is inherited (hook context) ---"
# ---------------------------------------------------------------------------
# Git sets GIT_DIR/GIT_WORK_TREE for child processes when this script itself
# runs as a hook (e.g. pre-push). Simulate that and confirm install.sh still
# resolves hooks against $TEMP_REPO, not the inherited GIT_DIR.
OTHER_REPO="$(mktemp -d)"
git -C "$OTHER_REPO" init -q
if HOME="$TEMP_HOME" GIT_DIR="$OTHER_REPO/.git" GIT_WORK_TREE="$OTHER_REPO" \
bash "$TEMP_REPO/scripts/install.sh" > /dev/null 2>&1; then
if [[ -f "$TEMP_REPO/.git/hooks/post-push" ]]; then
pass "resolves \$TEMP_REPO/.git/hooks/ even with inherited GIT_DIR"
else
fail "installed into inherited GIT_DIR instead of \$TEMP_REPO"
fi
else
fail "install.sh failed when GIT_DIR/GIT_WORK_TREE were inherited"
fi
rm -rf "$OTHER_REPO"
# ---------------------------------------------------------------------------
echo ""
echo "--- hook install: idempotent ---"