#!/bin/bash # # Pre-commit hook: warn when committing generated files without their sources. # This catches the common mistake of editing generated output instead of the # real source (e.g., editing art_scan.cpp instead of art_scan.rl). # # Uses parallel arrays (not associative arrays) for bash 3.2 compatibility, # since macOS still ships /bin/bash as 3.2. # Generated file (index N) maps to source file at GENERATED_SRCS[N]. # Use "NEVER_EDIT" for third-party vendored files that should not be edited. GENERATED_GENS=( # Ragel scanners "mux/modules/engine/art_scan.cpp" "mux/modules/engine/ast_scan.cpp" "mux/lib/color_ops.c" "mux/muxescape/muxescape.cpp" # Unicode tables (source is the utf/ pipeline, not a single file) "mux/include/utf8tables.h" "mux/lib/utf8tables.cpp" "mux/include/unicode_tables_c.h" "mux/lib/unicode_tables.c" "mux/include/ducet_cetable.h" "mux/rv64/src/unicode_tables.c" # Autoconf "mux/configure" "mux/aclocal.m4" # Protocol Buffers "client/console/src/hydra.pb.h" "client/console/src/hydra.pb.cc" "client/console/src/hydra.grpc.pb.h" "client/console/src/hydra.grpc.pb.cc" "client/win32gui/src/hydra.pb.h" "client/win32gui/src/hydra.pb.cc" "client/win32gui/src/hydra.grpc.pb.h" "client/win32gui/src/hydra.grpc.pb.cc" "client/tf/src/proto/hydra.pb.h" "client/tf/src/proto/hydra.pb.cc" "client/tf/src/proto/hydra.grpc.pb.h" "client/tf/src/proto/hydra.grpc.pb.cc" # SQLite amalgamation (third-party) "mux/sqlite/sqlite3.c" "mux/sqlite/sqlite3.h" ) GENERATED_SRCS=( "mux/modules/engine/art_scan.rl" "mux/modules/engine/ast_scan.rl" "mux/lib/color_ops.rl" "mux/muxescape/muxescape.rl" "utf/" "utf/" "utf/" "utf/" "utf/" "utf/" "mux/configure.ac" "mux/configure.ac" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "mux/proxy/hydra.proto" "NEVER_EDIT" "NEVER_EDIT" ) staged=$(git diff --cached --name-only) warnings="" for i in "${!GENERATED_GENS[@]}"; do gen="${GENERATED_GENS[$i]}" src="${GENERATED_SRCS[$i]}" if echo "$staged" | grep -qx "$gen"; then if [ "$src" = "NEVER_EDIT" ]; then # Third-party vendored file — should never be hand-edited warnings="${warnings} ${gen} (third-party vendored file — replace, don't edit)\n" elif ! echo "$staged" | grep -q "^${src}"; then # Check if the source is also staged warnings="${warnings} ${gen} (source: ${src})\n" fi fi done if [ -n "$warnings" ]; then echo "" echo "WARNING: Generated file(s) staged WITHOUT their source:" echo "" printf "$warnings" echo "" echo "Did you edit a generated file by mistake?" echo "Edit the source and regenerate instead." echo "" echo "To commit anyway: git commit --no-verify" exit 1 fi