Subject: Re: [PATCH v14 16/16] test: run testcases with POSIX absolute paths on Windows

From: Johannes Sixt <[email-masked]>
Date: Mon, 24 Jun 2013 20:56:21 +0200

Am 24.06.2013 17:21, schrieb Jiang Xin:
> Add new subcommand "mingw_path" in test-path-utils, so that we can get
> the expected absolute paths on Windows. For example:
> 
>     COMMAND LINE                        Linux  Windows
>     ==================================  =====  ===============
>     test-path-utils mingw_path /        /      C:/msysgit
>     test-path-utils mingw_path /a/b/    /a/b/  C:/msysgit/a/b/
> 
> With this utility, most skipped test cases in t0060 can be runcorrectly
> on Windows.

Thanks for working on this. Did you have an opportunity to test on Windows?

> +mingw_path() {
> +	case $2 in
> +	NO_MINGW)
> +		echo "$1"
> +		;;
> +	*)
> +		test-path-utils mingw_path "$1"
> +		;;
> +	esac
> +}
> +
> +get_prereq_flag() {
> +	case $1 in
> +	POSIX)
> +		echo $1
> +		;;
> +	*)
> +		;;
> +	esac
> +}

It took me a while to notice that the token POSIX serves a different
purpose than NO_MINGW: POSIX is only needed to skip a test, NO_MINGW is
only used to avoid a test-path-utils call. The reason for the complexity
is that you put both tokens in the same parameter position in the
invocations of the test cases.

You use NO_MINGW only twice. I would just skip these two tests, then the
parameter position is reserved for the prerequisite, and things stay simple.

> +
>  norm_path() {
> -	test_expect_success $3 "normalize path: $1 => $2" \
> -	"test \"\$(test-path-utils normalize_path_copy '$1')\" = '$2'"
> +	expected=$(mingw_path "$2" "$3")
> +	prereq=$(get_prereq_flag $3)
> +	test_expect_success $prereq "normalize path: $1 => $2" \
> +	"test \"\$(test-path-utils normalize_path_copy '$1')\" = '$expected'"
>  }
>  
>  relative_path() {
> -	test_expect_success $4 "relative path: $1 $2 => $3" \
> -	"test \"\$(test-path-utils relative_path '$1' '$2')\" = '$3'"
> +	expected=$(mingw_path "$3" "$4")
> +	prereq=$(get_prereq_flag $4)
> +	test_expect_success $prereq "relative path: $1 $2 => $3" \
> +	"test \"\$(test-path-utils relative_path '$1' '$2')\" = '$expected'"
>  }
>  
>  # On Windows, we are using MSYS's bash, which mangles the paths.
> @@ -39,8 +64,8 @@ ancestor() {
>  	 test \"\$actual\" = '$expected'"
>  }
>  
> -# Absolute path tests must be skipped on Windows because due to path mangling
> -# the test program never sees a POSIX-style absolute path
> +# Some absolute path tests should be skipped on Windows due to path mangling
> +# on POSIX-style absolute paths
>  case $(uname -s) in
>  *MINGW*)
>  	;;
> @@ -73,10 +98,10 @@ norm_path d1/s1//../s2/../../d2 d2
>  norm_path d1/.../d2 d1/.../d2
>  norm_path d1/..././../d2 d1/d2
>  
> -norm_path / / POSIX
> -norm_path // / POSIX
> -norm_path /// / POSIX
> -norm_path /. / POSIX
> +norm_path / /
> +norm_path // / NO_MINGW
> +norm_path /// / NO_MINGW
> +norm_path /. /
>  norm_path /./ / POSIX
>  norm_path /./.. ++failed++ POSIX
>  norm_path /../. ++failed++ POSIX
> @@ -84,19 +109,19 @@ norm_path /./../.// ++failed++ POSIX
>  norm_path /dir/.. / POSIX
>  norm_path /dir/sub/../.. / POSIX
>  norm_path /dir/sub/../../.. ++failed++ POSIX
> -norm_path /dir /dir POSIX
> -norm_path /dir// /dir/ POSIX
> -norm_path /./dir /dir POSIX
> -norm_path /dir/. /dir/ POSIX
> -norm_path /dir///./ /dir/ POSIX
> -norm_path /dir//sub/.. /dir/ POSIX
> -norm_path /dir/sub/../ /dir/ POSIX
> +norm_path /dir /dir
> +norm_path /dir// /dir/
> +norm_path /./dir /dir
> +norm_path /dir/. /dir/
> +norm_path /dir///./ /dir/
> +norm_path /dir//sub/.. /dir/
> +norm_path /dir/sub/../ /dir/
>  norm_path //dir/sub/../. /dir/ POSIX
> -norm_path /dir/s1/../s2/ /dir/s2/ POSIX
> -norm_path /d1/s1///s2/..//../s3/ /d1/s3/ POSIX
> -norm_path /d1/s1//../s2/../../d2 /d2 POSIX
> -norm_path /d1/.../d2 /d1/.../d2 POSIX
> -norm_path /d1/..././../d2 /d1/d2 POSIX
> +norm_path /dir/s1/../s2/ /dir/s2/
> +norm_path /d1/s1///s2/..//../s3/ /d1/s3/
> +norm_path /d1/s1//../s2/../../d2 /d2
> +norm_path /d1/.../d2 /d1/.../d2
> +norm_path /d1/..././../d2 /d1/d2
>  
>  ancestor / / -1
>  ancestor /foo / 0
> @@ -197,8 +222,8 @@ relative_path /a	/a/b		../
>  relative_path /		/a/b/		../../
>  relative_path /a/c	/a/b/		../c
>  relative_path /a/c	/a/b		../c
> -relative_path /a/b	"<empty>"	/a/b	POSIX
> -relative_path /a/b 	"<null>"	/a/b	POSIX
> +relative_path /a/b	"<empty>"	/a/b
> +relative_path /a/b 	"<null>"	/a/b
>  relative_path "<empty>"	/a/b		./
>  relative_path "<empty>"	"<empty>"	./
>  relative_path "<empty>"	"<null>"	./
> diff --git a/test-path-utils.c b/test-path-utils.c
> index 95ef4..699ef 100644
> --- a/test-path-utils.c
> +++ b/test-path-utils.c
> @@ -116,6 +116,11 @@ int main(int argc, char **argv)
>  		return 0;
>  	}
>  
> +	if (argc == 3 && !strcmp(argv[1], "mingw_path")) {
> +		puts(argv[2]);
> +		return 0;
> +	}
> +
>  	if (argc == 4 && !strcmp(argv[1], "relative_path")) {
>  		struct strbuf sb = STRBUF_INIT;
>  		const char *abs, *base, *rel;
>