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

[PATCH v4] test_dir_is_empty: fix edge cases with newlines and hyphens

From
William Chargin <wchargin@gmail.com>
Date
Sep 12, 2018, 18:35 UTC
Message-ID
<20180912183534.7486-1-wchargin@gmail.com>
In-Reply-To
<CAPig+cQSg-t6KGj3s0LJi+FU7LSQMNTmSHhMJJH=PgMUU9GWOA@mail.gmail.com>

While the `test_dir_is_empty` function appears correct in most normal use cases, it can improperly pass if a directory contains a filename with a newline, and can improperly fail if an empty directory looks like an argument to `ls`. This patch changes the implementation to check that the output of `ls -a` has at most two lines (for `.` and `..`), which should be better behaved, and adds the `--` delimiter before the directory name when invoking `ls`.

The newly added unit test fails before this change and passes after it.
Signed-off-by: William Chargin <wchargin@gmail.com>
---
This patch depends on "t: factor out FUNNYNAMES as shared lazy prereq"
(2018-08-06), which is now in master.

I originally wrote this patch for the standalone Sharness library, but that library advises that such patches be sent to the Git mailing list first.

Tested on GNU/Linux (Mint 18.2) and macOS (10.13).
 t/t0000-basic.sh        | 43 +++++++++++++++++++++++++++++++++++++++++
 t/test-lib-functions.sh |  2 +-
 2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/t/t0000-basic.sh b/t/t0000-basic.sh
index 850f651e4e..a5c57c6aa5 100755
--- a/t/t0000-basic.sh
+++ b/t/t0000-basic.sh
@@ -821,6 +821,49 @@ test_expect_success 'tests clean up even on failures' "
 	EOF
 "
 
+test_expect_success FUNNYNAMES \
+	'test_dir_is_empty behaves even in pathological cases' "
+	run_sub_test_lib_test \
+		dir-empty 'behavior of test_dir_is_empty' <<-\\EOF &&
+	test_expect_success 'should pass with actually empty directory' '
+		mkdir empty_dir &&
+		test_dir_is_empty empty_dir
+	'
+	test_expect_success 'should fail with a normal filename' '
+		mkdir nonempty_dir &&
+		>nonempty_dir/some_file &&
+		! test_dir_is_empty nonempty_dir
+	'
+	test_expect_success 'should fail with dot-newline-dot filename' '
+		mkdir pathological_dir &&
+		>\"pathological_dir/.
+	.\" &&
+		! test_dir_is_empty pathological_dir
+	'
+	test_expect_success 'should pass with an empty directory \"-l\"' '
+		mkdir -- -l &&
+		test_dir_is_empty -l &&
+		rmdir -- -l
+	'
+	test_expect_success 'should pass with an empty directory \"--wat\"' '
+		mkdir -- --wat &&
+		test_dir_is_empty --wat &&
+		rmdir -- --wat
+	'
+	test_done
+	EOF
+	check_sub_test_lib_test dir-empty <<-\\EOF
+	> ok 1 - should pass with actually empty directory
+	> ok 2 - should fail with a normal filename
+	> ok 3 - should fail with dot-newline-dot filename
+	> ok 4 - should pass with an empty directory \"-l\"
+	> ok 5 - should pass with an empty directory \"--wat\"
+	> # passed all 5 test(s)
+	> 1..5
+	EOF
+"
+
+
 ################################################################
 # Basics of the basics
 
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index 4207af4077..3df6b8027f 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -576,7 +576,7 @@ test_path_exists () {
 # Check if the directory exists and is empty as expected, barf otherwise.
 test_dir_is_empty () {
 	test_path_is_dir "$1" &&
-	if test -n "$(ls -a1 "$1" | egrep -v '^\.\.?$')"
+	if test "$(ls -a1 -- "$1" | wc -l)" -gt 2
 	then
 		echo "Directory '$1' is not empty, it contains:"
 		ls -la "$1"
-- 
2.18.0.549.gd66323a05
Previous: Eric SunshineNext: Junio C Hamano
Message 13 of 23 in “t/test-lib: make `test_dir_is_empty` more robust”
  1. 0/1 t/test-lib: make `test_dir_is_empty` more robustWilliam Chargin, Aug 5, 2018
  2. 1/1 t/test-lib: make `test_dir_is_empty` more robustWilliam Chargin, Aug 5, 2018
  3. Jonathan NiederAug 5, 2018
  4. Eric SunshineAug 5, 2018
  5. Jeff KingAug 5, 2018
  6. Jeff KingAug 6, 2018
  7. Eric SunshineAug 6, 2018
  8. William CharginAug 12, 2018
  9. test_dir_is_empty: properly detect files with newline in nameWilliam Chargin, Aug 12, 2018
  10. Eric SunshineAug 12, 2018
  11. William CharginAug 12, 2018
  12. Eric SunshineAug 12, 2018
  13. test_dir_is_empty: fix edge cases with newlines and hyphensWilliam Chargin, Sep 12, 2018
  14. Junio C HamanoSep 12, 2018
  15. test_dir_is_empty: fix edge cases with newlines and hyphensWilliam Chargin, Sep 12, 2018
  16. William CharginAug 5, 2018
  17. Jonathan NiederAug 5, 2018
  18. Junio C HamanoAug 5, 2018
  19. Jonathan NiederAug 5, 2018
  20. Jonathan NiederAug 5, 2018
  21. William CharginAug 5, 2018
  22. t/test-lib: make `test_dir_is_empty` more robustWilliam Chargin, Aug 5, 2018
  23. Johannes SixtAug 5, 2018

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.