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

[PATCHv6 16/16] Introduce portable_unset and use it to ensure proper && chaining

From
Elijah Newren <newren@gmail.com>
Date
Oct 3, 2010, 20:00 UTC
Message-ID
<1286136014-7728-17-git-send-email-newren@gmail.com>
In-Reply-To
<1286136014-7728-1-git-send-email-newren@gmail.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
---
 t/README          |   13 +++++--------
 t/t0001-init.sh   |   28 ++++++++++++++--------------
 t/t7006-pager.sh  |   10 +++++-----
 t/t7502-commit.sh |    4 ++--
 t/test-lib.sh     |   11 +++++++++++
 5 files changed, 37 insertions(+), 29 deletions(-)
diff --git a/t/README b/t/README
index ee4c0cf..e10c0ce 100644
--- a/t/README
+++ b/t/README
@@ -259,14 +259,11 @@ Do:
 	test ...
 
    That way all of the commands in your tests will succeed or fail. If
-   you must ignore the return value of something (e.g., the return
-   after unsetting a variable that was already unset is unportable) it's
-   best to indicate so explicitly with a semicolon:
-
-	unset HLAGH;
-	git merge hla &&
-	git push gh &&
-	test ...
+   you must ignore the return value of something, consider using a
+   helper function (e.g. use portable_unset instead of unset, in order
+   to avoid unportable return value for unsetting a variable that was
+   already unset), or prepending the command with test_might_fail or
+   test_must_fail.
 
  - Check the test coverage for your tests. See the "Test coverage"
    below.
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 9d4539f..c1b6ac2 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -25,7 +25,7 @@ check_config () {
 
 test_expect_success 'plain' '
 	(
-		unset GIT_DIR GIT_WORK_TREE
+		portable_unset GIT_DIR GIT_WORK_TREE &&
 		mkdir plain &&
 		cd plain &&
 		git init
@@ -35,7 +35,7 @@ test_expect_success 'plain' '
 
 test_expect_success 'plain with GIT_WORK_TREE' '
 	if (
-		unset GIT_DIR
+		portable_unset GIT_DIR &&
 		mkdir plain-wt &&
 		cd plain-wt &&
 		GIT_WORK_TREE=$(pwd) git init
@@ -48,7 +48,7 @@ test_expect_success 'plain with GIT_WORK_TREE' '
 
 test_expect_success 'plain bare' '
 	(
-		unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
+		portable_unset GIT_DIR GIT_WORK_TREE GIT_CONFIG &&
 		mkdir plain-bare-1 &&
 		cd plain-bare-1 &&
 		git --bare init
@@ -58,7 +58,7 @@ test_expect_success 'plain bare' '
 
 test_expect_success 'plain bare with GIT_WORK_TREE' '
 	if (
-		unset GIT_DIR GIT_CONFIG
+		portable_unset GIT_DIR GIT_CONFIG &&
 		mkdir plain-bare-2 &&
 		cd plain-bare-2 &&
 		GIT_WORK_TREE=$(pwd) git --bare init
@@ -72,7 +72,7 @@ test_expect_success 'plain bare with GIT_WORK_TREE' '
 test_expect_success 'GIT_DIR bare' '
 
 	(
-		unset GIT_CONFIG
+		portable_unset GIT_CONFIG &&
 		mkdir git-dir-bare.git &&
 		GIT_DIR=git-dir-bare.git git init
 	) &&
@@ -82,7 +82,7 @@ test_expect_success 'GIT_DIR bare' '
 test_expect_success 'init --bare' '
 
 	(
-		unset GIT_DIR GIT_WORK_TREE GIT_CONFIG
+		portable_unset GIT_DIR GIT_WORK_TREE GIT_CONFIG &&
 		mkdir init-bare.git &&
 		cd init-bare.git &&
 		git init --bare
@@ -93,7 +93,7 @@ test_expect_success 'init --bare' '
 test_expect_success 'GIT_DIR non-bare' '
 
 	(
-		unset GIT_CONFIG
+		portable_unset GIT_CONFIG &&
 		mkdir non-bare &&
 		cd non-bare &&
 		GIT_DIR=.git git init
@@ -104,7 +104,7 @@ test_expect_success 'GIT_DIR non-bare' '
 test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
 
 	(
-		unset GIT_CONFIG
+		portable_unset GIT_CONFIG &&
 		mkdir git-dir-wt-1.git &&
 		GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-1.git git init
 	) &&
@@ -114,7 +114,7 @@ test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
 test_expect_success 'GIT_DIR & GIT_WORK_TREE (2)' '
 
 	if (
-		unset GIT_CONFIG
+		portable_unset GIT_CONFIG &&
 		mkdir git-dir-wt-2.git &&
 		GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-2.git git --bare init
 	)
@@ -127,7 +127,7 @@ test_expect_success 'GIT_DIR & GIT_WORK_TREE (2)' '
 test_expect_success 'reinit' '
 
 	(
-		unset GIT_CONFIG GIT_WORK_TREE GIT_CONFIG
+		portable_unset GIT_CONFIG GIT_WORK_TREE GIT_CONFIG &&
 
 		mkdir again &&
 		cd again &&
@@ -175,8 +175,8 @@ test_expect_success 'init with init.templatedir set' '
 		git config -f "$test_config"  init.templatedir "${HOME}/templatedir-source" &&
 		mkdir templatedir-set &&
 		cd templatedir-set &&
-		unset GIT_CONFIG_NOGLOBAL &&
-		unset GIT_TEMPLATE_DIR &&
+		portable_unset GIT_CONFIG_NOGLOBAL &&
+		portable_unset GIT_TEMPLATE_DIR &&
 		NO_SET_GIT_TEMPLATE_DIR=t &&
 		export NO_SET_GIT_TEMPLATE_DIR &&
 		git init
@@ -187,7 +187,7 @@ test_expect_success 'init with init.templatedir set' '
 test_expect_success 'init --bare/--shared overrides system/global config' '
 	(
 		test_config="$HOME"/.gitconfig &&
-		unset GIT_CONFIG_NOGLOBAL &&
+		portable_unset GIT_CONFIG_NOGLOBAL &&
 		git config -f "$test_config" core.bare false &&
 		git config -f "$test_config" core.sharedRepository 0640 &&
 		mkdir init-bare-shared-override &&
@@ -202,7 +202,7 @@ test_expect_success 'init --bare/--shared overrides system/global config' '
 test_expect_success 'init honors global core.sharedRepository' '
 	(
 		test_config="$HOME"/.gitconfig &&
-		unset GIT_CONFIG_NOGLOBAL &&
+		portable_unset GIT_CONFIG_NOGLOBAL &&
 		git config -f "$test_config" core.sharedRepository 0666 &&
 		mkdir shared-honor-global &&
 		cd shared-honor-global &&
diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh
index fb744e3..4c5da2e 100755
--- a/t/t7006-pager.sh
+++ b/t/t7006-pager.sh
@@ -41,7 +41,7 @@ else
 fi
 
 test_expect_success 'setup' '
-	unset GIT_PAGER GIT_PAGER_IN_USE;
+	portable_unset GIT_PAGER GIT_PAGER_IN_USE &&
 	test_might_fail git config --unset core.pager &&
 
 	PAGER="cat >paginated.out" &&
@@ -254,7 +254,7 @@ test_default_pager() {
 	parse_args "$@"
 
 	$test_expectation SIMPLEPAGERTTY "$cmd - default pager is used by default" "
-		unset PAGER GIT_PAGER;
+		portable_unset PAGER GIT_PAGER &&
 		test_might_fail git config --unset core.pager &&
 		rm -f default_pager_used ||
 		cleanup_fail &&
@@ -277,7 +277,7 @@ test_PAGER_overrides() {
 	parse_args "$@"
 
 	$test_expectation TTY "$cmd - PAGER overrides default pager" "
-		unset GIT_PAGER;
+		portable_unset GIT_PAGER &&
 		test_might_fail git config --unset core.pager &&
 		rm -f PAGER_used ||
 		cleanup_fail &&
@@ -305,7 +305,7 @@ test_core_pager() {
 	parse_args "$@"
 
 	$test_expectation TTY "$cmd - repository-local core.pager setting $used_if_wanted" "
-		unset GIT_PAGER;
+		portable_unset GIT_PAGER &&
 		rm -f core.pager_used ||
 		cleanup_fail &&
 
@@ -333,7 +333,7 @@ test_pager_subdir_helper() {
 	parse_args "$@"
 
 	$test_expectation TTY "$cmd - core.pager $used_if_wanted from subdirectory" "
-		unset GIT_PAGER;
+		portable_unset GIT_PAGER &&
 		rm -f core.pager_used &&
 		rm -fr sub ||
 		cleanup_fail &&
diff --git a/t/t7502-commit.sh b/t/t7502-commit.sh
index b6b9802..028b101 100755
--- a/t/t7502-commit.sh
+++ b/t/t7502-commit.sh
@@ -252,8 +252,8 @@ test_expect_success 'committer is automatic' '
 
 	echo >>negative &&
 	(
-		unset GIT_COMMITTER_EMAIL
-		unset GIT_COMMITTER_NAME
+		portable_unset GIT_COMMITTER_EMAIL &&
+		portable_unset GIT_COMMITTER_NAME &&
 		# must fail because there is no change
 		test_must_fail git commit -e -m "sample"
 	) &&
diff --git a/t/test-lib.sh b/t/test-lib.sh
index d86edcd..b234c27 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -268,6 +268,17 @@ remove_cr () {
 	tr '\015' Q | sed -e 's/Q$//'
 }
 
+# In some bourne shell implementations, the "unset" builtin returns
+# nonzero status when a variable to be unset was not set in the first
+# place.
+#
+# Use portable_unset when that should not be considered an error.
+
+portable_unset () {
+	unset "$@"
+	return 0
+}
+
 test_tick () {
 	if test -z "${test_tick+set}"
 	then
-- 
1.7.3.1.66.gab790
Previous: Elijah NewrenNext: Ævar Arnfjörð Bjarmason
Message 49 of 62 in “[PATCHv6 00/16] Add missing &&'s in the testsuite”
  1. Elijah NewrenOct 3, 2010
  2. 01/16 test-lib: make test_expect_code a test commandElijah Newren, Oct 3, 2010
  3. Junio C HamanoOct 4, 2010
  4. Ævar Arnfjörð BjarmasonOct 4, 2010
  5. Jonathan NiederOct 4, 2010
  6. Ævar Arnfjörð BjarmasonOct 4, 2010
  7. Jonathan NiederOct 4, 2010
  8. Ævar Arnfjörð BjarmasonOct 4, 2010
  9. Jonathan NiederOct 4, 2010
  10. Ævar Arnfjörð BjarmasonOct 4, 2010
  11. 02/16 t3020 (ls-files-error-unmatch): remove stray '1' from end of fileElijah Newren, Oct 3, 2010
  12. Junio C HamanoOct 4, 2010
  13. 03/16 t4017 (diff-retval): replace manual exit code check with test_expect_codeElijah Newren, Oct 3, 2010
  14. 04/16 t100[12] (read-tree-m-2way, read_tree_m_u_2way): add missing &&Elijah Newren, Oct 3, 2010
  15. 05/16 t4002 (diff-basic): use test_might_fail for commands that might failElijah Newren, Oct 3, 2010
  16. 06/16 t4202 (log): Replace '<git-command> || :' with test_might_failElijah Newren, Oct 3, 2010
  17. 07/16 t3600 (rm): add lots of missing &&Elijah Newren, Oct 3, 2010
  18. Jonathan NiederOct 3, 2010
  19. Junio C HamanoOct 3, 2010
  20. 08/16 t4019 (diff-wserror): add lots of missing &&Elijah Newren, Oct 3, 2010
  21. 09/16 t4026 (color): remove unneeded and unchained commandElijah Newren, Oct 3, 2010
  22. 10/16 t5602 (clone-remote-exec): add missing &&Elijah Newren, Oct 3, 2010
  23. 11/16 t6016 (rev-list-graph-simplify-history): add missing &&Elijah Newren, Oct 3, 2010
  24. 12/16 t7001 (mv): add missing &&Elijah Newren, Oct 3, 2010
  25. 13/16 t7601 (merge-pull-config): add missing &&Elijah Newren, Oct 3, 2010
  26. 14/16 t7800 (difftool): add missing &&Elijah Newren, Oct 3, 2010
  27. 15/16 Add missing &&'s throughout the testsuiteElijah Newren, Oct 3, 2010
  28. Jonathan NiederOct 3, 2010
  29. Jonathan NiederOct 3, 2010
  30. tests: add missing &&Jonathan Nieder, Oct 31, 2010
  31. Junio C HamanoOct 31, 2010
  32. 00/10 Re: [PATCH en/cascade-tests] tests: add missing &&Jonathan Nieder, Oct 31, 2010
  33. 01/10 tests: add missing &&, batch 2Jonathan Nieder, Oct 31, 2010
  34. 02/10 test-lib: introduce test_line_count to measure filesJonathan Nieder, Oct 31, 2010
  35. Junio C HamanoNov 9, 2010
  36. Ævar Arnfjörð BjarmasonNov 9, 2010
  37. 03/10 t6022 (renaming merge): chain test commands with &&Jonathan Nieder, Oct 31, 2010
  38. 04/10 t1502 (rev-parse --parseopt): test exit code from "-h"Jonathan Nieder, Oct 31, 2010
  39. 05/10 t1400 (update-ref): use test_must_failJonathan Nieder, Oct 31, 2010
  40. 06/10 t3301 (notes): use test_expect_code for clarityJonathan Nieder, Oct 31, 2010
  41. 07/10 t3404 (rebase -i): unroll test_commit loopsJonathan Nieder, Oct 31, 2010
  42. 08/10 t3404 (rebase -i): move comment to descriptionJonathan Nieder, Oct 31, 2010
  43. Junio C HamanoNov 17, 2010
  44. 09/10 t3404 (rebase -i): introduce helper to check position of HEADJonathan Nieder, Oct 31, 2010
  45. Junio C HamanoNov 17, 2010
  46. 10/10 t4124 (apply --whitespace): use test_might_failJonathan Nieder, Oct 31, 2010
  47. Junio C HamanoNov 9, 2010
  48. Elijah NewrenNov 5, 2010
  49. 16/16 Introduce portable_unset and use it to ensure proper && chainingElijah Newren, Oct 3, 2010
  50. Ævar Arnfjörð BjarmasonOct 4, 2010
  51. Jonathan NiederOct 4, 2010
  52. Junio C HamanoOct 4, 2010
  53. Jonathan NiederOct 4, 2010
  54. Jonathan NiederOct 3, 2010
  55. Ævar Arnfjörð BjarmasonOct 4, 2010
  56. Jonathan NiederOct 4, 2010
  57. Ævar Arnfjörð BjarmasonOct 4, 2010
  58. yj2133011Oct 4, 2010
  59. test-lib: &&-chaining testerJonathan Nieder, Oct 6, 2010
  60. Matthieu MoyOct 6, 2010
  61. Johannes SixtOct 6, 2010
  62. Sverre RabbelierOct 6, 2010

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.