#!/usr/bin/env bash set -euo pipefail repo_root="$(git rev-parse --show-toplevel)" real_git="$(command -v git)" tmp="$(mktemp -d /tmp/dotfiles-git-coverage-XXXXXX)" trap 'rm -rf "$tmp"' EXIT log="$tmp/git.log" wrapper_dir="$tmp/bin" mkdir -p "$wrapper_dir" cat >"$wrapper_dir/git" <<'WRAP' #!/usr/bin/env bash set -euo pipefail if [ "${DOTFILES_GIT_TEST_PHASE:-}" = nu ]; then for arg in "$@"; do printf '%q ' "$arg" >>"$DOTFILES_GIT_LOG"; done printf '\n' >>"$DOTFILES_GIT_LOG" fi exec "$DOTFILES_REAL_GIT" "$@" WRAP chmod +x "$wrapper_dir/git" PATH="$wrapper_dir:$PATH" \ DOTFILES_REAL_GIT="$real_git" \ DOTFILES_GIT_LOG="$log" \ bash "$repo_root/nushell/tests/git-worktree-layout.sh" >/tmp/dotfiles-git-coverage-smoke.log [ -s "$log" ] || { cat /tmp/dotfiles-git-coverage-smoke.log >&2; echo "FAIL: no git invocations logged" >&2; exit 1; } require() { local label="$1" local pattern="$2" if ! grep -Eq -- "$pattern" "$log"; then echo "FAIL: missing git invocation: $label" >&2 echo "pattern: $pattern" >&2 echo "--- smoke output ---" >&2 cat /tmp/dotfiles-git-coverage-smoke.log >&2 echo "--- git log ---" >&2 cat "$log" >&2 exit 1 fi } require 'rev-parse common dir' '^rev-parse --path-format=absolute --git-common-dir $' require 'rev-parse branch' '^rev-parse --abbrev-ref HEAD $' require 'rev-parse top-level' '^rev-parse --show-toplevel $' require 'clone bare' '^clone --bare .+ .+/\.bare $' require 'config get' '^--git-dir .+ config --get wt\.repo-name $' require 'config bool get' '^--git-dir .+ config --bool --get core\.bare $' require 'config set core.bare' '^--git-dir .+ config core\.bare true $' require 'config unset core.worktree' '^--git-dir .+ config --unset core\.worktree $' require 'config set relative false' '^--git-dir .+ config worktree\.useRelativePaths false $' require 'config unset relative extension' '^--git-dir .+ config --unset extensions\.relativeWorktrees $' require 'symbolic-ref default branch' '^--git-dir .+ symbolic-ref --short HEAD $' require 'worktree list' '^--git-dir .+ worktree list --porcelain $' require 'show-ref branch exists' '^--git-dir .+ show-ref --verify --quiet refs/heads/.+ $' require 'worktree add existing branch' '^--git-dir .+ -c worktree\.useRelativePaths=false worktree add [^-].+ .+ $' require 'worktree add new branch' '^--git-dir .+ -c worktree\.useRelativePaths=false worktree add -b .+ .+ .+ $' require 'worktree remove clean' '^--git-dir .+ worktree remove /.+ $' require 'worktree remove force' '^--git-dir .+ worktree remove --force /.+ $' require 'branch delete merged' '^--git-dir .+ branch -d .+ $' require 'branch delete force' '^--git-dir .+ branch -D .+ $' require 'worktree prune' '^--git-dir .+ worktree prune $' require 'worktree repair' '^--git-dir .+ -c worktree\.useRelativePaths=false worktree repair.*$' require 'worktree lock no reason' '^--git-dir .+ worktree lock /.+ $' require 'worktree lock reason' '^--git-dir .+ worktree lock --reason testing /.+ $' require 'worktree unlock' '^--git-dir .+ worktree unlock /.+ $' require 'worktree move' '^--git-dir .+ worktree move /.+ /.+ $' require 'worktree move absolute wrapper' '^--git-dir .+ -c worktree\.useRelativePaths=false worktree move /.+ /.+ $' require 'status porcelain' '^-C /.+ status --porcelain=v1 $' require 'status sanity' '^-C /.+ status $' require 'stash list' '^-C /.+ stash list $' require 'diff cached' '^-C /.+ diff --binary --cached $' require 'diff unstaged' '^-C /.+ diff --binary $' require 'apply index' '^-C /.+ apply --index /.+staged\.patch $' require 'apply unstaged' '^-C /.+ apply /.+unstaged\.patch $' printf 'ok git-command-coverage\n'