diff options
-rw-r--r-- | eval.c | 9 | ||||
-rwxr-xr-x | tests.sh | 6 | ||||
-rw-r--r-- | tests/test_hidden_root.out | 5 |
3 files changed, 19 insertions, 1 deletions
@@ -467,7 +467,14 @@ bool eval_fstype(const struct expr *expr, struct eval_state *state) { */ bool eval_hidden(const struct expr *expr, struct eval_state *state) { const struct BFTW *ftwbuf = state->ftwbuf; - return ftwbuf->nameoff > 0 && ftwbuf->path[ftwbuf->nameoff] == '.'; + const char *name = ftwbuf->path + ftwbuf->nameoff; + + // Don't treat "." or ".." as hidden directories. Otherwise we'd filter + // out everything when given + // + // $ bfs . -nohidden + // $ bfs .. -nohidden + return name[0] == '.' && strcmp(name, ".") != 0 && strcmp(name, "..") != 0; } /** @@ -681,6 +681,7 @@ bfs_tests=( test_help test_hidden + test_hidden_root test_newerma_nonexistent test_newermt_invalid @@ -1890,6 +1891,11 @@ function test_hidden() { bfs_diff weirdnames -hidden } +function test_hidden_root() { + cd weirdnames + bfs_diff . ./. ... ./... .../.. -hidden +} + function test_nohidden() { bfs_diff weirdnames -nohidden } diff --git a/tests/test_hidden_root.out b/tests/test_hidden_root.out new file mode 100644 index 0000000..199ae5f --- /dev/null +++ b/tests/test_hidden_root.out @@ -0,0 +1,5 @@ +... +./... +./... +.../../... +././... |