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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.