pathspec: create parse_element_magic helper

Factor out the logic responsible for the magic in a pathspec element
into its own function.

Also avoid calling into the parsing functions when
`PATHSPEC_LITERAL_PATH` is specified since it causes magic to be
ignored and all paths to be treated as literals.

Signed-off-by: Brandon Williams <bmwill@google.com>
Reviewed-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Brandon Williams 2017-01-04 10:04:08 -08:00 committed by Junio C Hamano
parent 8881fde013
commit 1b6112c527

View File

@ -245,6 +245,19 @@ static const char *parse_short_magic(unsigned *magic, const char *elem)
return pos;
}
static const char *parse_element_magic(unsigned *magic, int *prefix_len,
const char *elem)
{
if (elem[0] != ':' || get_literal_global())
return elem; /* nothing to do */
else if (elem[1] == '(')
/* longhand */
return parse_long_magic(magic, prefix_len, elem);
else
/* shorthand */
return parse_short_magic(magic, elem);
}
/*
* Take an element of a pathspec and check for magic signatures.
* Append the result to the prefix. Return the magic bitmap.
@ -267,26 +280,16 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
char *match;
int i, pathspec_prefix = -1;
if (elt[0] != ':' || get_literal_global() ||
(flags & PATHSPEC_LITERAL_PATH)) {
; /* nothing to do */
} else if (elt[1] == '(') {
/* longhand */
copyfrom = parse_long_magic(&element_magic,
&pathspec_prefix,
elt);
} else {
/* shorthand */
copyfrom = parse_short_magic(&element_magic, elt);
}
magic |= element_magic;
/* PATHSPEC_LITERAL_PATH ignores magic */
if (flags & PATHSPEC_LITERAL_PATH)
if (flags & PATHSPEC_LITERAL_PATH) {
magic = PATHSPEC_LITERAL;
else
} else {
copyfrom = parse_element_magic(&element_magic,
&pathspec_prefix,
elt);
magic |= element_magic;
magic |= get_global_magic(element_magic);
}
if (pathspec_prefix >= 0 &&
(prefixlen || (prefix && *prefix)))