Compare commits
1 Commits
mimo/code/
...
fix/1430-s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
761ad313c7 |
@@ -1,7 +1,8 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Pre-commit hook: enforce 10-line net addition limit
|
# Pre-commit hook: enforce 10-line net addition limit + sanitize commit message
|
||||||
# Install: git config core.hooksPath .githooks
|
# Install: git config core.hooksPath .githooks
|
||||||
|
|
||||||
|
# ── Line limit enforcement ──────────────────────────────────────
|
||||||
ADDITIONS=$(git diff --cached --numstat | awk '{s+=$1} END {print s+0}')
|
ADDITIONS=$(git diff --cached --numstat | awk '{s+=$1} END {print s+0}')
|
||||||
DELETIONS=$(git diff --cached --numstat | awk '{s+=$2} END {print s+0}')
|
DELETIONS=$(git diff --cached --numstat | awk '{s+=$2} END {print s+0}')
|
||||||
NET=$((ADDITIONS - DELETIONS))
|
NET=$((ADDITIONS - DELETIONS))
|
||||||
@@ -12,4 +13,19 @@ if [ "$NET" -gt 10 ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# ── Commit message sanitization (#1430) ─────────────────────────
|
||||||
|
# Read the commit message from .git/COMMIT_EDITMSG
|
||||||
|
MSG_FILE="$(git rev-parse --git-dir)/COMMIT_EDITMSG"
|
||||||
|
if [ -f "$MSG_FILE" ]; then
|
||||||
|
MSG=$(cat "$MSG_FILE")
|
||||||
|
# Warn if message contains backticks (potential shell injection)
|
||||||
|
if echo "$MSG" | grep -q '`'; then
|
||||||
|
echo "⚠ WARNING: Commit message contains backticks."
|
||||||
|
echo " Backticks in 'git commit -m' can trigger shell expansion."
|
||||||
|
echo " Consider using: git commit -F <file> or ./scripts/safe-commit.sh"
|
||||||
|
echo " See: docs/SAFE_COMMIT_PATTERNS.md"
|
||||||
|
# Don't block — just warn. Blocking would be too aggressive.
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
echo "✓ Pre-commit: net $NET lines (limit: 10)"
|
echo "✓ Pre-commit: net $NET lines (limit: 10)"
|
||||||
|
|||||||
69
docs/SAFE_COMMIT_PATTERNS.md
Normal file
69
docs/SAFE_COMMIT_PATTERNS.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# Safe Commit Patterns
|
||||||
|
|
||||||
|
## Issue #1430
|
||||||
|
|
||||||
|
Backticks in `git commit -m` messages can trigger shell substitution
|
||||||
|
during hook processing. A commit message containing:
|
||||||
|
|
||||||
|
```
|
||||||
|
git commit -m "fix: update `connectMemPalace()` to use Fleet API"
|
||||||
|
```
|
||||||
|
|
||||||
|
may cause the shell to attempt executing `connectMemPalace()`.
|
||||||
|
|
||||||
|
## Safe Patterns
|
||||||
|
|
||||||
|
### 1. Use safe-commit.sh (recommended)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/safe-commit.sh "fix: update connectMemPalace() to use Fleet API"
|
||||||
|
```
|
||||||
|
|
||||||
|
This writes the message to a temp file and uses `git commit -F`,
|
||||||
|
which prevents shell expansion.
|
||||||
|
|
||||||
|
### 2. Use git commit -F directly
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo "fix: update \`connectMemPalace()\` to use Fleet API" > /tmp/msg.txt
|
||||||
|
git commit -F /tmp/msg.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Use single quotes (less reliable with hooks)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git commit -m 'fix: update `connectMemPalace()` to use Fleet API'
|
||||||
|
```
|
||||||
|
|
||||||
|
Single quotes prevent shell expansion in the commit command itself,
|
||||||
|
but hooks that read the message may still process backticks.
|
||||||
|
|
||||||
|
### 4. Use heredoc for multiline
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git commit -F - <<'EOF'
|
||||||
|
fix: update `connectMemPalace()` to use Fleet API
|
||||||
|
|
||||||
|
The mock MCP server was overwriting the real Fleet API version.
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
## What NOT to do
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# BAD — backticks trigger shell expansion
|
||||||
|
git commit -m "fix: update `connectMemPalace()` to use Fleet API"
|
||||||
|
|
||||||
|
# BAD — $(...) triggers command substitution
|
||||||
|
git commit -m "fix: update $(cat file.py) to use Fleet API"
|
||||||
|
|
||||||
|
# BAD — ! triggers history expansion
|
||||||
|
git commit -m "fix: this is not a joke! seriously"
|
||||||
|
```
|
||||||
|
|
||||||
|
## For agents
|
||||||
|
|
||||||
|
When committing code that contains backticks or special characters:
|
||||||
|
1. Always use `git commit -F <file>` or `safe-commit.sh`
|
||||||
|
2. Never interpolate user content into `-m` strings
|
||||||
|
3. Escape or remove backticks from commit messages when possible
|
||||||
41
scripts/safe-commit.sh
Executable file
41
scripts/safe-commit.sh
Executable file
@@ -0,0 +1,41 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ═══════════════════════════════════════════════════════════════
|
||||||
|
# safe-commit.sh — Commit with message from file (prevents shell injection)
|
||||||
|
#
|
||||||
|
# Issue #1430: Backticks in commit messages can trigger shell
|
||||||
|
# substitution during git hook processing. Using -F <file> instead
|
||||||
|
# of -m prevents this.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./scripts/safe-commit.sh "my commit message"
|
||||||
|
# ./scripts/safe-commit.sh -F message.txt
|
||||||
|
# echo "message" | ./scripts/safe-commit.sh --stdin
|
||||||
|
# ═══════════════════════════════════════════════════════════════
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
TMPFILE=$(mktemp /tmp/commit-msg-XXXXXX)
|
||||||
|
trap "rm -f $TMPFILE" EXIT
|
||||||
|
|
||||||
|
if [ "${1:-}" = "-F" ] && [ -n "${2:-}" ]; then
|
||||||
|
# Use provided file
|
||||||
|
cp "$2" "$TMPFILE"
|
||||||
|
elif [ "${1:-}" = "--stdin" ]; then
|
||||||
|
# Read from stdin
|
||||||
|
cat > "$TMPFILE"
|
||||||
|
elif [ -n "${1:-}" ]; then
|
||||||
|
# Write argument to temp file (no shell expansion)
|
||||||
|
printf '%s' "$1" > "$TMPFILE"
|
||||||
|
else
|
||||||
|
echo "Usage: $0 <message> | $0 -F <file> | $0 --stdin"
|
||||||
|
echo ""
|
||||||
|
echo "Always uses git commit -F to prevent shell injection."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stage all changes
|
||||||
|
git add -A
|
||||||
|
|
||||||
|
# Commit using file (no shell expansion of message content)
|
||||||
|
git commit -F "$TMPFILE"
|
||||||
|
|
||||||
|
echo "✓ Committed safely (no shell expansion)"
|
||||||
Reference in New Issue
Block a user