static struct attr_stack *read_attr(const char *path, int macro_ok) { struct attr_stack *res = NULL; if (direction == GIT_ATTR_INDEX) { res = read_attr_from_index(path, macro_ok); } else if (!is_bare_repository()) { if (direction == GIT_ATTR_CHECKOUT) { res = read_attr_from_index(path, macro_ok); if (!res) res = read_attr_from_file(path, macro_ok); } else if (direction == GIT_ATTR_CHECKIN) { res = read_attr_from_file(path, macro_ok); if (!res) /* * There is no checked out .gitattributes file * there, but we might have it in the index. * We allow operation in a sparsely checked out * work tree, so read from it. */ res = read_attr_from_index(path, macro_ok); } } if (!res) res = xcalloc(1, sizeof(*res)); return res; }
static void bootstrap_attr_stack( int attr_stack, int builtin_attr, int git_attributes_file, int direction, int xdg_attributes_file) { int elem = 0; int elem_origin = 0; int elem_prev = 0; if (attr_stack) return; elem = read_attr_from_array(builtin_attr); elem_origin = NULL; elem_prev = attr_stack; attr_stack = elem; if (git_attr_system()) { elem = read_attr_from_file(git_etc_gitattributes(), 1); if (elem) { elem_origin = NULL; elem_prev = attr_stack; attr_stack = elem; } } if (!git_attributes_file) { home_config_paths(NULL, &xdg_attributes_file, "attributes"); git_attributes_file = xdg_attributes_file; } if (git_attributes_file) { elem = read_attr_from_file(git_attributes_file, 1); if (elem) { elem_origin = NULL; elem_prev = attr_stack; attr_stack = elem; } } if (!is_bare_repository() || direction == GIT_ATTR_INDEX) { elem = read_attr(GITATTRIBUTES_FILE, 1); elem_origin = xstrdup(""); elem_prev = attr_stack; attr_stack = elem; debug_push(elem); } elem = read_attr_from_file(git_path(INFOATTRIBUTES_FILE), 1); if (!elem) elem = xcalloc(1, sizeof(elem)); elem_origin = NULL; elem_prev = attr_stack; attr_stack = elem; }
static void bootstrap_attr_stack(const struct index_state *istate, struct attr_stack **stack) { struct attr_stack *e; if (*stack) return; /* builtin frame */ e = read_attr_from_array(builtin_attr); push_stack(stack, e, NULL, 0); /* system-wide frame */ if (git_attr_system()) { e = read_attr_from_file(git_xcode_gitattributes(), 1); push_stack(stack, e, NULL, 0); e = read_attr_from_file(git_etc_gitattributes(), 1); push_stack(stack, e, NULL, 0); } /* home directory */ if (get_home_gitattributes()) { e = read_attr_from_file(get_home_gitattributes(), 1); push_stack(stack, e, NULL, 0); } /* root directory */ e = read_attr(istate, GITATTRIBUTES_FILE, 1); push_stack(stack, e, xstrdup(""), 0); /* info frame */ if (startup_info->have_repository) e = read_attr_from_file(git_path_info_attributes(), 1); else e = NULL; if (!e) e = xcalloc(1, sizeof(struct attr_stack)); push_stack(stack, e, NULL, 0); }