summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9d7d10e)
raw | patch | inline | side by side (parent: 9d7d10e)
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | |
Wed, 15 Dec 2010 15:02:46 +0000 (22:02 +0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Thu, 16 Dec 2010 21:20:23 +0000 (13:20 -0800) |
never_interesting optimization is disabled if there is any wildcard
pathspec, even if it only matches exactly on trees.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
pathspec, even if it only matches exactly on trees.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h | patch | blob | history | |
dir.c | patch | blob | history | |
t/t4010-diff-pathspec.sh | patch | blob | history | |
tree-walk.c | patch | blob | history | |
tree-walk.h | patch | blob | history |
index b110775bf337eb534b6896cec90c99ccdccb257f..dc0bfb4d78dbb28572f4948725474e4ccc62b8ad 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -496,11 +496,13 @@ extern int ie_modified(const struct index_state *, struct cache_entry *, struct
struct pathspec {
const char **raw; /* get_pathspec() result, not freed by free_pathspec() */
int nr;
+ int has_wildcard:1;
int recursive:1;
int max_depth;
struct pathspec_item {
const char *match;
int len;
+ int has_wildcard:1;
} *items;
};
index aa0522dc49a07a2925a1b29a2dfaa59f76afff75..66c163f4f5b12a367cbcbf63c422ed850d0cfba0 100644 (file)
--- a/dir.c
+++ b/dir.c
item->match = path;
item->len = strlen(path);
+ item->has_wildcard = !no_wildcard(path);
+ if (item->has_wildcard)
+ pathspec->has_wildcard = 1;
}
qsort(pathspec->items, pathspec->nr,
index 94df7ae53a0ef47c0ef10ca6b3215ffdf38fa399..4b120f8e23f92cd51f64d5a2ed8c3f37d31ec421 100755 (executable)
--- a/t/t4010-diff-pathspec.sh
+++ b/t/t4010-diff-pathspec.sh
test_cmp expected current
'
+EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+
+test_expect_success 'diff-tree with wildcard shows dir also matches' '
+ git diff-tree --name-only $EMPTY_TREE $tree -- "f*" >result &&
+ echo file0 >expected &&
+ test_cmp expected result
+'
+
+test_expect_success 'diff-tree -r with wildcard' '
+ git diff-tree -r --name-only $EMPTY_TREE $tree -- "*file1" >result &&
+ echo path1/file1 >expected &&
+ test_cmp expected result
+'
+
test_done
diff --git a/tree-walk.c b/tree-walk.c
index 93b05a744282d2311191975eb45ffbb9c2f7fdc5..cc5a4e1f44b0fb18d191ef64376fa318b0a171d1 100644 (file)
--- a/tree-walk.c
+++ b/tree-walk.c
* - negative for "no, and no subsequent entries will be either"
*/
int tree_entry_interesting(const struct name_entry *entry,
- const struct strbuf *base,
+ struct strbuf *base,
const struct pathspec *ps)
{
int i;
int pathlen, baselen = base->len;
- int never_interesting = -1;
+ int never_interesting = ps->has_wildcard ? 0 : -1;
if (!ps->nr) {
if (!ps->recursive || ps->max_depth == -1)
if (baselen >= matchlen) {
/* If it doesn't match, move along... */
if (!match_dir_prefix(base->buf, baselen, match, matchlen))
- continue;
+ goto match_wildcards;
if (!ps->recursive || ps->max_depth == -1)
return 2;
&never_interesting))
return 1;
}
+
+match_wildcards:
+ if (!ps->items[i].has_wildcard)
+ continue;
+
+ /*
+ * Concatenate base and entry->path into one and do
+ * fnmatch() on it.
+ */
+
+ strbuf_add(base, entry->path, pathlen);
+
+ if (!fnmatch(match, base->buf, 0)) {
+ strbuf_setlen(base, baselen);
+ return 1;
+ }
+ strbuf_setlen(base, baselen);
+
+ /*
+ * Match all directories. We'll try to match files
+ * later on.
+ */
+ if (ps->recursive && S_ISDIR(entry->mode))
+ return 1;
}
return never_interesting; /* No matches */
}
diff --git a/tree-walk.h b/tree-walk.h
index f81c232b5ad9cbe8cb2489e3c221c32cf06283b1..6589ee27e4047d5c8d1636de72250a864cf42b6b 100644 (file)
--- a/tree-walk.h
+++ b/tree-walk.h
return info->pathlen + tree_entry_len(n->path, n->sha1);
}
-extern int tree_entry_interesting(const struct name_entry *, const struct strbuf *, const struct pathspec *ps);
+extern int tree_entry_interesting(const struct name_entry *, struct strbuf *, const struct pathspec *ps);
#endif