summaryrefslogtreecommitdiff
path: root/wildmatch.c
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2012-10-15 06:26:01 (GMT)
committerJunio C Hamano <gitster@pobox.com>2012-10-15 21:58:18 (GMT)
commit4c251e5cb5c245ee3bb98c7cedbe944df93e45f4 (patch)
treeaefc5e6b1218874ae0e9559c428844b212de091d /wildmatch.c
parent40bbee0ab07d0ee4f21b11d597c878245c1b05a6 (diff)
downloadgit-4c251e5cb5c245ee3bb98c7cedbe944df93e45f4.zip
git-4c251e5cb5c245ee3bb98c7cedbe944df93e45f4.tar.gz
git-4c251e5cb5c245ee3bb98c7cedbe944df93e45f4.tar.bz2
wildmatch: make /**/ match zero or more directories
"foo/**/bar" matches "foo/x/bar", "foo/x/y/bar"... but not "foo/bar". We make a special case, when foo/**/ is detected (and "foo/" part is already matched), try matching "bar" with the rest of the string. "Match one or more directories" semantics can be easily achieved using "foo/*/**/bar". This also makes "**/foo" match "foo" in addition to "x/foo", "x/y/foo".. 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 'wildmatch.c')
-rw-r--r--wildmatch.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/wildmatch.c b/wildmatch.c
index 85bc0df..3972e26 100644
--- a/wildmatch.c
+++ b/wildmatch.c
@@ -90,6 +90,18 @@ static int dowild(const uchar *p, const uchar *text, int force_lower_case)
if ((prev_p == text || *prev_p == '/') ||
(*p == '\0' || *p == '/' ||
(p[0] == '\\' && p[1] == '/'))) {
+ /*
+ * Assuming we already match 'foo/' and are at
+ * <star star slash>, just assume it matches
+ * nothing and go ahead match the rest of the
+ * pattern with the remaining string. This
+ * helps make foo/<*><*>/bar (<> because
+ * otherwise it breaks C comment syntax) match
+ * both foo/bar and foo/a/bar.
+ */
+ if (p[0] == '/' &&
+ dowild(p + 1, text, force_lower_case) == MATCH)
+ return MATCH;
special = TRUE;
} else
return ABORT_MALFORMED;