From d5f39a56a44fe061018c6acc15e1c3aa7337ff54 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Wed, 22 Feb 2017 15:01:23 -0500
Subject: [PATCH] clang-format.bash: Use Git attributes to mark files for
 formatting

---
 .gitattributes                                |  6 ++--
 Source/.gitattributes                         |  4 +++
 Source/CursesDialog/form/.gitattributes       |  1 +
 Tests/CompileFeatures/.gitattributes          |  2 ++
 .../PositionIndependentTargets/.gitattributes |  2 ++
 .../CommandLine/cmake_depends/.gitattributes  |  2 ++
 .../reference/.gitattributes                  |  2 ++
 Utilities/.gitattributes                      |  4 +++
 Utilities/Scripts/clang-format.bash           | 36 ++++---------------
 9 files changed, 27 insertions(+), 32 deletions(-)
 create mode 100644 Source/CursesDialog/form/.gitattributes
 create mode 100644 Tests/CompileFeatures/.gitattributes
 create mode 100644 Tests/PositionIndependentTargets/.gitattributes
 create mode 100644 Tests/RunCMake/CommandLine/cmake_depends/.gitattributes
 create mode 100644 Tests/RunCMake/GenerateExportHeader/reference/.gitattributes

diff --git a/.gitattributes b/.gitattributes
index abb698ad09..38291609ee 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,11 +2,11 @@
 .hooks*          export-ignore
 
 # Custom attribute to mark sources as using our C code style.
-[attr]our-c-style  whitespace=tab-in-indent
+[attr]our-c-style  whitespace=tab-in-indent  format.clang-format
 
 # Custom attribute to mark sources as generated.
-# Do not perform whitespace checks.
-[attr]generated  whitespace=-tab-in-indent,-indent-with-non-tab
+# Do not perform whitespace checks.  Do not format.
+[attr]generated  whitespace=-tab-in-indent,-indent-with-non-tab -format.clang-format
 
 bootstrap        crlf=input
 configure        crlf=input
diff --git a/Source/.gitattributes b/Source/.gitattributes
index 47eedfb4bd..1cec8a338e 100644
--- a/Source/.gitattributes
+++ b/Source/.gitattributes
@@ -15,3 +15,7 @@
 /cmFortranParser.cxx               generated
 /cmFortranParserTokens.h           generated
 /cmListFileLexer.c                 generated
+
+# Do not format third-party sources.
+/bindexplib.*                              -format.clang-format
+/kwsys/**                                  -format.clang-format
diff --git a/Source/CursesDialog/form/.gitattributes b/Source/CursesDialog/form/.gitattributes
new file mode 100644
index 0000000000..62d728cf66
--- /dev/null
+++ b/Source/CursesDialog/form/.gitattributes
@@ -0,0 +1 @@
+* -format.clang-format
diff --git a/Tests/CompileFeatures/.gitattributes b/Tests/CompileFeatures/.gitattributes
new file mode 100644
index 0000000000..83da28dac3
--- /dev/null
+++ b/Tests/CompileFeatures/.gitattributes
@@ -0,0 +1,2 @@
+# Do not format a source containing C++11 '>>' syntax as C++98.
+cxx_right_angle_brackets.cpp -format.clang-format
diff --git a/Tests/PositionIndependentTargets/.gitattributes b/Tests/PositionIndependentTargets/.gitattributes
new file mode 100644
index 0000000000..ed36631f45
--- /dev/null
+++ b/Tests/PositionIndependentTargets/.gitattributes
@@ -0,0 +1,2 @@
+# Do not format a source where we want a long line preserved.
+pic_test.h -format.clang-format
diff --git a/Tests/RunCMake/CommandLine/cmake_depends/.gitattributes b/Tests/RunCMake/CommandLine/cmake_depends/.gitattributes
new file mode 100644
index 0000000000..9c22288cd8
--- /dev/null
+++ b/Tests/RunCMake/CommandLine/cmake_depends/.gitattributes
@@ -0,0 +1,2 @@
+# Do not format a source encoded in UTF-16.
+test_UTF-16LE.h -format.clang-format
diff --git a/Tests/RunCMake/GenerateExportHeader/reference/.gitattributes b/Tests/RunCMake/GenerateExportHeader/reference/.gitattributes
new file mode 100644
index 0000000000..883a7f16da
--- /dev/null
+++ b/Tests/RunCMake/GenerateExportHeader/reference/.gitattributes
@@ -0,0 +1,2 @@
+# Exclude reference content from formatting.
+* -format.clang-format
diff --git a/Utilities/.gitattributes b/Utilities/.gitattributes
index c6345eb29a..bd978021ba 100644
--- a/Utilities/.gitattributes
+++ b/Utilities/.gitattributes
@@ -1,3 +1,7 @@
 /Git                    export-ignore
 /GitSetup               export-ignore
 SetupForDevelopment.sh  export-ignore
+
+# Do not format third-party sources.
+/KWIML/**       -format.clang-format
+/cm*/**         -format.clang-format
diff --git a/Utilities/Scripts/clang-format.bash b/Utilities/Scripts/clang-format.bash
index 2b36ac5dd9..edcda77b93 100755
--- a/Utilities/Scripts/clang-format.bash
+++ b/Utilities/Scripts/clang-format.bash
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 #=============================================================================
-# Copyright 2015-2016 Kitware, Inc.
+# Copyright 2015-2017 Kitware, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -106,34 +106,12 @@ case "$mode" in
     *) die "invalid mode: $mode" ;;
 esac
 
-# Filter sources to which our style should apply.
-$git_ls -z -- '*.c' '*.cc' '*.cpp' '*.cxx' '*.h' '*.hh' '*.hpp' '*.hxx' '*.cu' '*.notcu' |
+# List files as selected above.
+$git_ls |
 
-  # Exclude lexer/parser generator input and output.
-  egrep -z -v '^Source/cmCommandArgumentLexer\.' |
-  egrep -z -v '^Source/cmCommandArgumentParser(\.y|\.cxx|Tokens\.h)' |
-  egrep -z -v '^Source/cmDependsJavaLexer\.' |
-  egrep -z -v '^Source/cmDependsJavaParser(\.y|\.cxx|Tokens\.h)' |
-  egrep -z -v '^Source/cmExprLexer\.' |
-  egrep -z -v '^Source/cmExprParser(\.y|\.cxx|Tokens\.h)' |
-  egrep -z -v '^Source/cmFortranLexer\.' |
-  egrep -z -v '^Source/cmFortranParser(\.y|\.cxx|Tokens\.h)' |
-  egrep -z -v '^Source/cmListFileLexer(\.in\.l|\.c)' |
-
-  # Exclude third-party sources.
-  egrep -z -v '^Source/bindexplib' |
-  egrep -z -v '^Source/(kwsys|CursesDialog/form)/' |
-  egrep -z -v '^Utilities/(KW|cm).*/' |
-
-  # Exclude reference content.
-  egrep -z -v '^Tests/RunCMake/GenerateExportHeader/reference/' |
-
-  # Exclude manually-formatted sources (e.g. with long lines).
-  egrep -z -v '^Tests/PositionIndependentTargets/pic_test.h' |
-  egrep -z -v '^Tests/CompileFeatures/cxx_right_angle_brackets.cpp' |
-
-  # Exclude sources with encoding not suported by clang-format.
-  egrep -z -v '^Tests/RunCMake/CommandLine/cmake_depends/test_UTF-16LE.h' |
+  # Select sources with our attribute.
+  git check-attr --stdin format.clang-format |
+  sed -n '/: format\.clang-format: set$/ {s/:[^:]*:[^:]*$//p}'  |
 
   # Update sources in-place.
-  xargs -0 "$clang_format" -i
+  xargs -d '\n' "$clang_format" -i
-- 
GitLab