Create helper functions to read the global magic environment variables
in additon to factoring out the global magic gathering logic into its
own function.

Signed-off-by: Brandon Williams <bmw...@google.com>
---
 pathspec.c | 127 +++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 78 insertions(+), 49 deletions(-)

diff --git a/pathspec.c b/pathspec.c
index af7f2d01d..77df55da6 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -87,6 +87,75 @@ static void prefix_magic(struct strbuf *sb, int prefixlen, 
unsigned magic)
        strbuf_addf(sb, ",prefix:%d)", prefixlen);
 }
 
+static inline int get_literal_global(void)
+{
+       static int literal = -1;
+
+       if (literal < 0)
+               literal = git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
+
+       return literal;
+}
+
+static inline int get_glob_global(void)
+{
+       static int glob = -1;
+
+       if (glob < 0)
+               glob = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
+
+       return glob;
+}
+
+static inline int get_noglob_global(void)
+{
+       static int noglob = -1;
+
+       if (noglob < 0)
+               noglob = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT, 0);
+
+       return noglob;
+}
+
+static inline int get_icase_global(void)
+{
+       static int icase = -1;
+
+       if (icase < 0)
+               icase = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
+
+       return icase;
+}
+
+static int get_global_magic(int element_magic)
+{
+       int global_magic = 0;
+
+       if (get_literal_global())
+               global_magic |= PATHSPEC_LITERAL;
+
+       /* --glob-pathspec is overridden by :(literal) */
+       if (get_glob_global() && !(element_magic & PATHSPEC_LITERAL))
+               global_magic |= PATHSPEC_GLOB;
+
+       if (get_glob_global() && get_noglob_global())
+               die(_("global 'glob' and 'noglob' pathspec settings are 
incompatible"));
+
+       if (get_icase_global())
+               global_magic |= PATHSPEC_ICASE;
+
+       if ((global_magic & PATHSPEC_LITERAL) &&
+           (global_magic & ~PATHSPEC_LITERAL))
+               die(_("global 'literal' pathspec setting is incompatible "
+                     "with all other global pathspec settings"));
+
+       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
+       if (get_noglob_global() && !(element_magic & PATHSPEC_GLOB))
+               global_magic |= PATHSPEC_LITERAL;
+
+       return global_magic;
+}
+
 /*
  * Take an element of a pathspec and check for magic signatures.
  * Append the result to the prefix. Return the magic bitmap.
@@ -104,46 +173,12 @@ static unsigned prefix_pathspec(struct pathspec_item 
*item, unsigned flags,
                                const char *prefix, int prefixlen,
                                const char *elt)
 {
-       static int literal_global = -1;
-       static int glob_global = -1;
-       static int noglob_global = -1;
-       static int icase_global = -1;
-       unsigned magic = 0, element_magic = 0, global_magic = 0;
+       unsigned magic = 0, element_magic = 0;
        const char *copyfrom = elt;
        char *match;
        int i, pathspec_prefix = -1;
 
-       if (literal_global < 0)
-               literal_global = 
git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT, 0);
-       if (literal_global)
-               global_magic |= PATHSPEC_LITERAL;
-
-       if (glob_global < 0)
-               glob_global = git_env_bool(GIT_GLOB_PATHSPECS_ENVIRONMENT, 0);
-       if (glob_global)
-               global_magic |= PATHSPEC_GLOB;
-
-       if (noglob_global < 0)
-               noglob_global = git_env_bool(GIT_NOGLOB_PATHSPECS_ENVIRONMENT, 
0);
-
-       if (glob_global && noglob_global)
-               die(_("global 'glob' and 'noglob' pathspec settings are 
incompatible"));
-
-
-       if (icase_global < 0)
-               icase_global = git_env_bool(GIT_ICASE_PATHSPECS_ENVIRONMENT, 0);
-       if (icase_global)
-               global_magic |= PATHSPEC_ICASE;
-
-       if ((global_magic & PATHSPEC_LITERAL) &&
-           (global_magic & ~PATHSPEC_LITERAL))
-               die(_("global 'literal' pathspec setting is incompatible "
-                     "with all other global pathspec settings"));
-
-       if (flags & PATHSPEC_LITERAL_PATH)
-               global_magic = 0;
-
-       if (elt[0] != ':' || literal_global ||
+       if (elt[0] != ':' || get_literal_global() ||
            (flags & PATHSPEC_LITERAL_PATH)) {
                ; /* nothing to do */
        } else if (elt[1] == '(') {
@@ -207,15 +242,11 @@ static unsigned prefix_pathspec(struct pathspec_item 
*item, unsigned flags,
 
        magic |= element_magic;
 
-       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
-       if (noglob_global && !(magic & PATHSPEC_GLOB))
-               global_magic |= PATHSPEC_LITERAL;
-
-       /* --glob-pathspec is overridden by :(literal) */
-       if ((global_magic & PATHSPEC_GLOB) && (magic & PATHSPEC_LITERAL))
-               global_magic &= ~PATHSPEC_GLOB;
-
-       magic |= global_magic;
+       /* PATHSPEC_LITERAL_PATH ignores magic */
+       if (flags & PATHSPEC_LITERAL_PATH)
+               magic = PATHSPEC_LITERAL;
+       else
+               magic |= get_global_magic(element_magic);
 
        if (pathspec_prefix >= 0 &&
            (prefixlen || (prefix && *prefix)))
@@ -241,7 +272,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, 
unsigned flags,
         * original. Useful for passing to another command.
         */
        if ((flags & PATHSPEC_PREFIX_ORIGIN) &&
-           prefixlen && !literal_global) {
+           prefixlen && !get_literal_global()) {
                struct strbuf sb = STRBUF_INIT;
 
                /* Preserve the actual prefix length of each pattern */
@@ -408,9 +439,7 @@ void parse_pathspec(struct pathspec *pathspec,
 
                item[i].magic = prefix_pathspec(item + i, flags,
                                                prefix, prefixlen, entry);
-               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)
-- 
2.11.0.390.gc69c2f50cf-goog

Reply via email to