pathspec: factor global magic into its own function
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 <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:
parent
5d8f084a5d
commit
db7e85988f
127
pathspec.c
127
pathspec.c
@ -87,6 +87,75 @@ static void prefix_magic(struct strbuf *sb, int prefixlen, unsigned magic)
|
|||||||
strbuf_addf(sb, ",prefix:%d)", prefixlen);
|
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.
|
* 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.
|
||||||
@ -104,46 +173,12 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
|
|||||||
const char *prefix, int prefixlen,
|
const char *prefix, int prefixlen,
|
||||||
const char *elt)
|
const char *elt)
|
||||||
{
|
{
|
||||||
static int literal_global = -1;
|
unsigned magic = 0, element_magic = 0;
|
||||||
static int glob_global = -1;
|
|
||||||
static int noglob_global = -1;
|
|
||||||
static int icase_global = -1;
|
|
||||||
unsigned magic = 0, element_magic = 0, global_magic = 0;
|
|
||||||
const char *copyfrom = elt;
|
const char *copyfrom = elt;
|
||||||
char *match;
|
char *match;
|
||||||
int i, pathspec_prefix = -1;
|
int i, pathspec_prefix = -1;
|
||||||
|
|
||||||
if (literal_global < 0)
|
if (elt[0] != ':' || get_literal_global() ||
|
||||||
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 ||
|
|
||||||
(flags & PATHSPEC_LITERAL_PATH)) {
|
(flags & PATHSPEC_LITERAL_PATH)) {
|
||||||
; /* nothing to do */
|
; /* nothing to do */
|
||||||
} else if (elt[1] == '(') {
|
} else if (elt[1] == '(') {
|
||||||
@ -207,15 +242,11 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
|
|||||||
|
|
||||||
magic |= element_magic;
|
magic |= element_magic;
|
||||||
|
|
||||||
/* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
|
/* PATHSPEC_LITERAL_PATH ignores magic */
|
||||||
if (noglob_global && !(magic & PATHSPEC_GLOB))
|
if (flags & PATHSPEC_LITERAL_PATH)
|
||||||
global_magic |= PATHSPEC_LITERAL;
|
magic = PATHSPEC_LITERAL;
|
||||||
|
else
|
||||||
/* --glob-pathspec is overridden by :(literal) */
|
magic |= get_global_magic(element_magic);
|
||||||
if ((global_magic & PATHSPEC_GLOB) && (magic & PATHSPEC_LITERAL))
|
|
||||||
global_magic &= ~PATHSPEC_GLOB;
|
|
||||||
|
|
||||||
magic |= global_magic;
|
|
||||||
|
|
||||||
if (pathspec_prefix >= 0 &&
|
if (pathspec_prefix >= 0 &&
|
||||||
(prefixlen || (prefix && *prefix)))
|
(prefixlen || (prefix && *prefix)))
|
||||||
@ -241,7 +272,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
|
|||||||
* original. Useful for passing to another command.
|
* original. Useful for passing to another command.
|
||||||
*/
|
*/
|
||||||
if ((flags & PATHSPEC_PREFIX_ORIGIN) &&
|
if ((flags & PATHSPEC_PREFIX_ORIGIN) &&
|
||||||
prefixlen && !literal_global) {
|
prefixlen && !get_literal_global()) {
|
||||||
struct strbuf sb = STRBUF_INIT;
|
struct strbuf sb = STRBUF_INIT;
|
||||||
|
|
||||||
/* Preserve the actual prefix length of each pattern */
|
/* 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,
|
item[i].magic = prefix_pathspec(item + i, flags,
|
||||||
prefix, prefixlen, entry);
|
prefix, prefixlen, entry);
|
||||||
if ((flags & PATHSPEC_LITERAL_PATH) &&
|
|
||||||
!(magic_mask & PATHSPEC_LITERAL))
|
|
||||||
item[i].magic |= PATHSPEC_LITERAL;
|
|
||||||
if (item[i].magic & PATHSPEC_EXCLUDE)
|
if (item[i].magic & PATHSPEC_EXCLUDE)
|
||||||
nr_exclude++;
|
nr_exclude++;
|
||||||
if (item[i].magic & magic_mask)
|
if (item[i].magic & magic_mask)
|
||||||
|
Loading…
Reference in New Issue
Block a user