Skip to contentSkip to conversation

hooks--pre-commit: detect non-ASCII when renaming

PATCH In review Julian Prein via GitGitGadget 2 participants 5 messages Jul 14, 2022 – Dec 3, 2023

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 hooks--pre-commit: detect non-ASCII when renaming

From: Julian Prein <[email protected]>

Currently the diff-filter that is used to check for non-ASCII characters in filenames only checks new additions.

Extend the diff-filter in the pre-commit sample to include CR as well. This way non-ASCII character in filenames are detected on a rename/copy as well.

---
hooks--pre-commit: detect non-ASCII when renaming

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1291%2Fdruckdev%2Fpre-commit-renames-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1291/druckdev/pre-commit-renames-v1
Pull-Request: https://github.com/git/git/pull/1291

 templates/hooks--pre-commit.sample | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
templates/hooks--pre-commit.sample +1 -1
index e144712c85c..95c327832da 100755
@@ -28,7 +28,7 @@ if [ "$allownonascii" != "true" ] &&
 	# Note that the use of brackets around a tr range is ok here, (it's
 	# even required, for portability to Solaris 10's /usr/bin/tr), since
 	# the square bracket bytes happen to fall in the designated range.
-	test $(git diff --cached --name-only --diff-filter=A -z $against |
+	test $(git diff --cached --name-only --diff-filter=ACR -z $against |
 	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
 then
 	cat <<\EOF

base-commit: bbea4dcf42b28eb7ce64a6306cdde875ae5d09ca

Signature · 1 line
gitgitgadget
#1 lore raw
Quoted 8 lines · Julian Prein via GitGitGadget

From: Julian Prein <[email protected]>

Currently the diff-filter that is used to check for non-ASCII characters in filenames only checks new additions.

Extend the diff-filter in the pre-commit sample to include CR as well. This way non-ASCII character in filenames are detected on a rename/copy as well.

It would probably be a better implementation to disable the rename detection, instead of adding Copies and Renames.

Quoted 26 lines

---
hooks--pre-commit: detect non-ASCII when renaming

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1291%2Fdruckdev%2Fpre-commit-renames-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1291/druckdev/pre-commit-renames-v1
Pull-Request: https://github.com/git/git/pull/1291

 templates/hooks--pre-commit.sample | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
templates/hooks--pre-commit.sample +1 -1
index e144712c85c..95c327832da 100755
@@ -28,7 +28,7 @@ if [ "$allownonascii" != "true" ] &&
 	# Note that the use of brackets around a tr range is ok here, (it's
 	# even required, for portability to Solaris 10's /usr/bin/tr), since
 	# the square bracket bytes happen to fall in the designated range.
-	test $(git diff --cached --name-only --diff-filter=A -z $against |
+	test $(git diff --cached --name-only --diff-filter=ACR -z $against |
 	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
 then
 	cat <<\EOF

base-commit: bbea4dcf42b28eb7ce64a6306cdde875ae5d09ca

#2 lore raw
Quoted 7 lines · Junio C Hamano
Quoted 5 lines · Julian Prein via GitGitGadget

From: Julian Prein <[email protected]>

Currently the diff-filter that is used to check for non-ASCII characters in filenames only checks new additions.

Quoted 6 lines
Quoted 3 lines

Extend the diff-filter in the pre-commit sample to include CR as well. This way non-ASCII character in filenames are detected on a rename/copy as well.

It would probably be a better implementation to disable the rename detection, instead of adding Copies and Renames.

That is ...

Quoted 1 line

templates/hooks--pre-commit.sample if [ "$allownonascii" != "true" ] && · line 31

Quoted 1 line
templates/hooks--pre-commit.sample +0 -1
-	test $(git diff --cached --name-only --diff-filter=A -z $against |

... instead of using the "git diff" Porcelain, we can probably use the "git diff-index" plumbing command here, which will not be affected by end-user configuration or by the fact that recent "git diff" turns on the rename detection by default.

#3 lore raw

PATCH v2 1/1 hooks--pre-commit: detect non-ASCII when renaming

In reply to Julian Prein via GitGitGadget

From: Julian Prein <[email protected]>

When diff.renames is turned on, the diff-filter will not return renamed files (or copied ones with diff.renames=copy) and potential non-ASCII characters would not be caught by this hook.

Use the plumbing command diff-index instead of the porcelain one to not be affected by diff.rename.

---
hooks--pre-commit: detect non-ASCII when renaming

A bit later than I expected, but here is v2.

Changes since v1:

* Switched to using diff-index and back to just the A filter as suggested by Junio C Hamano

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1291%2Fdruckdev%2Fpre-commit-renames-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1291/druckdev/pre-commit-renames-v2
Pull-Request: https://github.com/git/git/pull/1291

Range-diff vs v1:

1: 101f327a040 ! 1: 1f6ca0dd3eb hooks--pre-commit: detect non-ASCII when renaming
@@ Metadata
## Commit message ##
hooks--pre-commit: detect non-ASCII when renaming

- Currently the diff-filter that is used to check for non-ASCII characters
- in filenames only checks new additions.
+ When diff.renames is turned on, the diff-filter will not return renamed
+ files (or copied ones with diff.renames=copy) and potential non-ASCII
+ characters would not be caught by this hook.

- Extend the diff-filter in the pre-commit sample to include CR as well.
- This way non-ASCII character in filenames are detected on a rename/copy
- as well.
+ Use the plumbing command diff-index instead of the porcelain one to not
+ be affected by diff.rename.

@@ templates/hooks--pre-commit.sample: if [ "$allownonascii" != "true" ] &&
# even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range.
- test $(git diff --cached --name-only --diff-filter=A -z $against |
-+ test $(git diff --cached --name-only --diff-filter=ACR -z $against |
++ test $(git diff-index --cached --name-only --diff-filter=A -z $against |
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
cat <<\EOF

 templates/hooks--pre-commit.sample | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
templates/hooks--pre-commit.sample +1 -1
index e144712c85c..29ed5ee486a 100755
@@ -28,7 +28,7 @@ if [ "$allownonascii" != "true" ] &&
 	# Note that the use of brackets around a tr range is ok here, (it's
 	# even required, for portability to Solaris 10's /usr/bin/tr), since
 	# the square bracket bytes happen to fall in the designated range.
-	test $(git diff --cached --name-only --diff-filter=A -z $against |
+	test $(git diff-index --cached --name-only --diff-filter=A -z $against |
 	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
 then
 	cat <<\EOF

base-commit: 61a22ddaf0626111193a17ac12f366bd6d167dff

Signature · 1 line
gitgitgadget
#4 lore raw
Quoted 8 lines · Julian Prein via GitGitGadget

From: Julian Prein <[email protected]>

When diff.renames is turned on, the diff-filter will not return renamed files (or copied ones with diff.renames=copy) and potential non-ASCII characters would not be caught by this hook.

Use the plumbing command diff-index instead of the porcelain one to not be affected by diff.rename.

Makes sense.

An obvious alternative would be to pass "--no-renames" and keep using the Porcelain "git diff", but this is how the plumbing "diff-index" and friends are meant to be used. Looking good.

Will queue. Thanks.