Currently use parentheses, e.g. ":(icase,literal)path", but they do
not play well with unix shells because they have special meaning and
we need to quote them. Allow an alternate syntax ":q/icase,literal/path".
Similar to ed's s/// syntax, '/' can be replaced with anything. If the
opening quote has a closing counterpart, e.g. () [] <> {}, then it'll
be quoted as such.
It may even be a good thing to kill ':(...)' syntax, which can easily
be replaced with ':q(...)'. It's unlikely that anybody is used to it
yet.
Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
setup.c | 30 ++++++++++++++++++++++++------
1 file changed, 24 insertions(+), 6 deletions(-)
diff --git a/setup.c b/setup.c
index 69ca047..9db6093 100644
--- a/setup.c
+++ b/setup.c
@@ -196,14 +196,32 @@ static unsigned prefix_pathspec(struct pathspec_item
*item,
if (elt[0] != ':') {
; /* nothing to do */
- } else if (elt[1] == '(') {
+ } else if (elt[1] == '(' || elt[1] == 'q') {
/* longhand */
const char *nextat;
- for (copyfrom = elt + 2;
- *copyfrom && *copyfrom != ')';
+ char close = ')';
+ char sep[3] = ",)";
+ if (elt[1] == '(')
+ copyfrom = elt + 2;
+ else {
+ copyfrom = elt + 3;
+ switch (elt[2]) {
+ case '(': close = ')'; break;
+ case '[': close = ']'; break;
+ case '{': close = '}'; break;
+ case '<': close = '>'; break;
+ case '\0':
+ die("Invalid pathspec '%s'", elt);
+ default:
+ close = elt[2];
+ }
+ sep[1] = close;
+ }
+ for (;
+ *copyfrom && *copyfrom != close;
copyfrom = nextat) {
- size_t len = strcspn(copyfrom, ",)");
- if (copyfrom[len] == ')')
+ size_t len = strcspn(copyfrom, sep);
+ if (copyfrom[len] == close)
nextat = copyfrom + len;
else
nextat = copyfrom + len + 1;
@@ -219,7 +237,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
die("Invalid pathspec magic '%.*s' in '%s'",
(int) len, copyfrom, elt);
}
- if (*copyfrom == ')')
+ if (*copyfrom == close)
copyfrom++;
} else {
/* shorthand */
--
1.8.0.rc2.23.g1fb49df
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html