57 lines
1.8 KiB
Bash
Executable File
57 lines
1.8 KiB
Bash
Executable File
#!/bin/sh
|
||
|
||
# This script sets up a Git pre-commit hook to automatically format C/C++ files
|
||
# in the 'software/' subdirectory using clang-format.
|
||
|
||
# Define the path for the pre-commit hook
|
||
HOOK_DIR=".git/hooks"
|
||
HOOK_FILE="$HOOK_DIR/pre-commit"
|
||
|
||
# Create the hooks directory if it doesn't exist
|
||
mkdir -p "$HOOK_DIR"
|
||
|
||
# Create the pre-commit hook script using a 'here document'
|
||
cat > "$HOOK_FILE" << 'EOF'
|
||
#!/bin/sh
|
||
|
||
# --- Pre-commit hook for clang-format ---
|
||
#
|
||
# This hook formats staged C, C++, and Objective-C files in the 'software/'
|
||
# subdirectory before a commit is made.
|
||
# It automatically finds the .clang-format file in the software/ directory.
|
||
#
|
||
|
||
# Directory to be formatted
|
||
TARGET_DIR="software/"
|
||
|
||
# Use git diff to find staged files that are Added (A), Copied (C), or Modified (M).
|
||
# We filter for files only within the TARGET_DIR.
|
||
# The grep regex matches common C/C++ and Objective-C file extensions.
|
||
FILES_TO_FORMAT=$(git diff --cached --name-only --diff-filter=ACM "$TARGET_DIR" | grep -E '\.(c|h|cpp|hpp|cxx|hxx|cc|hh|m|mm)$')
|
||
|
||
if [ -z "$FILES_TO_FORMAT" ]; then
|
||
# No relevant files to format, exit successfully.
|
||
exit 0
|
||
fi
|
||
|
||
echo "› Running clang-format on staged files in '$TARGET_DIR'..."
|
||
|
||
# Run clang-format in-place on the identified files.
|
||
# clang-format will automatically find the .clang-format file in the software/ directory
|
||
# or any of its parent directories.
|
||
echo "$FILES_TO_FORMAT" | xargs clang-format -i
|
||
|
||
# Since clang-format may have changed the files, we need to re-stage them.
|
||
echo "$FILES_TO_FORMAT" | xargs git add
|
||
|
||
echo "› Formatting complete."
|
||
|
||
exit 0
|
||
EOF
|
||
|
||
# Make the hook executable
|
||
chmod +x "$HOOK_FILE"
|
||
|
||
echo "✅ Git pre-commit hook has been set up successfully."
|
||
echo " It will now automatically format files in the '$PWD/software' directory before each commit."
|