Merge branch 'nd/negative-pathspec'
Introduce "negative pathspec" magic, to allow "git log -- . ':!dir'" to tell us "I am interested in everything but 'dir' directory". * nd/negative-pathspec: pathspec.c: support adding prefix magic to a pathspec with mnemonic magic Support pathspec magic :(exclude) and its short form :! glossary-content.txt: rephrase magic signature part
This commit is contained in:
37
pathspec.c
37
pathspec.c
@ -71,8 +71,23 @@ static struct pathspec_magic {
|
||||
{ PATHSPEC_LITERAL, 0, "literal" },
|
||||
{ PATHSPEC_GLOB, '\0', "glob" },
|
||||
{ PATHSPEC_ICASE, '\0', "icase" },
|
||||
{ PATHSPEC_EXCLUDE, '!', "exclude" },
|
||||
};
|
||||
|
||||
static void prefix_short_magic(struct strbuf *sb, int prefixlen,
|
||||
unsigned short_magic)
|
||||
{
|
||||
int i;
|
||||
strbuf_addstr(sb, ":(");
|
||||
for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
|
||||
if (short_magic & pathspec_magic[i].bit) {
|
||||
if (sb->buf[sb->len - 1] != '(')
|
||||
strbuf_addch(sb, ',');
|
||||
strbuf_addstr(sb, pathspec_magic[i].name);
|
||||
}
|
||||
strbuf_addf(sb, ",prefix:%d)", prefixlen);
|
||||
}
|
||||
|
||||
/*
|
||||
* Take an element of a pathspec and check for magic signatures.
|
||||
* Append the result to the prefix. Return the magic bitmap.
|
||||
@ -232,22 +247,16 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
|
||||
*/
|
||||
if (flags & PATHSPEC_PREFIX_ORIGIN) {
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
const char *start = elt;
|
||||
if (prefixlen && !literal_global) {
|
||||
/* Preserve the actual prefix length of each pattern */
|
||||
if (short_magic)
|
||||
die("BUG: prefixing on short magic is not supported");
|
||||
prefix_short_magic(&sb, prefixlen, short_magic);
|
||||
else if (long_magic_end) {
|
||||
strbuf_add(&sb, start, long_magic_end - start);
|
||||
strbuf_addf(&sb, ",prefix:%d", prefixlen);
|
||||
start = long_magic_end;
|
||||
} else {
|
||||
if (*start == ':')
|
||||
start++;
|
||||
strbuf_add(&sb, elt, long_magic_end - elt);
|
||||
strbuf_addf(&sb, ",prefix:%d)", prefixlen);
|
||||
} else
|
||||
strbuf_addf(&sb, ":(prefix:%d)", prefixlen);
|
||||
}
|
||||
}
|
||||
strbuf_add(&sb, start, copyfrom - start);
|
||||
strbuf_addstr(&sb, match);
|
||||
item->original = strbuf_detach(&sb, NULL);
|
||||
} else
|
||||
@ -355,7 +364,7 @@ void parse_pathspec(struct pathspec *pathspec,
|
||||
{
|
||||
struct pathspec_item *item;
|
||||
const char *entry = argv ? *argv : NULL;
|
||||
int i, n, prefixlen;
|
||||
int i, n, prefixlen, nr_exclude = 0;
|
||||
|
||||
memset(pathspec, 0, sizeof(*pathspec));
|
||||
|
||||
@ -412,6 +421,8 @@ void parse_pathspec(struct pathspec *pathspec,
|
||||
if ((flags & PATHSPEC_LITERAL_PATH) &&
|
||||
!(magic_mask & PATHSPEC_LITERAL))
|
||||
item[i].magic |= PATHSPEC_LITERAL;
|
||||
if (item[i].magic & PATHSPEC_EXCLUDE)
|
||||
nr_exclude++;
|
||||
if (item[i].magic & magic_mask)
|
||||
unsupported_magic(entry,
|
||||
item[i].magic & magic_mask,
|
||||
@ -427,6 +438,10 @@ void parse_pathspec(struct pathspec *pathspec,
|
||||
pathspec->magic |= item[i].magic;
|
||||
}
|
||||
|
||||
if (nr_exclude == n)
|
||||
die(_("There is nothing to exclude from by :(exclude) patterns.\n"
|
||||
"Perhaps you forgot to add either ':/' or '.' ?"));
|
||||
|
||||
|
||||
if (pathspec->magic & PATHSPEC_MAXDEPTH) {
|
||||
if (flags & PATHSPEC_KEEP_ORDER)
|
||||
|
||||
Reference in New Issue
Block a user