#!/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."