From f656f189e453c87370caa1cdffa6eed6e71b0f04 Mon Sep 17 00:00:00 2001
From: murgatroid99 <mlumish@google.com>
Date: Tue, 9 Feb 2016 10:56:25 -0800
Subject: [PATCH] Make sanitize script a suitable pre-commit hook

---
 tools/distrib/check_copyright.py              |  9 ++++++-
 tools/distrib/clang_format_code.sh            |  2 +-
 tools/distrib/sanitize.sh                     | 24 +++++++++++++++----
 .../clang_format_all_the_things.sh            |  6 +++++
 4 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/tools/distrib/check_copyright.py b/tools/distrib/check_copyright.py
index a7efdc85cc..ef836d6e2d 100755
--- a/tools/distrib/check_copyright.py
+++ b/tools/distrib/check_copyright.py
@@ -57,6 +57,9 @@ argp.add_argument('-a', '--ancient',
 argp.add_argument('-f', '--fix',
                   default=False,
                   action='store_true');
+argp.add_argument('--precommit',
+                  default=False,
+                  action='store_true')
 args = argp.parse_args()
 
 # open the license text
@@ -101,6 +104,10 @@ RE_LICENSE = dict(
         for line in LICENSE))
      for k, v in LICENSE_PREFIX.iteritems())
 
+if args.precommit:
+  FILE_LIST_COMMAND = 'git diff --name-only HEAD | grep -v ^third_party/'
+else:
+  FILE_LIST_COMMAND = 'git ls-tree -r --name-only -r HEAD | grep -v ^third_party/'
 
 def load(name):
   with open(name) as f:
@@ -124,7 +131,7 @@ def log(cond, why, filename):
 
 # scan files, validate the text
 ok = True
-for filename in subprocess.check_output('git ls-tree -r --name-only -r HEAD | grep -v ^third_party/',
+for filename in subprocess.check_output(FILE_LIST_COMMAND,
                                         shell=True).splitlines():
   if filename in KNOWN_BAD: continue
   ext = os.path.splitext(filename)[1]
diff --git a/tools/distrib/clang_format_code.sh b/tools/distrib/clang_format_code.sh
index 6bfa278cae..d904a841d4 100755
--- a/tools/distrib/clang_format_code.sh
+++ b/tools/distrib/clang_format_code.sh
@@ -37,4 +37,4 @@ cd $(dirname $0)/../..
 docker build -t grpc_clang_format tools/dockerfile/grpc_clang_format
 
 # run clang-format against the checked out codebase
-docker run -e TEST=$TEST --rm=true -v ${HOST_GIT_ROOT:-`pwd`}:/local-code -t grpc_clang_format /clang_format_all_the_things.sh
+docker run -e TEST=$TEST -e CHANGED_FILES="$CHANGED_FILES" --rm=true -v ${HOST_GIT_ROOT:-`pwd`}:/local-code -t grpc_clang_format /clang_format_all_the_things.sh
diff --git a/tools/distrib/sanitize.sh b/tools/distrib/sanitize.sh
index 56644b1d65..3b7ca6fd88 100755
--- a/tools/distrib/sanitize.sh
+++ b/tools/distrib/sanitize.sh
@@ -32,7 +32,23 @@ set -ex
 
 cd $(dirname $0)/../..
 
-./tools/buildgen/generate_projects.sh
-./tools/distrib/clang_format_code.sh
-./tools/distrib/check_copyright.py --fix
-./tools/distrib/check_trailing_newlines.sh
+DIFF_COMMAND="git diff --name-only HEAD | grep -v ^third_party/"
+
+if [ "x$1" == 'x--pre-commit' ]; then
+  if eval $DIFF_COMMAND | grep '^build.yaml$'; then
+    ./tools/buildgen/generate_projects.sh
+  else
+    templates=$(eval $DIFF_COMMAND | grep '\.template$' || true)
+    if [ -n "$templates" ]; then
+      ./tools/buildgen/generate_projects.sh --templates $templates
+    fi
+  fi
+  CHANGED_FILES=$(eval $DIFF_COMMAND) ./tools/distrib/clang_format_code.sh
+  ./tools/distrib/check_copyright.py --fix --precommit
+  ./tools/distrib/check_trailing_newlines.sh
+else
+  ./tools/buildgen/generate_projects.sh
+  ./tools/distrib/clang_format_code.sh
+  ./tools/distrib/check_copyright.py --fix
+  ./tools/distrib/check_trailing_newlines.sh
+fi
diff --git a/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh b/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh
index 86ba8b2e90..dd8ea1ac30 100755
--- a/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh
+++ b/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh
@@ -48,6 +48,12 @@ do
   done
 done
 
+# The CHANGED_FILES variable is used to restrict the set of files to check.
+# Here we set files to the intersection of files and CHANGED_FILES
+if [ -n "$CHANGED_FILES" ]; then
+  files=$(comm -12 <(echo $files | tr ' ' '\n' | sort -u) <(echo $CHANGED_FILES | tr ' ' '\n' | sort -u))
+fi
+
 if [ "x$TEST" = "x" ]
 then
   echo $files | xargs $CLANG_FORMAT -i
-- 
GitLab