t/test_lib: avoid naked bash arrays in file_lineno
diff mbox series

Message ID 20200507175706.19986-1-carenas@gmail.com
State New
Headers show
Series
  • t/test_lib: avoid naked bash arrays in file_lineno
Related show

Commit Message

Carlo Marcelo Arenas Belón May 7, 2020, 5:57 p.m. UTC
662f9cf154 (tests: when run in Bash, annotate test failures with file
name/line number, 2020-04-11), introduces a way to report the location
(file:lineno) of a failed test case by traversing the bash callstack.

The implementation requires bash and uses shell arrays and is therefore
protected by a guard but NetBSD sh will still have to parse the function
and therefore will result in:

  ** t0000-basic.sh ***
  ./test-lib.sh: 681: Syntax error: Bad substitution

Enclose the bash specific code inside an eval to avoid parsing errors in
the same way than 5826b7b595 (test-lib: check Bash version for '-x'
without using shell arrays, 2019-01-03)

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
---
 t/test-lib.sh | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

Comments

Johannes Schindelin May 8, 2020, 11:53 p.m. UTC | #1
Hi Carlo,

this is v2, right? The subject says `[PATCH]`, not `[PATCH v2]`, so I am
just trying to make sure.

It's things like this why I never use `git send-email` manually anymore.
Yes, sure, GitGitGadget helps others, too, but its initial primary goal
was to help me not botch my patch submissions.

On Thu, 7 May 2020, Carlo Marcelo Arenas Belón wrote:

> 662f9cf154 (tests: when run in Bash, annotate test failures with file
> name/line number, 2020-04-11), introduces a way to report the location
> (file:lineno) of a failed test case by traversing the bash callstack.
>
> The implementation requires bash and uses shell arrays and is therefore
> protected by a guard but NetBSD sh will still have to parse the function
> and therefore will result in:
>
>   ** t0000-basic.sh ***
>   ./test-lib.sh: 681: Syntax error: Bad substitution
>
> Enclose the bash specific code inside an eval to avoid parsing errors in
> the same way than 5826b7b595 (test-lib: check Bash version for '-x'
> without using shell arrays, 2019-01-03)
>
> Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>

I still provided help, I hope?

> ---
>  t/test-lib.sh | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/t/test-lib.sh b/t/test-lib.sh
> index 1b221951a8..baf94546da 100644
> --- a/t/test-lib.sh
> +++ b/t/test-lib.sh
> @@ -677,14 +677,16 @@ die () {
>
>  file_lineno () {
>  	test -z "$GIT_TEST_FRAMEWORK_SELFTEST" && test -n "$BASH" || return 0
> -	local i
> -	for i in ${!BASH_SOURCE[*]}
> -	do
> -		case $i,"${BASH_SOURCE[$i]##*/}" in
> -		0,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:$LINENO: ${1+$1: }"; return;;
> -		*,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:${BASH_LINENO[$(($i-1))]}: ${1+$1: }"; return;;
> -		esac
> -	done
> +	eval '
> +		local i
> +		for i in ${!BASH_SOURCE[*]}
> +		do
> +			case $i,"${BASH_SOURCE[$i]##*/}" in
> +			0,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:$LINENO: ${1+$1: }"; return;;
> +			*,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:${BASH_LINENO[$(($i-1))]}: ${1+$1: }"; return;;
> +			esac
> +		done
> +	'

This one looks correct to me.

Ciao,
Dscho

>  }
>
>  GIT_EXIT_OK=
> --
> 2.26.2.717.g5cccb0e1a8
>
>

Patch
diff mbox series

diff --git a/t/test-lib.sh b/t/test-lib.sh
index 1b221951a8..baf94546da 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -677,14 +677,16 @@  die () {
 
 file_lineno () {
 	test -z "$GIT_TEST_FRAMEWORK_SELFTEST" && test -n "$BASH" || return 0
-	local i
-	for i in ${!BASH_SOURCE[*]}
-	do
-		case $i,"${BASH_SOURCE[$i]##*/}" in
-		0,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:$LINENO: ${1+$1: }"; return;;
-		*,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:${BASH_LINENO[$(($i-1))]}: ${1+$1: }"; return;;
-		esac
-	done
+	eval '
+		local i
+		for i in ${!BASH_SOURCE[*]}
+		do
+			case $i,"${BASH_SOURCE[$i]##*/}" in
+			0,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:$LINENO: ${1+$1: }"; return;;
+			*,t[0-9]*.sh) echo "t/${BASH_SOURCE[$i]}:${BASH_LINENO[$(($i-1))]}: ${1+$1: }"; return;;
+			esac
+		done
+	'
 }
 
 GIT_EXIT_OK=