summaryrefslogtreecommitdiff
path: root/tree-walk.c
diff options
context:
space:
mode:
authorLibravatar Nguyễn Thái Ngọc Duy <pclouds@gmail.com>2010-12-15 22:02:44 +0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2011-02-03 14:08:30 -0800
commitbc96cc87dbb229cbdabfd93391e24ef168713a74 (patch)
tree9ff90a888efab369476fe4003fe1e36fa0fbd9ba /tree-walk.c
parenttree_entry_interesting(): refactor into separate smaller functions (diff)
downloadtgif-bc96cc87dbb229cbdabfd93391e24ef168713a74.tar.xz
tree_entry_interesting(): support depth limit
This is needed to replace pathspec_matches() in builtin/grep.c. max_depth == -1 means infinite depth. Depth limit is only effective when pathspec.recursive == 1. When pathspec.recursive == 0, the behavior depends on match functions: non-recursive for tree_entry_interesting() and recursive for match_pathspec{,_depth} Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'tree-walk.c')
-rw-r--r--tree-walk.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/tree-walk.c b/tree-walk.c
index 83bede9527..33feafa964 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -1,6 +1,7 @@
#include "cache.h"
#include "tree-walk.h"
#include "unpack-trees.h"
+#include "dir.h"
#include "tree.h"
static const char *get_mode(const char *str, unsigned int *modep)
@@ -559,8 +560,13 @@ int tree_entry_interesting(const struct name_entry *entry,
int pathlen, baselen = base->len;
int never_interesting = -1;
- if (!ps || !ps->nr)
- return 2;
+ if (!ps->nr) {
+ if (!ps->recursive || ps->max_depth == -1)
+ return 2;
+ return !!within_depth(base->buf, baselen,
+ !!S_ISDIR(entry->mode),
+ ps->max_depth);
+ }
pathlen = tree_entry_len(entry->path, entry->sha1);
@@ -573,7 +579,14 @@ int tree_entry_interesting(const struct name_entry *entry,
/* If it doesn't match, move along... */
if (!match_dir_prefix(base->buf, baselen, match, matchlen))
continue;
- return 2;
+
+ if (!ps->recursive || ps->max_depth == -1)
+ return 2;
+
+ return !!within_depth(base->buf + matchlen + 1,
+ baselen - matchlen - 1,
+ !!S_ISDIR(entry->mode),
+ ps->max_depth);
}
/* Does the base match? */