From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com
Cc: bmwill@google.com, pclouds@gmail.com, git@vger.kernel.org,
Stefan Beller <sbeller@google.com>
Subject: [PATCHv2 18/36] attr: support quoting pathname patterns in C style
Date: Fri, 28 Oct 2016 11:54:44 -0700 [thread overview]
Message-ID: <20161028185502.8789-19-sbeller@google.com> (raw)
In-Reply-To: <20161028185502.8789-1-sbeller@google.com>
From: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Full pattern must be quoted. So 'pat"t"ern attr' will give exactly
'pat"t"ern', not 'pattern'. Also clarify that leading whitespaces are
not part of the pattern and document comment syntax.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
---
Documentation/gitattributes.txt | 8 +++++---
attr.c | 15 +++++++++++++--
t/t0003-attributes.sh | 26 ++++++++++++++++++++++++++
3 files changed, 44 insertions(+), 5 deletions(-)
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index 7aff940202..8a061af0cc 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -21,9 +21,11 @@ Each line in `gitattributes` file is of form:
pattern attr1 attr2 ...
That is, a pattern followed by an attributes list,
-separated by whitespaces. When the pattern matches the
-path in question, the attributes listed on the line are given to
-the path.
+separated by whitespaces. Leading and trailing whitespaces are
+ignored. Lines that begin with '#' are ignored. Patterns
+that begin with a double quote are quoted in C style.
+When the pattern matches the path in question, the attributes
+listed on the line are given to the path.
Each attribute can be in one of these states for a given path:
diff --git a/attr.c b/attr.c
index 33021cc857..c8c4936f36 100644
--- a/attr.c
+++ b/attr.c
@@ -13,6 +13,7 @@
#include "attr.h"
#include "dir.h"
#include "utf8.h"
+#include "quote.h"
const char git_attr__true[] = "(builtin)true";
const char git_attr__false[] = "\0(builtin)false";
@@ -225,12 +226,21 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
const char *cp, *name, *states;
struct match_attr *res = NULL;
int is_macro;
+ struct strbuf pattern = STRBUF_INIT;
cp = line + strspn(line, blank);
if (!*cp || *cp == '#')
return NULL;
name = cp;
- namelen = strcspn(name, blank);
+
+ if (*cp == '"' && !unquote_c_style(&pattern, name, &states)) {
+ name = pattern.buf;
+ namelen = pattern.len;
+ } else {
+ namelen = strcspn(name, blank);
+ states = name + namelen;
+ }
+
if (strlen(ATTRIBUTE_MACRO_PREFIX) < namelen &&
starts_with(name, ATTRIBUTE_MACRO_PREFIX)) {
if (!macro_ok) {
@@ -250,7 +260,6 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
else
is_macro = 0;
- states = name + namelen;
states += strspn(states, blank);
/* First pass to count the attr_states */
@@ -293,9 +302,11 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
cannot_trust_maybe_real = 1;
}
+ strbuf_release(&pattern);
return res;
fail_return:
+ strbuf_release(&pattern);
free(res);
return NULL;
}
diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh
index f0fbb42554..f19ae4f8cc 100755
--- a/t/t0003-attributes.sh
+++ b/t/t0003-attributes.sh
@@ -13,10 +13,31 @@ attr_check () {
test_line_count = 0 err
}
+attr_check_quote () {
+
+ path="$1"
+ quoted_path="$2"
+ expect="$3"
+
+ git check-attr test -- "$path" >actual &&
+ echo "\"$quoted_path\": test: $expect" >expect &&
+ test_cmp expect actual
+
+}
+
+test_expect_success 'open-quoted pathname' '
+ echo "\"a test=a" >.gitattributes &&
+ test_must_fail attr_check a a
+'
+
+
test_expect_success 'setup' '
mkdir -p a/b/d a/c b &&
(
echo "[attr]notest !test"
+ echo "\" d \" test=d"
+ echo " e test=e"
+ echo " e\" test=e"
echo "f test=f"
echo "a/i test=a/i"
echo "onoff test -test"
@@ -69,6 +90,11 @@ test_expect_success 'command line checks' '
'
test_expect_success 'attribute test' '
+
+ attr_check " d " d &&
+ attr_check e e &&
+ attr_check_quote e\" e\\\" e &&
+
attr_check f f &&
attr_check a/f f &&
attr_check a/c/f f &&
--
2.10.1.714.ge3da0db
next prev parent reply other threads:[~2016-10-28 18:56 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-28 18:54 [PATCHv2 00/36] Revamp the attr subsystem! Stefan Beller
2016-10-28 18:54 ` [PATCHv2 01/36] commit.c: use strchrnul() to scan for one line Stefan Beller
2016-10-28 18:54 ` [PATCHv2 02/36] attr.c: " Stefan Beller
2016-10-28 18:54 ` [PATCHv2 03/36] attr.c: update a stale comment on "struct match_attr" Stefan Beller
2016-10-28 18:54 ` [PATCHv2 04/36] attr.c: explain the lack of attr-name syntax check in parse_attr() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 05/36] attr.c: complete a sentence in a comment Stefan Beller
2016-10-28 18:54 ` [PATCHv2 06/36] attr.c: mark where #if DEBUG ends more clearly Stefan Beller
2016-10-28 18:54 ` [PATCHv2 07/36] attr.c: simplify macroexpand_one() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 08/36] attr.c: tighten constness around "git_attr" structure Stefan Beller
2016-10-28 18:54 ` [PATCHv2 09/36] attr.c: plug small leak in parse_attr_line() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 10/36] attr: rename function and struct related to checking attributes Stefan Beller
2016-10-28 18:54 ` [PATCHv2 11/36] attr: (re)introduce git_check_attr() and struct git_attr_check Stefan Beller
2016-10-28 18:54 ` [PATCHv2 12/36] attr: convert git_all_attrs() to use "struct git_attr_check" Stefan Beller
2016-10-28 18:54 ` [PATCHv2 13/36] attr: convert git_check_attrs() callers to use the new API Stefan Beller
2016-10-28 18:54 ` [PATCHv2 14/36] attr: retire git_check_attrs() API Stefan Beller
2016-10-28 18:54 ` [PATCHv2 15/36] attr: add counted string version of git_check_attr() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 16/36] attr: add counted string version of git_attr() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 17/36] attr: expose validity check for attribute names Stefan Beller
2016-10-28 18:54 ` Stefan Beller [this message]
2016-10-28 18:54 ` [PATCHv2 19/36] attr.c: add push_stack() helper Stefan Beller
2016-10-28 18:54 ` [PATCHv2 20/36] attr.c: pass struct git_attr_check down the callchain Stefan Beller
2016-10-28 18:54 ` [PATCHv2 21/36] attr.c: rename a local variable check Stefan Beller
2016-10-28 18:54 ` [PATCHv2 22/36] attr.c: correct ugly hack for git_all_attrs() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 23/36] attr.c: introduce empty_attr_check_elems() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 24/36] attr.c: always pass check[] to collect_some_attrs() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 25/36] attr.c: outline the future plans by heavily commenting Stefan Beller
2016-10-28 18:54 ` [PATCHv2 26/36] attr: make git_check_attr_counted static Stefan Beller
2016-10-28 18:54 ` [PATCHv2 27/36] attr: convert to new threadsafe API Stefan Beller
2016-10-28 22:06 ` Junio C Hamano
2016-10-28 22:08 ` Stefan Beller
2016-10-28 22:25 ` Junio C Hamano
2016-10-29 7:10 ` Johannes Sixt
2016-10-28 18:54 ` [PATCHv2 28/36] attr: keep attr stack for each check Stefan Beller
2016-10-28 21:35 ` Junio C Hamano
2016-10-28 18:54 ` [PATCHv2 29/36] Documentation: fix a typo Stefan Beller
2016-10-28 18:54 ` [PATCHv2 30/36] pathspec: move long magic parsing out of prefix_pathspec Stefan Beller
2016-10-28 18:54 ` [PATCHv2 31/36] pathspec: move prefix check out of the inner loop Stefan Beller
2016-10-28 18:54 ` [PATCHv2 32/36] pathspec: allow querying for attributes Stefan Beller
2016-11-09 9:57 ` Duy Nguyen
2016-11-09 22:42 ` Stefan Beller
2016-10-28 18:54 ` [PATCHv2 33/36] pathspec: allow escaped query values Stefan Beller
2016-10-28 18:55 ` [PATCHv2 34/36] submodule update: add `--init-default-path` switch Stefan Beller
2016-11-03 17:46 ` [PATCH] SQUASH to: " Stefan Beller
2016-10-28 18:55 ` [PATCHv2 35/36] clone: add --init-submodule=<pathspec> switch Stefan Beller
2016-10-28 18:55 ` [PATCHv2 36/36] completion: clone can initialize specific submodules Stefan Beller
2016-10-28 21:43 ` [PATCHv2 00/36] Revamp the attr subsystem! Junio C Hamano
2016-10-28 22:02 ` Stefan Beller
2016-10-28 23:59 ` Ramsay Jones
2016-11-03 20:47 ` Johannes Sixt
2016-11-03 20:53 ` Stefan Beller
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161028185502.8789-19-sbeller@google.com \
--to=sbeller@google.com \
--cc=bmwill@google.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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).