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 <bmw...@google.com>
---
 pathspec.c | 35 +++++++++++++++++++----------------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/pathspec.c b/pathspec.c
index 1d28679..793caf1 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -244,6 +244,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,24 +280,14 @@ static unsigned prefix_pathspec(struct pathspec_item 
*item,
        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)) {
+               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)))
-- 
2.8.0.rc3.226.g39d4020

Reply via email to