@@ -6,6 +6,8 @@ set -euo pipefail
66REPO_ROOT=" $( git rev-parse --show-toplevel) "
77# kt-kernel project directory within the monorepo
88KERNEL_DIR=" $REPO_ROOT /kt-kernel"
9+ # Relative path for matching staged files under repo root
10+ REL_KERNEL_DIR=" kt-kernel"
911BUILD_DIR=" $KERNEL_DIR /build"
1012FORMAT_TARGET=" format"
1113CLANG_FORMAT_BIN=" ${CLANG_FORMAT_BIN:- clang-format} "
@@ -22,44 +24,48 @@ if ! command -v "$BLACK_BIN" >/dev/null 2>&1; then
2224 echo " [pre-commit] black not found (looked for $BLACK_BIN ). Skipping Python format." >&2
2325fi
2426
25- # Configure kt-kernel build directory if missing (quiet)
26- if [ ! -d " $BUILD_DIR " ] || { [ ! -f " $BUILD_DIR /Makefile" ] && [ ! -f " $BUILD_DIR /build.ninja" ]; }; then
27- echo " [pre-commit] configuring kt-kernel (cmake) ..." >&2
28- cmake -S " $KERNEL_DIR " -B " $BUILD_DIR " > /dev/null
29- fi
27+ # # Format only staged changes within kt-kernel
28+ # Collect staged files (Added/Modified/Copied/Renamed)
29+ mapfile -d ' ' STAGED < <( git diff --cached --name-only -z --diff-filter=AMCR)
30+
31+ PY_CHANGED=()
32+ CPP_CHANGED=()
33+
34+ for f in " ${STAGED[@]} " ; do
35+ case " $f " in
36+ " $REL_KERNEL_DIR " /* )
37+ ext=" ${f##* .} "
38+ case " $ext " in
39+ py)
40+ PY_CHANGED+=(" $f " )
41+ ;;
42+ c|cc|cpp|cxx|h|hh|hpp|hxx|cu|cuh)
43+ CPP_CHANGED+=(" $f " )
44+ ;;
45+ esac
46+ ;;
47+ esac
48+ done
3049
31- # Run format target (prefer ninja if present)
32- # Run clang-format target when available and tool present
33- if command -v " $CLANG_FORMAT_BIN " > /dev/null 2>&1 ; then
34- if [ -f " $BUILD_DIR /build.ninja" ]; then
35- (cd " $BUILD_DIR " && ninja -k0 " $FORMAT_TARGET " > /dev/null)
36- else
37- (cd " $BUILD_DIR " && make " $FORMAT_TARGET " )
38- fi
50+ # Run clang-format only on staged C/C++ files
51+ if command -v " $CLANG_FORMAT_BIN " > /dev/null 2>&1 && [ ${# CPP_CHANGED[@]} -gt 0 ]; then
52+ echo " [pre-commit] clang-format on ${# CPP_CHANGED[@]} files" >&2
53+ for f in " ${CPP_CHANGED[@]} " ; do
54+ " $CLANG_FORMAT_BIN " -i " $f "
55+ done
3956fi
4057
41- # Run black on staged python files (or entire repo if you prefer)
42- if command -v " $BLACK_BIN " > /dev/null 2>&1 ; then
43- # Run black only on kt-kernel's python and scripts directories
44- BLACK_PATHS=" "
45- if [ -d " $KERNEL_DIR /python" ]; then
46- BLACK_PATHS=" $BLACK_PATHS $KERNEL_DIR /python"
47- fi
48- if [ -d " $KERNEL_DIR /scripts" ]; then
49- BLACK_PATHS=" $BLACK_PATHS $KERNEL_DIR /scripts"
50- fi
51- if [ -n " $BLACK_PATHS " ]; then
52- echo " [pre-commit] running black on:$BLACK_PATHS " >&2
53- # shellcheck disable=SC2086
54- $BLACK_BIN $BLACK_PATHS
55- fi
58+ # # Run black only on staged Python files
59+ if command -v " $BLACK_BIN " > /dev/null 2>&1 && [ ${# PY_CHANGED[@]} -gt 0 ]; then
60+ echo " [pre-commit] black on ${# PY_CHANGED[@]} files" >&2
61+ " $BLACK_BIN " " ${PY_CHANGED[@]} "
5662fi
5763
58- # Stage any formatting changes for tracked files
59- if ! git diff --quiet --exit-code; then
64+ # Stage any formatting changes for tracked, formatted files only
65+ FMT_FILES=(" ${PY_CHANGED[@]} " " ${CPP_CHANGED[@]} " )
66+ if [ ${# FMT_FILES[@]} -gt 0 ] && ! git diff --quiet --exit-code -- " ${FMT_FILES[@]} " ; then
6067 echo " [pre-commit] Formatting applied; updating index." >&2
61- # Add only modified tracked files (exclude untracked new files not staged yet unless user staged them)
62- git add -u
68+ git add " ${FMT_FILES[@]} "
6369 echo " [pre-commit] Re-run git commit to proceed after reviewing changes." >&2
6470 exit 1
6571fi
0 commit comments