Re: [PATCH 2/3] Windows: a test_cmp that is agnostic to random LF CRLF conversions

2013-11-03 Thread Johannes Sixt
Am 02.11.2013 21:47, schrieb Sebastian Schuberth:
 So maybe it's a good point now to also change the MINGW prerequisite
 name to MSYS as part of your patch, and then name the functions more
 appropriately?

It's too late. The series is already in master, and I see no point in a
follow-up patch of this kind as long as there is no additional benefit.

-- Hannes

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/3] Windows: a test_cmp that is agnostic to random LF CRLF conversions

2013-11-02 Thread Sebastian Schuberth

On 26.10.2013 21:17, Johannes Sixt wrote:


In a number of tests, output that was produced by a shell script is
compared to expected output using test_cmp. Unfortunately, the MSYS bash--
when invoked via git, such as in hooks--converts LF to CRLF on output
(as produced by echo and printf), which leads to many false positives.


As you correctly point out the LF vs. CRLF issues are caused by MSYS 
bash. Then why are the functions called mingw_* instead of msys_*? I'd 
prefer to make very clear that not MinGW but MSYS is the culprit 
concerning the LF vs. CRLF issues (and also the path mangling issues).


--
Sebastian Schuberth

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/3] Windows: a test_cmp that is agnostic to random LF CRLF conversions

2013-11-02 Thread Johannes Sixt
Am 02.11.2013 21:33, schrieb Sebastian Schuberth:
 On 26.10.2013 21:17, Johannes Sixt wrote:
 
 In a number of tests, output that was produced by a shell script is
 compared to expected output using test_cmp. Unfortunately, the MSYS
 bash--
 when invoked via git, such as in hooks--converts LF to CRLF on output
 (as produced by echo and printf), which leads to many false positives.
 
 As you correctly point out the LF vs. CRLF issues are caused by MSYS
 bash. Then why are the functions called mingw_* instead of msys_*? I'd
 prefer to make very clear that not MinGW but MSYS is the culprit
 concerning the LF vs. CRLF issues (and also the path mangling issues).

It's a historical accident. We already have the prerequisite MINGW to
work around various annoyances, most of which are caused by MSYS bash. I
didn't want to invent a new prefix.

-- Hannes

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/3] Windows: a test_cmp that is agnostic to random LF CRLF conversions

2013-10-26 Thread Johannes Sixt
In a number of tests, output that was produced by a shell script is
compared to expected output using test_cmp. Unfortunately, the MSYS bash--
when invoked via git, such as in hooks--converts LF to CRLF on output
(as produced by echo and printf), which leads to many false positives.

Implements a diff tool that undoes the converted CRLF. To avoid that
sub-processes are spawned (which is very slow on Windows), the tool is
implemented as a shell function. Diff is invoked as usual only when a
difference is detected by the shell code.

Signed-off-by: Johannes Sixt j...@kdbg.org
---
 t/test-lib-functions.sh | 66 +
 t/test-lib.sh   |  1 +
 2 files changed, 67 insertions(+)

diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index a7e9aac..f987694 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -710,3 +710,69 @@ test_ln_s_add () {
git update-index --add --cacheinfo 12 $ln_s_obj $2
fi
 }
+
+# The following mingw_* functions obey POSIX shell syntax, but are actually
+# bash scripts, and are meant to be used only with bash on Windows.
+
+# A test_cmp function that treats LF and CRLF equal and avoids to fork
+# diff when possible.
+mingw_test_cmp () {
+   # Read text into shell variables and compare them. If the results
+   # are different, use regular diff to report the difference.
+   local test_cmp_a= test_cmp_b=
+
+   # When text came from stdin (one argument is '-') we must feed it
+   # to diff.
+   local stdin_for_diff=
+
+   # Since it is difficult to detect the difference between an
+   # empty input file and a failure to read the files, we go straight
+   # to diff if one of the inputs is empty.
+   if test -s $1  test -s $2
+   then
+   # regular case: both files non-empty
+   mingw_read_file_strip_cr_ test_cmp_a $1
+   mingw_read_file_strip_cr_ test_cmp_b $2
+   elif test -s $1  test $2 = -
+   then
+   # read 2nd file from stdin
+   mingw_read_file_strip_cr_ test_cmp_a $1
+   mingw_read_file_strip_cr_ test_cmp_b
+   stdin_for_diff='$test_cmp_b'
+   elif test $1 = -  test -s $2
+   then
+   # read 1st file from stdin
+   mingw_read_file_strip_cr_ test_cmp_a
+   mingw_read_file_strip_cr_ test_cmp_b $2
+   stdin_for_diff='$test_cmp_a'
+   fi
+   test -n $test_cmp_a 
+   test -n $test_cmp_b 
+   test $test_cmp_a = $test_cmp_b ||
+   eval diff -u \\$@\ $stdin_for_diff
+}
+
+# $1 is the name of the shell variable to fill in
+mingw_read_file_strip_cr_ () {
+   # Read line-wise using LF as the line separator
+   # and use IFS to strip CR.
+   local line
+   while :
+   do
+   if IFS=$'\r' read -r -d $'\n' line
+   then
+   # good
+   line=$line$'\n'
+   else
+   # we get here at EOF, but also if the last line
+   # was not terminated by LF; in the latter case,
+   # some text was read
+   if test -z $line
+   then
+   # EOF, really
+   break
+   fi
+   fi
+   eval $1=\$$1\$line
+   done
+}
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 0fa7dfd..77e487b 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -817,6 +817,7 @@ case $(uname -s) in
test_set_prereq NOT_CYGWIN
test_set_prereq SED_STRIPS_CR
test_set_prereq GREP_STRIPS_CR
+   GIT_TEST_CMP=mingw_test_cmp
;;
 *CYGWIN*)
test_set_prereq POSIXPERM
-- 
1.8.4.33.gd68f7e8

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html