git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com, bmwill@google.com, pclouds@gmail.com
Cc: git@vger.kernel.org, Stefan Beller <sbeller@google.com>
Subject: [PATCH 17/35] attr: support quoting pathname patterns in C style
Date: Thu, 10 Nov 2016 12:34:10 -0800	[thread overview]
Message-ID: <20161110203428.30512-18-sbeller@google.com> (raw)
In-Reply-To: <20161110203428.30512-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>
Signed-off-by: Junio C Hamano <gitster@pobox.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 7aff940..8a061af 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 14bbfd4..88fcb7c 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 f0fbb42..f19ae4f 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.469.g00a8914


  parent reply	other threads:[~2016-11-10 20:35 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-10 20:33 [PATCHv3 00/35] Revamp the attr subsystem! Stefan Beller
2016-11-10 20:33 ` [PATCH 01/35] commit.c: use strchrnul() to scan for one line Stefan Beller
2016-11-10 20:33 ` [PATCH 02/35] attr.c: " Stefan Beller
2016-11-10 20:33 ` [PATCH 03/35] attr.c: update a stale comment on "struct match_attr" Stefan Beller
2016-11-10 20:33 ` [PATCH 04/35] attr.c: explain the lack of attr-name syntax check in parse_attr() Stefan Beller
2016-11-10 20:33 ` [PATCH 05/35] attr.c: complete a sentence in a comment Stefan Beller
2016-11-10 20:33 ` [PATCH 06/35] attr.c: mark where #if DEBUG ends more clearly Stefan Beller
2016-11-10 20:34 ` [PATCH 07/35] attr.c: simplify macroexpand_one() Stefan Beller
2016-11-10 20:34 ` [PATCH 08/35] attr.c: tighten constness around "git_attr" structure Stefan Beller
2016-11-10 20:34 ` [PATCH 09/35] attr.c: plug small leak in parse_attr_line() Stefan Beller
2016-11-10 20:34 ` [PATCH 10/35] attr: rename function and struct related to checking attributes Stefan Beller
2016-11-10 20:34 ` [PATCH 11/35] attr: (re)introduce git_check_attr() and struct git_attr_check Stefan Beller
2016-11-10 20:34 ` [PATCH 12/35] attr: convert git_all_attrs() to use "struct git_attr_check" Stefan Beller
2016-11-10 20:34 ` [PATCH 13/35] attr: convert git_check_attrs() callers to use the new API Stefan Beller
2016-11-10 20:34 ` [PATCH 14/35] attr: retire git_check_attrs() API Stefan Beller
2016-11-10 20:34 ` [PATCH 15/35] attr: add counted string version of git_check_attr() Stefan Beller
2016-11-10 20:34 ` [PATCH 16/35] attr: expose validity check for attribute names Stefan Beller
2016-11-10 20:34 ` Stefan Beller [this message]
2016-11-10 20:34 ` [PATCH 18/35] attr.c: add push_stack() helper Stefan Beller
2016-11-10 20:34 ` [PATCH 19/35] attr.c: pass struct git_attr_check down the callchain Stefan Beller
2016-11-10 20:34 ` [PATCH 20/35] attr.c: rename a local variable check Stefan Beller
2016-11-10 20:34 ` [PATCH 21/35] attr.c: correct ugly hack for git_all_attrs() Stefan Beller
2016-11-10 20:34 ` [PATCH 22/35] attr.c: introduce empty_attr_check_elems() Stefan Beller
2016-11-10 20:34 ` [PATCH 23/35] attr.c: always pass check[] to collect_some_attrs() Stefan Beller
2016-11-10 20:34 ` [PATCH 24/35] attr.c: outline the future plans by heavily commenting Stefan Beller
2016-11-10 20:34 ` [PATCH 25/35] attr: make git_check_attr_counted static Stefan Beller
2016-11-10 20:34 ` [PATCH 26/35] attr: convert to new threadsafe API Stefan Beller
2016-11-10 20:34 ` [PATCH 27/35] attr: keep attr stack for each check Stefan Beller
2016-11-10 20:34 ` [PATCH 28/35] Documentation: fix a typo Stefan Beller
2016-11-10 20:34 ` [PATCH 29/35] pathspec: move long magic parsing out of prefix_pathspec Stefan Beller
2016-11-10 20:34 ` [PATCH 30/35] pathspec: move prefix check out of the inner loop Stefan Beller
2016-11-10 20:34 ` [PATCH 31/35] pathspec: allow querying for attributes Stefan Beller
2016-11-22 10:41   ` Duy Nguyen
2016-11-22 17:26     ` Stefan Beller
2016-11-23  9:38       ` Duy Nguyen
2016-11-28 18:02   ` Brandon Williams
2016-11-28 18:03   ` Brandon Williams
2016-11-28 22:11   ` Brandon Williams
2016-11-29 17:37     ` Stefan Beller
2016-11-10 20:34 ` [PATCH 32/35] pathspec: allow escaped query values Stefan Beller
2016-11-10 20:34 ` [PATCH 33/35] submodule update: add `--init-default-path` switch Stefan Beller
2016-11-10 20:34 ` [PATCH 34/35] clone: add --init-submodule=<pathspec> switch Stefan Beller
2016-11-10 20:34 ` [PATCH 35/35] completion: clone can initialize specific submodules 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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161110203428.30512-18-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.
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).