]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
pre-commit: uncrustify based on staged changes
authorHeiko Hund <heiko@ist.eigentlich.net>
Tue, 17 May 2022 21:01:21 +0000 (23:01 +0200)
committerGert Doering <gert@greenie.muc.de>
Sun, 22 May 2022 15:18:20 +0000 (17:18 +0200)
Previously the generated patch was based on the file(s) in the working
directory. This is a problem if you have not to be commited changes
there and these changes fix formatting issues that exist in the staging
area. This effectively circumventes the script from rejecting the
commit.

An example:
   git add file.c
   git commit
   ... pre-commit hooks complains about formatting ...
   ... you fix the file manually, forget to git add ...
   git commit
   ... succeeds, even though the commit still has issues ...

Signed-off-by: Heiko Hund <heiko@ist.eigentlich.net>
Acked-by: Frank Lichtenheld <frank@lichtenheld.com>
Acked-by: Antonio Quartulli <a@unstable.cc>
Message-Id: <20220517210121.1312072-1-heiko@ist.eigentlich.net>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg24376.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
dev-tools/git-pre-commit-uncrustify.sh

index a5cf3d41bf99059023b9131c58d0172dd6c6ea23..9851c212f457ad8de1c71afbeabbbb0174a452b4 100755 (executable)
@@ -97,6 +97,7 @@ fi
 
 # create a filename to store our generated patch
 patch=$(mktemp /tmp/ovpn-fmt-XXXXXX)
+tmpout=$(mktemp /tmp/uncrustify-XXXXXX)
 
 # create one patch containing all changes to the files
 # sed to remove quotes around the filename, if inserted by the system
@@ -106,21 +107,11 @@ sed -e 's/^"\(.*\)"$/\1/' | \
 while read file
 do
     # ignore file if we do check for file extensions and the file
-    # does not match any of the extensions specified in $FILE_EXTS
+    # does not match the extensions .c or .h
     if ! matches_extension "$file"; then
         continue;
     fi
 
-    # escape special characters in the source filename:
-    # - '\': backslash needs to be escaped
-    # - '*': used as matching string => '*' would mean expansion
-    #        (curiously, '?' must not be escaped)
-    # - '[': used as matching string => '[' would mean start of set
-    # - '|': used as sed split char instead of '/', so it needs to be escaped
-    #        in the filename
-    # printf %s particularly important if the filename contains the % character
-    file_escaped_source=$(printf "%s" "$file" | sed -e 's/[\*[|]/\\&/g')
-
     # escape special characters in the target filename:
     # phase 1 (characters escaped in the output diff):
     #     - '\': backslash needs to be escaped in the output diff
@@ -136,15 +127,17 @@ do
 
     # uncrustify our sourcefile, create a patch with diff and append it to our $patch
     # The sed call is necessary to transform the patch from
-    #    --- $file timestamp
-    #    +++ - timestamp
+    #    --- - timestamp
+    #    +++ $tmpout timestamp
     # to both lines working on the same file and having a a/ and b/ prefix.
     # Else it can not be applied with 'git apply'.
-    "$UNCRUSTIFY" -q -c "$UNCRUST_CONFIG" -f "$file" | \
-        diff -u -- "$file" - | \
-        sed -e "1s|--- $file_escaped_source|--- \"a/$file_escaped_target\"|" -e "2s|+++ -|+++ \"b/$file_escaped_target\"|" >> "$patch"
+    git show ":$file" | "$UNCRUSTIFY" -q -l C -c "$UNCRUST_CONFIG" -o "$tmpout"
+    git show ":$file" | diff -u -- - "$tmpout" | \
+        sed -e "1s|--- -|--- \"b/$file_escaped_target\"|" -e "2s|+++ $tmpout|+++ \"a/$file_escaped_target\"|" >> "$patch"
 done
 
+rm -f "$tmpout"
+
 # if no patch has been generated all is ok, clean up the file stub and exit
 if [ ! -s "$patch" ] ; then
     rm -f "$patch"