diff options
Diffstat (limited to 'attr.c')
-rw-r--r-- | attr.c | 52 |
1 files changed, 31 insertions, 21 deletions
@@ -708,10 +708,8 @@ static struct attr_stack *read_attr_from_array(const char **list) * another thread could potentially be calling into the attribute system. */ static enum git_attr_direction direction; -static struct index_state *use_index; -void git_attr_set_direction(enum git_attr_direction new_direction, - struct index_state *istate) +void git_attr_set_direction(enum git_attr_direction new_direction) { if (is_bare_repository() && new_direction != GIT_ATTR_INDEX) BUG("non-INDEX attr direction in a bare repo"); @@ -720,7 +718,6 @@ void git_attr_set_direction(enum git_attr_direction new_direction, drop_all_attr_stacks(); direction = new_direction; - use_index = istate; } static struct attr_stack *read_attr_from_file(const char *path, int macro_ok) @@ -743,13 +740,18 @@ static struct attr_stack *read_attr_from_file(const char *path, int macro_ok) return res; } -static struct attr_stack *read_attr_from_index(const char *path, int macro_ok) +static struct attr_stack *read_attr_from_index(const struct index_state *istate, + const char *path, + int macro_ok) { struct attr_stack *res; char *buf, *sp; int lineno = 0; - buf = read_blob_data_from_index(use_index ? use_index : &the_index, path, NULL); + if (!istate) + return NULL; + + buf = read_blob_data_from_index(istate, path, NULL); if (!buf) return NULL; @@ -768,15 +770,16 @@ static struct attr_stack *read_attr_from_index(const char *path, int macro_ok) return res; } -static struct attr_stack *read_attr(const char *path, int macro_ok) +static struct attr_stack *read_attr(const struct index_state *istate, + const char *path, int macro_ok) { struct attr_stack *res = NULL; if (direction == GIT_ATTR_INDEX) { - res = read_attr_from_index(path, macro_ok); + res = read_attr_from_index(istate, path, macro_ok); } else if (!is_bare_repository()) { if (direction == GIT_ATTR_CHECKOUT) { - res = read_attr_from_index(path, macro_ok); + res = read_attr_from_index(istate, path, macro_ok); if (!res) res = read_attr_from_file(path, macro_ok); } else if (direction == GIT_ATTR_CHECKIN) { @@ -788,7 +791,7 @@ static struct attr_stack *read_attr(const char *path, int macro_ok) * We allow operation in a sparsely checked out * work tree, so read from it. */ - res = read_attr_from_index(path, macro_ok); + res = read_attr_from_index(istate, path, macro_ok); } } @@ -859,7 +862,8 @@ static void push_stack(struct attr_stack **attr_stack_p, } } -static void bootstrap_attr_stack(struct attr_stack **stack) +static void bootstrap_attr_stack(const struct index_state *istate, + struct attr_stack **stack) { struct attr_stack *e; @@ -883,7 +887,7 @@ static void bootstrap_attr_stack(struct attr_stack **stack) } /* root directory */ - e = read_attr(GITATTRIBUTES_FILE, 1); + e = read_attr(istate, GITATTRIBUTES_FILE, 1); push_stack(stack, e, xstrdup(""), 0); /* info frame */ @@ -896,7 +900,8 @@ static void bootstrap_attr_stack(struct attr_stack **stack) push_stack(stack, e, NULL, 0); } -static void prepare_attr_stack(const char *path, int dirlen, +static void prepare_attr_stack(const struct index_state *istate, + const char *path, int dirlen, struct attr_stack **stack) { struct attr_stack *info; @@ -917,7 +922,7 @@ static void prepare_attr_stack(const char *path, int dirlen, * .gitattributes in deeper directories to shallower ones, * and finally use the built-in set as the default. */ - bootstrap_attr_stack(stack); + bootstrap_attr_stack(istate, stack); /* * Pop the "info" one that is always at the top of the stack. @@ -973,7 +978,7 @@ static void prepare_attr_stack(const char *path, int dirlen, strbuf_add(&pathbuf, path + pathbuf.len, (len - pathbuf.len)); strbuf_addf(&pathbuf, "/%s", GITATTRIBUTES_FILE); - next = read_attr(pathbuf.buf, 0); + next = read_attr(istate, pathbuf.buf, 0); /* reset the pathbuf to not include "/.gitattributes" */ strbuf_setlen(&pathbuf, len); @@ -1095,7 +1100,9 @@ static void determine_macros(struct all_attrs_item *all_attrs, * If check->check_nr is non-zero, only attributes in check[] are collected. * Otherwise all attributes are collected. */ -static void collect_some_attrs(const char *path, struct attr_check *check) +static void collect_some_attrs(const struct index_state *istate, + const char *path, + struct attr_check *check) { int i, pathlen, rem, dirlen; const char *cp, *last_slash = NULL; @@ -1114,7 +1121,7 @@ static void collect_some_attrs(const char *path, struct attr_check *check) dirlen = 0; } - prepare_attr_stack(path, dirlen, &check->stack); + prepare_attr_stack(istate, path, dirlen, &check->stack); all_attrs_init(&g_attr_hashmap, check); determine_macros(check->all_attrs, check->stack); @@ -1136,11 +1143,13 @@ static void collect_some_attrs(const char *path, struct attr_check *check) fill(path, pathlen, basename_offset, check->stack, check->all_attrs, rem); } -int git_check_attr(const char *path, struct attr_check *check) +int git_check_attr(const struct index_state *istate, + const char *path, + struct attr_check *check) { int i; - collect_some_attrs(path, check); + collect_some_attrs(istate, path, check); for (i = 0; i < check->nr; i++) { size_t n = check->items[i].attr->attr_nr; @@ -1153,12 +1162,13 @@ int git_check_attr(const char *path, struct attr_check *check) return 0; } -void git_all_attrs(const char *path, struct attr_check *check) +void git_all_attrs(const struct index_state *istate, + const char *path, struct attr_check *check) { int i; attr_check_reset(check); - collect_some_attrs(path, check); + collect_some_attrs(istate, path, check); for (i = 0; i < check->all_attrs_nr; i++) { const char *name = check->all_attrs[i].attr->name; |