96 lines
3.2 KiB
Bash
Executable File
96 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
GREEN='\033[0;32m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo "Running pre-commit checks..."
|
|
|
|
# Track overall success/failure
|
|
OVERALL_RESULT=0
|
|
|
|
# Get list of staged markdown files
|
|
STAGED_MD_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.md$' || true)
|
|
|
|
if [ -z "$STAGED_MD_FILES" ]; then
|
|
echo "No markdown files to check."
|
|
exit 0
|
|
fi
|
|
|
|
echo "Checking markdown files..."
|
|
|
|
# Check markdown formatting with markdownlint-cli
|
|
if command -v markdownlint &> /dev/null; then
|
|
if ! markdownlint $STAGED_MD_FILES; then
|
|
echo "❌ Markdown linting failed."
|
|
OVERALL_RESULT=1
|
|
else
|
|
echo -e "${GREEN}✅ Markdownlint passed!${NC}"
|
|
fi
|
|
else
|
|
echo "⚠️ markdownlint not found, skipping markdown linting"
|
|
fi
|
|
|
|
# Spell check
|
|
if command -v aspell &> /dev/null; then
|
|
# Check if aspell can find dictionaries
|
|
if ! aspell dump dicts 2>/dev/null | grep -q "en"; then
|
|
echo "⚠️ aspell found but no English dictionaries available"
|
|
echo " Make sure ASPELL_CONF is set correctly in your direnv"
|
|
echo " Skipping spell check"
|
|
else
|
|
echo "Running spell check..."
|
|
MISSPELLED=0
|
|
for file in $STAGED_MD_FILES; do
|
|
# Get list of misspelled words
|
|
ERRORS=$(cat "$file" | aspell list --mode=markdown --lang=en --personal=./.aspell.en.pws 2>/dev/null | sort -u)
|
|
if [ ! -z "$ERRORS" ]; then
|
|
echo "⚠️ Possible misspellings in $file:"
|
|
# For each misspelled word, show context
|
|
while IFS= read -r word; do
|
|
if [ ! -z "$word" ]; then
|
|
SUGGESTION=$(echo "$word" | aspell pipe --mode=markdown --lang=en --personal=./.aspell.en.pws 2>/dev/null | grep -E "^&" | cut -d: -f2 | cut -d, -f1 | sed 's/^ //')
|
|
echo " '$word' → suggestion: $SUGGESTION"
|
|
# Use grep to find lines containing the word (case-insensitive) with line numbers
|
|
grep -n -i -w --color=always "$word" "$file" | head -3 | while IFS= read -r line; do
|
|
echo " $line"
|
|
done
|
|
fi
|
|
done <<< "$ERRORS"
|
|
echo -e "\nMisspelled words:\n"
|
|
while IFS= read -r word; do
|
|
echo "$word"
|
|
done <<< "$ERRORS"
|
|
MISSPELLED=1
|
|
echo ""
|
|
fi
|
|
done
|
|
if [ $MISSPELLED -eq 1 ]; then
|
|
echo "❌ Spell check failed."
|
|
OVERALL_RESULT=1
|
|
fi
|
|
fi
|
|
else
|
|
echo "⚠️ aspell not found, skipping spell check"
|
|
fi
|
|
|
|
# Link validation
|
|
if [ -x "./scripts/check-links.sh" ]; then
|
|
echo "Running link validation..."
|
|
if ! ./scripts/check-links.sh $STAGED_MD_FILES; then
|
|
echo "❌ Link validation failed."
|
|
OVERALL_RESULT=1
|
|
fi
|
|
else
|
|
echo "⚠️ Link checker script not found or not executable, skipping link validation"
|
|
fi
|
|
|
|
# Final result
|
|
if [ $OVERALL_RESULT -eq 0 ]; then
|
|
echo "✅ Pre-commit checks passed!"
|
|
exit 0
|
|
else
|
|
echo ""
|
|
echo "❌ Some pre-commit checks failed. Fix issues or use 'git commit --no-verify' to skip."
|
|
exit 1
|
|
fi
|