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
William Chargin <wchargin@gmail.com>
Date
Aug 5, 2018, 05:24 UTC
Message-ID
<CAFW+GMBrRUQ88XZzLMVAiEGDjLDwLaW6Qi1mSGrXYHoSu8iJag@mail.gmail.com>
In-Reply-To
<20180805041956.GI258270@aiede.svl.corp.google.com>
Hi,
> 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.

I'm happy to do so. I think that "simplify" is misleading, because this is a bug fix, not a refactoring. I like your first suggestion, though it exceeds the 50-character soft limit. What do you think of:

        test_dir_is_empty: find files with newline in name
?
> I don't think "xargs -0" is present on all supported platforms

Wow---I'm shocked that it's not POSIX, but you're right. (That makes `xargs` so much less useful!)

t/t3600-rm.sh seems to just literally embed the newline into the argument to `touch`. I can do that. (I intentionally avoided $'' for the reason that you mention.)

> 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.

This makes sense. Would you like me to send in a separate patch to add this `test_lazy_prereq` to `t/test-lib.sh`, fixing up existing uses (of which there are several), and then rebase this patch on top of it?

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

That's good to know. I can use `test -n "$(ls -A1 "$1")"` as you suggest, although...

Show 5 quoted lines
> "ls -A" was added in POSIX.1-2017. [...]
> 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.

...if you prefer, a variant of `test "$(ls -a1 | wc -l)" -eq 2` should satisfy all the crtieria that you mention above (POSIX since forever, should work on Mac). The assumption is that a file with a newline character may take up more than one line, but every file must take up _at least_ one line, and we get two lines from `.` and `..`. If this assumption is false, then I will have learned yet another new thing!

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

Sure. Yes. I have a build script that accepts a target output directory, and rejects if the directory is nonempty. I used `ls -A | wc -l` to implement this check. When testing the script with Sharness, I ran across `test_dir_is_empty`. I was curious about the implementation, having recently implemented the same test myself. The `egrep` in the implementation stood out to me as suspicious, and so it was easy to come up with an explicit counterexample.

> I do think the resulting implementation using -A is simpler.  Thanks
> for writing it.
You're welcome. Thank you for the detailed and helpful review.

Best, WC

Previous: William CharginNext: Jonathan Nieder
Message 16 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.