summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2020-11-26 21:47:31 -0500
committerTavian Barnes <tavianator@tavianator.com>2020-11-28 11:33:18 -0500
commitc7c8a03a3783cfeb342f033a7cac0dcbe948bbb9 (patch)
treed41b20ca530e8193b83d5046cb677c0bdd845649 /eval.c
parent457fcee54828527ee2a6819cac2b51892b673069 (diff)
downloadbfs-c7c8a03a3783cfeb342f033a7cac0dcbe948bbb9.tar.xz
eval: Make -hidden behave consistently
Previously there was an unexpected difference between $ bfs .hidden -hidden and $ bfs ./.hidden -hidden ./.hidden The intent of the code was to avoid considering `.`, the default starting point, as hidden and thus pruning a whole search with -nohidden. Fix it to do that explicitly, and handle `..` too.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/eval.c b/eval.c
index 0503b14..bb93c12 100644
--- a/eval.c
+++ b/eval.c
@@ -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;
}
/**