From b527773092c1455e964d756777d4092c09c9222d Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Dec 2013 19:08:10 -0500 Subject: t4056: add new tests for "git diff -O" Adapted from $gmane/236427 by Anders Waldenborg, "diff: Add diff.orderfile configuration variable". Signed-off-by: Anders Waldenborg Signed-off-by: Samuel Bronson Signed-off-by: Junio C Hamano --- t/t4056-diff-order.sh | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 t/t4056-diff-order.sh (limited to 't/t4056-diff-order.sh') diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh new file mode 100755 index 0000000000..c39ec4121a --- /dev/null +++ b/t/t4056-diff-order.sh @@ -0,0 +1,68 @@ +#!/bin/sh + +test_description='diff order' + +. ./test-lib.sh + +create_files () { + echo "$1" >a.h && + echo "$1" >b.c && + echo "$1" >c/Makefile && + echo "$1" >d.txt && + git add a.h b.c c/Makefile d.txt && + git commit -m"$1" +} + +test_expect_success 'setup' ' + mkdir c && + create_files 1 && + create_files 2 && + + cat >order_file_1 <<-\EOF && + *Makefile + *.txt + *.h + EOF + + cat >order_file_2 <<-\EOF && + *Makefile + *.h + *.c + EOF + + cat >expect_none <<-\EOF && + a.h + b.c + c/Makefile + d.txt + EOF + + cat >expect_1 <<-\EOF && + c/Makefile + d.txt + a.h + b.c + EOF + + cat >expect_2 <<-\EOF + c/Makefile + a.h + b.c + d.txt + EOF +' + +test_expect_success "no order (=tree object order)" ' + git diff --name-only HEAD^..HEAD >actual && + test_cmp expect_none actual +' + +for i in 1 2 +do + test_expect_success "orderfile using option ($i)" ' + git diff -Oorder_file_$i --name-only HEAD^..HEAD >actual && + test_cmp expect_$i actual + ' +done + +test_done -- cgit v1.2.1 From a21bae33d9e13c59217639b866355f1a02211a2c Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Dec 2013 19:08:11 -0500 Subject: diff: let "git diff -O" read orderfile from any file and fail properly The -O flag really shouldn't silently fail to do anything when given a path that it can't read from. However, it should be able to read from un-mmappable files, such as: * pipes/fifos * /dev/null: It's a character device (at least on Linux) * ANY empty file: Quoting Linux mmap(2), "SUSv3 specifies that mmap() should fail if length is 0. However, in kernels before 2.6.12, mmap() succeeded in this case: no mapping was created and the call returned addr. Since kernel 2.6.12, mmap() fails with the error EINVAL for this case." We especially want "-O/dev/null" to work, since we will be documenting it as the way to cancel "diff.orderfile" when we add that. (Note: "-O/dev/null" did have the right effect, since the existing error handling essentially worked out to "silently ignore the orderfile". But this was probably more coincidence than anything else.) So, lets toss all of that logic to get the file mmapped and just use strbuf_read_file() instead, which gives us decent error handling practically for free. Signed-off-by: Samuel Bronson Signed-off-by: Junio C Hamano --- t/t4056-diff-order.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 't/t4056-diff-order.sh') diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh index c39ec4121a..ae8036b73a 100755 --- a/t/t4056-diff-order.sh +++ b/t/t4056-diff-order.sh @@ -57,12 +57,38 @@ test_expect_success "no order (=tree object order)" ' test_cmp expect_none actual ' +test_expect_success 'missing orderfile' ' + rm -f bogus_file && + test_must_fail git diff -Obogus_file --name-only HEAD^..HEAD +' + +test_expect_success POSIXPERM,SANITY 'unreadable orderfile' ' + >unreadable_file && + chmod -r unreadable_file && + test_must_fail git diff -Ounreadable_file --name-only HEAD^..HEAD +' + +test_expect_success 'orderfile is a directory' ' + test_must_fail git diff -O/ --name-only HEAD^..HEAD +' + for i in 1 2 do test_expect_success "orderfile using option ($i)" ' git diff -Oorder_file_$i --name-only HEAD^..HEAD >actual && test_cmp expect_$i actual ' + + test_expect_success PIPE "orderfile is fifo ($i)" ' + rm -f order_fifo && + mkfifo order_fifo && + { + cat order_file_$i >order_fifo & + } && + git diff -O order_fifo --name-only HEAD^..HEAD >actual && + wait && + test_cmp expect_$i actual + ' done test_done -- cgit v1.2.1 From 6d8940b562adc5e43068868109dffe1b9bff7f78 Mon Sep 17 00:00:00 2001 From: Samuel Bronson Date: Wed, 18 Dec 2013 19:08:12 -0500 Subject: diff: add diff.orderfile configuration variable diff.orderfile acts as a default for the -O command line option. [sb: split up aw's original patch; rework tests and docs, treat option as pathname] Signed-off-by: Anders Waldenborg Signed-off-by: Samuel Bronson Signed-off-by: Junio C Hamano --- t/t4056-diff-order.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 't/t4056-diff-order.sh') diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh index ae8036b73a..1ddd226b78 100755 --- a/t/t4056-diff-order.sh +++ b/t/t4056-diff-order.sh @@ -89,6 +89,16 @@ do wait && test_cmp expect_$i actual ' + + test_expect_success "orderfile using config ($i)" ' + git -c diff.orderfile=order_file_$i diff --name-only HEAD^..HEAD >actual && + test_cmp expect_$i actual + ' + + test_expect_success "cancelling configured orderfile ($i)" ' + git -c diff.orderfile=order_file_$i diff -O/dev/null --name-only HEAD^..HEAD >actual && + test_cmp expect_none actual + ' done test_done -- cgit v1.2.1 From 0df49bef95fe1668805cdb76abadfb82a8956b6b Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Fri, 10 Jan 2014 12:10:31 -0800 Subject: diff test: reading a directory as a file need not error out There is no guarantee that strbuf_read_file must error out for directories. On some operating systems (e.g., Debian GNU/kFreeBSD wheezy), reading a directory gives its raw content: $ head -c5 < / | cat -A ^AM-|^_^@^L$ As a result, 'git diff -O/' succeeds instead of erroring out on these systems, causing t4056.5 "orderfile is a directory" to fail. On some weird OS it might even make sense to pass a directory to the -O option and this is not a common user mistake that needs catching. Remove the test. Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- t/t4056-diff-order.sh | 4 ---- 1 file changed, 4 deletions(-) (limited to 't/t4056-diff-order.sh') diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh index 1ddd226b78..9e2b29ede5 100755 --- a/t/t4056-diff-order.sh +++ b/t/t4056-diff-order.sh @@ -68,10 +68,6 @@ test_expect_success POSIXPERM,SANITY 'unreadable orderfile' ' test_must_fail git diff -Ounreadable_file --name-only HEAD^..HEAD ' -test_expect_success 'orderfile is a directory' ' - test_must_fail git diff -O/ --name-only HEAD^..HEAD -' - for i in 1 2 do test_expect_success "orderfile using option ($i)" ' -- cgit v1.2.1