From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>,
"Jean-Noël AVILA" <avila.jn@gmail.com>
Subject: Re: [regression?] trailing slash required in .gitattributes
Date: Sat, 23 Mar 2013 04:39:29 -0400 [thread overview]
Message-ID: <20130323083927.GA25600@sigill.intra.peff.net> (raw)
In-Reply-To: <7vzjxv3uef.fsf@alter.siamese.dyndns.org>
On Fri, Mar 22, 2013 at 04:08:08PM -0700, Junio C Hamano wrote:
> Jeff King <peff@peff.net> writes:
>
> > if (pathlen && pathname[pathlen-1] == '/')
> > pathlen--;
> >
> > would work. But it seems that match_basename, despite taking the length
> > of all of the strings we pass it, will happily use NUL-terminated
> > functions like strcmp or fnmatch. Converting the former to check lengths
> > should be pretty straightforward. But there is no version of fnmatch
> > that does what we want. I wonder if we using wildmatch can get around
> > this limitation.
>
> Or save away pathname[pathlen], temporarily NUL terminate and call
> these functions?
Yeah, that is a possibility, though it involves casting away some
constness. Patch is below, which seems to work.
It still feels really ugly to me, and like match_basename is misdesigned
and should respect the lengths we pass it. Also, if it does respect the
lengths, it should be able to go much faster (e.g., in the common case,
we can drop a ton of strcmp_icase calls if we just check the lengths
beforehand). I feel like Duy was working on something like this
recently, but I don't see anything in pu.
---
diff --git a/attr.c b/attr.c
index e2f9377..bd00a78 100644
--- a/attr.c
+++ b/attr.c
@@ -663,20 +663,58 @@ static int path_matches(const char *pathname, int pathlen,
{
const char *pattern = pat->pattern;
int prefix = pat->nowildcardlen;
+ char path_munge = 0;
+ char pattern_munge = 0;
+ int ret;
if ((pat->flags & EXC_FLAG_MUSTBEDIR) &&
((!pathlen) || (pathname[pathlen-1] != '/')))
return 0;
+ /*
+ * Drop trailing slash from path, as we would want
+ * an unadorned pattern like "foo" to match both the
+ * file "foo" and the directory "foo/".
+ */
+ if (pathlen && pathname[pathlen-1] == '/') {
+ pathlen--;
+
+ /*
+ * The match_* functions, despite taking a string length, will
+ * happily read all the way up to the NUL-terminating character.
+ * So we must not only shrink pathlen, but munge the buffer
+ * to NUL-terminate it.
+ */
+ path_munge = pathname[pathlen];
+ ((char *)pathname)[pathlen] = '\0';
+ }
+
+ /*
+ * The pattern up to patternlen will not include a
+ * trailing slash, but it may still be present in the string.
+ * And since the match_* functions will read up to the NUL,
+ * we need to terminate the buffer.
+ */
+ pattern_munge = pattern[pat->patternlen];
+ ((char *)pattern)[pat->patternlen] = '\0';
+
if (pat->flags & EXC_FLAG_NODIR) {
- return match_basename(basename,
- pathlen - (basename - pathname),
- pattern, prefix,
- pat->patternlen, pat->flags);
- }
- return match_pathname(pathname, pathlen,
- base, baselen,
- pattern, prefix, pat->patternlen, pat->flags);
+ ret = match_basename(basename,
+ pathlen - (basename - pathname),
+ pattern, prefix,
+ pat->patternlen, pat->flags);
+ }
+ else {
+ ret = match_pathname(pathname, pathlen,
+ base, baselen,
+ pattern, prefix,
+ pat->patternlen, pat->flags);
+ }
+
+ if (path_munge)
+ ((char *)pathname)[pathlen] = path_munge;
+ ((char *)pattern)[pat->patternlen] = pattern_munge;
+ return ret;
}
static int macroexpand_one(int attr_nr, int rem);
diff --git a/t/t5002-archive-attr-pattern.sh b/t/t5002-archive-attr-pattern.sh
index 0c847fb..3be809c 100755
--- a/t/t5002-archive-attr-pattern.sh
+++ b/t/t5002-archive-attr-pattern.sh
@@ -27,6 +27,10 @@ test_expect_success 'setup' '
echo ignored-only-if-dir/ export-ignore >>.git/info/attributes &&
git add ignored-only-if-dir &&
+ mkdir -p ignored-without-slash &&
+ echo ignored without slash >ignored-without-slash/foo &&
+ git add ignored-without-slash/foo &&
+ echo ignored-without-slash export-ignore >>.git/info/attributes &&
mkdir -p one-level-lower/two-levels-lower/ignored-only-if-dir &&
echo ignored by ignored dir >one-level-lower/two-levels-lower/ignored-only-if-dir/ignored-by-ignored-dir &&
@@ -49,6 +53,8 @@ test_expect_missing archive/ignored-ony-if-dir/ignored-by-ignored-dir
test_expect_exists archive/not-ignored-dir/
test_expect_missing archive/ignored-only-if-dir/
test_expect_missing archive/ignored-ony-if-dir/ignored-by-ignored-dir
+test_expect_missing archive/ignored-without-slash/ &&
+test_expect_missing archive/ignored-without-slash/foo &&
test_expect_exists archive/one-level-lower/
test_expect_missing archive/one-level-lower/two-levels-lower/ignored-only-if-dir/
test_expect_missing archive/one-level-lower/two-levels-lower/ignored-ony-if-dir/ignored-by-ignored-dir
next prev parent reply other threads:[~2013-03-23 8:40 UTC|newest]
Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-19 17:57 [regression?] trailing slash required in .gitattributes Jeff King
2013-03-19 18:10 ` Junio C Hamano
2013-03-19 18:10 ` Jeff King
2013-03-22 22:24 ` Jeff King
2013-03-22 23:08 ` Junio C Hamano
2013-03-23 8:39 ` Jeff King [this message]
2013-03-24 5:25 ` Junio C Hamano
2013-03-26 18:39 ` [PATCH 0/4] attribute regression fix for maint-1.8.1 and upward Junio C Hamano
2013-03-26 18:39 ` [PATCH 1/4] attr.c::path_matches(): the basename is part of the pathname Junio C Hamano
2013-03-26 18:49 ` Jeff King
2013-03-27 1:40 ` Duy Nguyen
2013-03-26 18:39 ` [PATCH 2/4] dir.c::match_basename(): pay attention to the length of string parameters Junio C Hamano
2013-03-26 18:55 ` Jeff King
2013-03-26 20:39 ` Jeff King
2013-03-26 20:49 ` Junio C Hamano
2013-03-26 21:29 ` Jeff King
2013-03-26 22:33 ` Junio C Hamano
2013-03-27 1:04 ` Jeff King
2013-03-26 18:39 ` [PATCH 3/4] attr.c::path_matches(): special case paths that end with a slash Junio C Hamano
2013-03-26 19:05 ` Jeff King
2013-03-26 21:33 ` Jeff King
2013-03-27 1:30 ` Duy Nguyen
2013-03-28 19:49 ` Jeff King
2013-03-26 18:39 ` [PATCH 4/4] make sure a pattern without trailing slash matches a directory Junio C Hamano
2013-03-26 19:08 ` Jeff King
2013-03-27 1:13 ` [PATCH 0/4] attribute regression fix for maint-1.8.1 and upward Duy Nguyen
2013-03-27 3:57 ` Junio C Hamano
2013-03-27 4:01 ` Duy Nguyen
2013-03-28 21:43 ` [PATCH v2 0/6] " Jeff King
2013-03-28 21:45 ` [PATCH 1/6] attr.c::path_matches(): the basename is part of the pathname Jeff King
2013-03-28 21:47 ` [PATCH 2/6] dir.c::match_basename(): pay attention to the length of string parameters Jeff King
2013-03-28 22:40 ` Jeff King
2013-03-28 22:49 ` Jeff King
2013-03-28 23:10 ` Junio C Hamano
2013-03-28 23:40 ` Duy Nguyen
2013-03-29 1:25 ` Duy Nguyen
2013-03-29 3:02 ` Jeff King
2013-03-29 5:57 ` Junio C Hamano
2013-03-28 21:47 ` [PATCH 3/6] dir.c::match_pathname(): adjust patternlen when shifting pattern Jeff King
2013-03-28 21:48 ` [PATCH 4/6] dir.c::match_pathname(): pay attention to the length of string parameters Jeff King
2013-03-28 22:30 ` Junio C Hamano
2013-03-29 8:45 ` Duy Nguyen
2013-03-29 10:03 ` Duy Nguyen
2013-03-29 11:32 ` Torsten Bögershausen
2013-03-29 11:37 ` Duy Nguyen
2013-03-29 12:05 ` Jeff King
2013-03-29 13:02 ` Duy Nguyen
2013-03-29 16:44 ` Junio C Hamano
2013-03-29 17:04 ` Jeff King
2013-03-29 17:35 ` Junio C Hamano
2013-03-29 17:44 ` Jeff King
2013-03-30 1:40 ` Duy Nguyen
2013-03-28 21:49 ` [PATCH 5/6] attr.c::path_matches(): special case paths that end with a slash Jeff King
2013-03-28 21:50 ` [PATCH 6/6] t: check that a pattern without trailing slash matches a directory Jeff King
2013-03-28 22:21 ` Eric Sunshine
2013-03-28 22:22 ` Jeff King
2013-03-23 4:18 ` [regression?] trailing slash required in .gitattributes Duy Nguyen
2013-03-23 4:43 ` Duy Nguyen
2013-03-25 6:05 ` [PATCH 0/4] attr directory matching regression Nguyễn Thái Ngọc Duy
2013-03-25 6:05 ` [PATCH 1/4] wildmatch: do not require "text" to be NUL-terminated Nguyễn Thái Ngọc Duy
2013-03-25 6:05 ` [PATCH 2/4] attr.c: fix pattern{,len} inconsistency in struct match_attr Nguyễn Thái Ngọc Duy
2013-03-25 6:05 ` [PATCH 3/4] dir.c: make match_{base,path}name respect {basename,path}len Nguyễn Thái Ngọc Duy
2013-03-25 6:05 ` [PATCH 4/4] attr.c: fix matching "subdir" without the trailing slash Nguyễn Thái Ngọc Duy
2013-03-25 7:20 ` Duy Nguyen
2013-03-25 9:24 ` Duy Nguyen
2013-03-26 15:10 ` [PATCH 0/4] attr directory matching regression Junio C Hamano
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=20130323083927.GA25600@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=avila.jn@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.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).