From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH v5 11/12] wildmatch: make /**/ match zero or more directories
Date: Sun, 14 Oct 2012 09:35:09 +0700 [thread overview]
Message-ID: <1350182110-25936-12-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1350182110-25936-1-git-send-email-pclouds@gmail.com>
"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>
---
t/t3070-wildmatch.sh | 8 +++++++-
wildmatch.c | 17 +++++++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh
index 15848d5..e6ad6f4 100755
--- a/t/t3070-wildmatch.sh
+++ b/t/t3070-wildmatch.sh
@@ -63,11 +63,17 @@ match 1 1 ']' ']'
match 0 0 'foo/baz/bar' 'foo*bar'
match 0 0 'foo/baz/bar' 'foo**bar'
match 0 1 'foobazbar' 'foo**bar'
+match 1 1 'foo/baz/bar' 'foo/**/bar'
+match 1 0 'foo/baz/bar' 'foo/**/**/bar'
+match 1 0 'foo/b/a/z/bar' 'foo/**/bar'
+match 1 0 'foo/b/a/z/bar' 'foo/**/**/bar'
+match 1 0 'foo/bar' 'foo/**/bar'
+match 1 0 'foo/bar' 'foo/**/**/bar'
match 0 0 'foo/bar' 'foo?bar'
match 0 0 'foo/bar' 'foo[/]bar'
match 0 0 'foo/bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r'
match 1 1 'foo-bar' 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r'
-match 0 0 'foo' '**/foo'
+match 1 0 'foo' '**/foo'
match 1 x '/foo' '**/foo'
match 1 0 'bar/baz/foo' '**/foo'
match 0 0 'bar/baz/foo' '*/foo'
diff --git a/wildmatch.c b/wildmatch.c
index 7209f26..35c34ac 100644
--- a/wildmatch.c
+++ b/wildmatch.c
@@ -90,6 +90,23 @@ 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.
+ *
+ * Crazy patterns like /<*><*>/<*><*>/ are
+ * treated like /<*><*>/. But undefined
+ * behavior is even appropriate for people
+ * writing such a pattern.
+ */
+ if (p[0] == '/' &&
+ dowild(p + 1, text, force_lower_case) == MATCH)
+ return MATCH;
special = TRUE;
} else
return ABORT_MALFORMED;
--
1.8.0.rc2.11.g2b79d01
next prev parent reply other threads:[~2012-10-14 2:36 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-14 2:34 [PATCH v5 00/12] nd/wildmatch Nguyễn Thái Ngọc Duy
2012-10-14 2:34 ` [PATCH v5 01/12] ctype: make sane_ctype[] const array Nguyễn Thái Ngọc Duy
2012-10-14 2:35 ` [PATCH v5 02/12] ctype: support iscntrl, ispunct, isxdigit and isprint Nguyễn Thái Ngọc Duy
2012-10-14 5:02 ` Junio C Hamano
2012-10-14 5:07 ` Nguyen Thai Ngoc Duy
2012-10-14 12:59 ` René Scharfe
2012-10-14 13:25 ` Nguyen Thai Ngoc Duy
2012-10-14 13:59 ` René Scharfe
2012-10-14 14:26 ` Nguyen Thai Ngoc Duy
2012-10-17 12:09 ` "Jan H. Schönherr"
2012-10-17 12:26 ` Nguyen Thai Ngoc Duy
2012-11-13 10:46 ` [PATCH nd/wildmatch] Correct Git's version of isprint and isspace Nguyễn Thái Ngọc Duy
2012-11-13 18:58 ` "Jan H. Schönherr"
2012-11-13 19:14 ` René Scharfe
2012-11-13 19:15 ` René Scharfe
2012-11-13 19:40 ` Linus Torvalds
2012-11-13 19:50 ` Linus Torvalds
2012-11-14 19:30 ` René Scharfe
2012-11-13 19:41 ` Johannes Sixt
2012-11-15 12:19 ` [PATCH] wildmatch: correct " Nguyễn Thái Ngọc Duy
2012-11-15 17:13 ` "Jan H. Schönherr"
2012-11-16 4:19 ` Nguyen Thai Ngoc Duy
2012-10-14 2:35 ` [PATCH v5 03/12] Import wildmatch from rsync Nguyễn Thái Ngọc Duy
2012-10-14 2:35 ` [PATCH v5 04/12] wildmatch: remove unnecessary functions Nguyễn Thái Ngọc Duy
2012-10-14 5:04 ` Junio C Hamano
2012-10-14 6:29 ` Nguyen Thai Ngoc Duy
2012-10-14 2:35 ` [PATCH v5 05/12] Integrate wildmatch to git Nguyễn Thái Ngọc Duy
2012-10-14 5:06 ` Junio C Hamano
2012-10-14 11:07 ` Torsten Bögershausen
2012-10-14 2:35 ` [PATCH v5 06/12] t3070: disable unreliable fnmatch tests Nguyễn Thái Ngọc Duy
2012-10-14 2:35 ` [PATCH v5 07/12] wildmatch: make wildmatch's return value compatible with fnmatch Nguyễn Thái Ngọc Duy
2012-10-14 5:09 ` Junio C Hamano
2012-10-14 2:35 ` [PATCH v5 08/12] wildmatch: remove static variable force_lower_case Nguyễn Thái Ngọc Duy
2012-10-14 2:35 ` [PATCH v5 09/12] wildmatch: fix case-insensitive matching Nguyễn Thái Ngọc Duy
2012-10-14 2:35 ` [PATCH v5 10/12] wildmatch: adjust "**" behavior Nguyễn Thái Ngọc Duy
2012-10-14 2:35 ` Nguyễn Thái Ngọc Duy [this message]
2012-10-14 2:35 ` [PATCH v5 12/12] Support "**" wildcard in .gitignore and .gitattributes Nguyễn Thái Ngọc Duy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1350182110-25936-12-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).