git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 01/40] test-cleaner: automate whitespace cleaning of test scripts

From
Jon Seymour <jon.seymour@gmail.com>
Date
Aug 6, 2011, 08:44 UTC
Message-ID
<1312620294-18616-1-git-send-email-jon.seymour@gmail.com>
In-Reply-To
<1312620119-18369-1-git-send-email-jon.seymour@gmail.com>
This script allows the automated cleaning of test scripts.

Any whitespace fixups of a test script that do not effect the exit status or output of the test are assumed to be safe and are automatically committed.

To check the tests for whitespace issues, change into git's test directory and run:

	test-cleaner.sh check-whitespace t*.sh
This will:
* write one line of the form:
	AUTO<tab><filename>
for each file that can be fixed automatically.
* write one line of the form:
	MANUAL<tab><filename>
for each file that will require manual intervention to fix.
To fix all the automatically correctable errors, run:
	./test-cleaner.sh fix-whitespace-auto t[0-9]*.sh
To generate commits for all the errors that require manual correction, run:
	./test-cleaner.sh fix-whitespace-manual t[0-9]*.sh
To clean a file without running tests or generating commits, run:
	./test-cleaner.sh clean-whitespace foobar.sh
clean-whitespace can be used with files that are not tests.
If no arguments are supplied, file arguments are read from stdin.
The filter itself can be run with:
	./test-cleaner.sh whitespace-filter < file > some-other-file

The resulting series of commits should rebased on both the git master and pu branches. Commits that cause merge conflicts should be purged from the series.

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 t/test-cleaner.sh |  185 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 185 insertions(+), 0 deletions(-)
 create mode 100755 t/test-cleaner.sh
diff --git a/t/test-cleaner.sh b/t/test-cleaner.sh
new file mode 100755
index 0000000..9eb260b
--- /dev/null
+++ b/t/test-cleaner.sh
@@ -0,0 +1,185 @@
+#!/bin/sh
+
+USAGE="test-cleaner.sh
+	check-whitespace [<test-file> ...] - report on test files that need cleaning
+	fix_whitespace [<test-file> ...] - generate commits for files that need white space cleaning
+	fix-whitespace-auto [<test-file> ...] - generate commits for files that can be automatically cleaned
+	fix-whitespace-manual [<test-file> ...] - generate commits for files that need manual cleaning
+	clean-whitespace [<file> ...] - applying the cleaner to the specified file without running tests or generating commits
+"
+SUBDIRECTORY_OK=t
+. "$(git --exec-path)/git-sh-setup"
+require_clean_work_tree
+
+cleaner()
+{
+	expand -i | unexpand --first-only | sed "s/ *\$//"
+}
+
+clean_whitespace()
+{
+	rc=0
+	list_files "$@" | while read file
+	do
+		cleaner <"$file" >$$.tmp &&
+		cat $$.tmp >"$file" || rc=1
+		rm -f $$.tmp
+		test $rc = 0
+	done || exit $?
+}
+
+list_files()
+{
+	if test $# -gt 0
+	then
+		for arg in "$@"; do
+		    echo $arg
+		done
+	else
+		cat
+	fi
+}
+
+fix_whitespace_auto()
+{
+	check_whitespace "$@" 2>/dev/null | grep "^AUTO" | fix_whitespace
+}
+
+fix_whitespace_auto()
+{
+	check_whitespace "$@" 2>/dev/null | grep "^MANUAL" | fix_whitespace
+}
+
+fix_whitespace()
+{
+	rc=0
+	check_whitespace "$@" 2>/dev/null | while read status file
+	do
+		case "$status" in
+		AUTO)
+			if  clean_whitespace "$file" &&
+				git diff --exit-code -w -- "$file" >/dev/null
+				git add "$file" &&
+				git diff --exit-code -w HEAD -- "$file" >/dev/null
+			then
+				git commit -F - 1>&2 <<EOF
+whitespace: remediate $file
+
+This file was edited by applying:
+
+	 expand -i | unexpand --first-only | sed "s/ *\$//"
+
+to the file.
+
+No change to test outputs or status code was observed.
+
+Signed-off-by: $(git config user.name) <$(git config user.email)>
+EOF
+				echo "$status	$file"
+			else
+				rc=1
+			fi
+			rm -f $$.tmp
+			;;
+		MANUAL)
+			CLEANER_PREFIX=fixer.
+			check_whitespace "$file" >/dev/null 2>$$.err
+			if  clean_whitespace "$file" &&
+				git diff --exit-code -w -- "$file" >/dev/null
+				git add "$file" &&
+				git diff --exit-code -w HEAD -- "$file" >/dev/null
+			then
+				git commit -F - 1>&2 <<EOF
+FAILED: whitespace: remediate $file
+
+This file was edited by applying:
+
+	 expand -i | unexpand --first-only | sed "s/ *\$//"
+
+to the file.
+
+The following errors were observed:
+
+$(cat $$.err | sed "s/^/   /")
+
+These errors should be fixed before submitting this patch upstream.
+
+Signed-off-by: $(git config user.name) <$(git config user.email)>
+EOF
+				echo "$status	$file"
+			else
+				rc=1
+			fi
+			rm -f $$.tmp $$.err
+			;;
+		*)
+			die "fix-whitespace failed on $file with unexpected output"
+			;;
+		esac
+		test "$rc" = 0
+	done || rc=$?
+	test "$rc" = 0
+}
+
+check_whitespace()
+{
+	list_files "$@" | while read file
+	do
+		cleaner <"$file" >$$.${CLEANER_PREFIX}edited &&
+		cmp "$file" $$.${CLEANER_PREFIX}edited 1>/dev/null
+		rc=$?
+		if test $rc != 0
+		then
+			sh $file >$$.${CLEANER_PREFIX}before.output 2>$$.${CLEANER_PREFIX}before.error </dev/null
+			echo $? > $$.${CLEANER_PREFIX}before.exit
+			sh ./$$.${CLEANER_PREFIX}edited >$$.${CLEANER_PREFIX}after.output 2>$$.${CLEANER_PREFIX}after.error </dev/null
+			echo $? > $$.${CLEANER_PREFIX}after.exit
+
+			if cmp $$.${CLEANER_PREFIX}before.output $$.${CLEANER_PREFIX}after.output 1>/dev/null &&
+				cmp $$.${CLEANER_PREFIX}before.error $$.${CLEANER_PREFIX}after.error 1>/dev/null &&
+				cmp $$.${CLEANER_PREFIX}before.exit $$.${CLEANER_PREFIX}after.exit 1>/dev/null
+			then
+				echo "AUTO	$file"
+			else
+				echo "MANUAL	$file"
+				diff -u $$.${CLEANER_PREFIX}before.output $$.${CLEANER_PREFIX}after.output 1>&2
+				diff -u $$.${CLEANER_PREFIX}before.error $$.${CLEANER_PREFIX}after.error 1>&2
+				diff -u $$.${CLEANER_PREFIX}before.exit $$.${CLEANER_PREFIX}after.exit 1>&2
+			fi
+			looprc=1
+		fi
+		rm -f $$.${CLEANER_PREFIX}edited $$.${CLEANER_PREFIX}after.* $$.${CLEANER_PREFIX}before.*
+		test "$looprc" = 0
+	done
+}
+
+case $# in
+0)
+	usage ;;
+*)
+	cmd=$1
+	shift
+	case "$cmd" in
+	check-whitespace)
+		check_whitespace "$@"
+		;;
+	fix-whitespace)
+		fix_whitespace "$@"
+		;;
+	fix-whitespace-auto)
+		fix_whitespace_auto "$@"
+		;;
+	fix-whitespace-manual)
+		fix_whitespace_manual "$@"
+		;;
+	clean-whitespace)
+		clean_whitespace "$@"
+		;;
+	whitespace-filter)
+		cleaner
+		;;
+	*)
+		usage
+		;;
+	esac
+esac
-- 
1.7.6.362.gf0e6
Previous: Jon SeymourNext: Jon Seymour
Message 2 of 51 in “test whitespace - perform trivial whitespace clean ups of test scripts.”
  1. 00/40 test whitespace - perform trivial whitespace clean ups of test scripts.Jon Seymour, Aug 6, 2011
  2. 01/40 test-cleaner: automate whitespace cleaning of test scriptsJon Seymour, Aug 6, 2011
  3. 02/40 whitespace: remediate t1001-read-tree-m-2way.shJon Seymour, Aug 6, 2011
  4. 03/40 whitespace: remediate t1006-cat-file.shJon Seymour, Aug 6, 2011
  5. Jeff KingAug 6, 2011
  6. Jon SeymourAug 6, 2011
  7. Junio C HamanoAug 6, 2011
  8. Jon SeymourAug 6, 2011
  9. 04/40 whitespace: remediate t1300-repo-config.shJon Seymour, Aug 6, 2011
  10. 05/40 whitespace: remediate t1503-rev-parse-verify.shJon Seymour, Aug 6, 2011
  11. 06/40 whitespace: remediate t3040-subprojects-basic.shJon Seymour, Aug 6, 2011
  12. 07/40 whitespace: remediate t3200-branch.shJon Seymour, Aug 6, 2011
  13. 08/40 whitespace: remediate t3406-rebase-message.shJon Seymour, Aug 6, 2011
  14. 09/40 whitespace: remediate t4002-diff-basic.shJon Seymour, Aug 6, 2011
  15. 10/40 whitespace: remediate t4010-diff-pathspec.shJon Seymour, Aug 6, 2011
  16. 11/40 whitespace: remediate t5300-pack-object.shJon Seymour, Aug 6, 2011
  17. 12/40 whitespace: remediate t5301-sliding-window.shJon Seymour, Aug 6, 2011
  18. 13/40 whitespace: remediate t5302-pack-index.shJon Seymour, Aug 6, 2011
  19. 14/40 whitespace: remediate t5303-pack-corruption-resilience.shJon Seymour, Aug 6, 2011
  20. 15/40 whitespace: remediate t5400-send-pack.shJon Seymour, Aug 6, 2011
  21. 16/40 whitespace: remediate t5402-post-merge-hook.shJon Seymour, Aug 6, 2011
  22. 17/40 whitespace: remediate t5403-post-checkout-hook.shJon Seymour, Aug 6, 2011
  23. 18/40 whitespace: remediate t5510-fetch.shJon Seymour, Aug 6, 2011
  24. 19/40 whitespace: remediate t6002-rev-list-bisect.shJon Seymour, Aug 6, 2011
  25. 20/40 whitespace: remediate t6005-rev-list-count.shJon Seymour, Aug 6, 2011
  26. 21/40 whitespace: remediate t6030-bisect-porcelain.shJon Seymour, Aug 6, 2011
  27. 22/40 whitespace: remediate t7003-filter-branch.shJon Seymour, Aug 6, 2011
  28. 23/40 whitespace: remediate t7004-tag.shJon Seymour, Aug 6, 2011
  29. 24/40 whitespace: remediate t7403-submodule-sync.shJon Seymour, Aug 6, 2011
  30. 25/40 whitespace: remediate t7500-commit.shJon Seymour, Aug 6, 2011
  31. 26/40 whitespace: remediate t7810-grep.shJon Seymour, Aug 6, 2011
  32. 27/40 whitespace: remediate t9100-git-svn-basic.shJon Seymour, Aug 6, 2011
  33. 28/40 whitespace: remediate t9104-git-svn-follow-parent.shJon Seymour, Aug 6, 2011
  34. 29/40 whitespace: remediate t9107-git-svn-migrate.shJon Seymour, Aug 6, 2011
  35. 30/40 whitespace: remediate t9108-git-svn-glob.shJon Seymour, Aug 6, 2011
  36. 31/40 whitespace: remediate t9109-git-svn-multi-glob.shJon Seymour, Aug 6, 2011
  37. 32/40 whitespace: remediate t9110-git-svn-use-svm-props.shJon Seymour, Aug 6, 2011
  38. 33/40 whitespace: remediate t9118-git-svn-funky-branch-names.shJon Seymour, Aug 6, 2011
  39. 34/40 whitespace: remediate t9125-git-svn-multi-glob-branch-names.shJon Seymour, Aug 6, 2011
  40. 35/40 whitespace: remediate t9400-git-cvsserver-server.shJon Seymour, Aug 6, 2011
  41. 36/40 whitespace: remediate t9401-git-cvsserver-crlf.shJon Seymour, Aug 6, 2011
  42. 37/40 whitespace: remediate t9500-gitweb-standalone-no-errors.shJon Seymour, Aug 6, 2011
  43. 38/40 whitespace: remediate t9603-cvsimport-patchsets.shJon Seymour, Aug 6, 2011
  44. 39/40 whitespace: remediate t1000-read-tree-m-3way.shJon Seymour, Aug 6, 2011
  45. 40/40 whitespace: remediate t6120-describe.shJon Seymour, Aug 6, 2011
  46. Jon SeymourAug 6, 2011
  47. whitespace: additional whitespace clean ups.Jon Seymour, Aug 6, 2011
  48. Jon SeymourAug 6, 2011
  49. Jeff KingAug 6, 2011
  50. Jon SeymourAug 6, 2011
  51. 01/40 test-cleaner: automate whitespace cleaning of test scriptsJon Seymour, Aug 6, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.