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

Re: [PATCH 1/1] t/test-lib: make `test_dir_is_empty` more robust

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Aug 5, 2018, 04:19 UTC
Message-ID
<20180805041956.GI258270@aiede.svl.corp.google.com>
In-Reply-To
<20180805022002.28907-2-wchargin@gmail.com>
Hi,
William Chargin wrote:
> Subject: t/test-lib: make `test_dir_is_empty` more robust

This subject line will appear out of context in "git shortlog" output, so it's useful to pack in enough information to briefly summarize what the change does. How about something like

	test_dir_is_empty: avoid being confused by $'.\n.' file
or
	test_dir_is_empty: simplify by using "ls --almost-all"
?
[...]
> +	test_expect_success 'should fail with dot-newline-dot filename' '
> +		mkdir pathological_dir &&
> +		printf \"pathological_dir/.\\\\n.\\\\0\" | xargs -0 touch &&

I don't think "xargs -0" is present on all supported platforms. I'd be tempted to use

		>pathological_dir/$'.\n.'

but $'' is too recent of a shell feature to count on (e.g., dash doesn't support it). See t/t3600-rm.sh for an example of a portable way to do this.

Not all filesystems support newlines in filenames. I think we'd want to factor out the FUNNYNAMES prereq from there into a test_lazy_prereq so this test can be skipped on such filenames.

[...]
Show 8 quoted lines
> --- a/t/test-lib-functions.sh
> +++ b/t/test-lib-functions.sh
> @@ -568,7 +568,7 @@ test_path_is_dir () {
>  # 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 -c)" != 0

Another portability gotcha: wc output includes a space on Mac so this test would always return true there. How about

	if test -n "$(ls -A1 "$1")"
?
"ls -A" was added in POSIX.1-2017.  Its rationale section explains
	Earlier versions of this standard did not describe the BSD -A
	option (like -a, but dot and dot-dot are not written out). It
	has been added due to widespread implementation.

That's very recent, but the widespread implementation it mentions is less so. This would be our first use of "ls -A", so I'd be interested to hear from people on more obscure platforms. It does seem to be widespread.

Can you say a little more about where you ran into this? Did you discover it by code inspection?

I do think the resulting implementation using -A is simpler. Thanks for writing it.

Thanks and hope that helps, Jonathan

Previous: William CharginNext: Eric Sunshine
Message 3 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.