@ -156,6 +156,41 @@ static int get_global_magic(int element_magic)
return global_magic;
return global_magic;
}
}
/*
* Parse the pathspec element looking for short magic
*
* saves all magic in 'magic'
* returns the position in 'elem' after all magic has been parsed
*/
static const char *parse_short_magic(unsigned *magic, const char *elem)
{
const char *pos;
for (pos = elem + 1; *pos && *pos != ':'; pos++) {
char ch = *pos;
int i;
if (!is_pathspec_magic(ch))
break;
for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
if (pathspec_magic[i].mnemonic == ch) {
*magic |= pathspec_magic[i].bit;
break;
}
}
if (ARRAY_SIZE(pathspec_magic) <= i)
die(_("Unimplemented pathspec magic '%c' in '%s'"),
ch, elem);
}
if (*pos == ':')
pos++;
return pos;
}
/*
/*
* Take an element of a pathspec and check for magic signatures.
* Take an element of a pathspec and check for magic signatures.
* Append the result to the prefix. Return the magic bitmap.
* Append the result to the prefix. Return the magic bitmap.
@ -220,24 +255,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
copyfrom++;
copyfrom++;
} else {
} else {
/* shorthand */
/* shorthand */
for (copyfrom = elt + 1;
copyfrom = parse_short_magic(&element_magic, elt);
*copyfrom && *copyfrom != ':';
copyfrom++) {
char ch = *copyfrom;
if (!is_pathspec_magic(ch))
break;
for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
if (pathspec_magic[i].mnemonic == ch) {
element_magic |= pathspec_magic[i].bit;
break;
}
if (ARRAY_SIZE(pathspec_magic) <= i)
die(_("Unimplemented pathspec magic '%c' in '%s'"),
ch, elt);
}
if (*copyfrom == ':')
copyfrom++;
}
}
magic |= element_magic;
magic |= element_magic;