diff options
Diffstat (limited to 'attr.c')
-rw-r--r-- | attr.c | 37 |
1 files changed, 35 insertions, 2 deletions
@@ -21,6 +21,7 @@ #include "setup.h" #include "thread-utils.h" #include "tree-walk.h" +#include "object-name.h" const char git_attr__true[] = "(builtin)true"; const char git_attr__false[] = "\0(builtin)false"; @@ -1170,11 +1171,42 @@ static void collect_some_attrs(struct index_state *istate, fill(path, pathlen, basename_offset, check->stack, check->all_attrs, rem); } +static const char *default_attr_source_tree_object_name; + +void set_git_attr_source(const char *tree_object_name) +{ + default_attr_source_tree_object_name = xstrdup(tree_object_name); +} + +static void compute_default_attr_source(struct object_id *attr_source) +{ + if (!default_attr_source_tree_object_name) + default_attr_source_tree_object_name = getenv(GIT_ATTR_SOURCE_ENVIRONMENT); + + if (!default_attr_source_tree_object_name || !is_null_oid(attr_source)) + return; + + if (repo_get_oid_treeish(the_repository, default_attr_source_tree_object_name, attr_source)) + die(_("bad --attr-source or GIT_ATTR_SOURCE")); +} + +static struct object_id *default_attr_source(void) +{ + static struct object_id attr_source; + + if (is_null_oid(&attr_source)) + compute_default_attr_source(&attr_source); + if (is_null_oid(&attr_source)) + return NULL; + return &attr_source; +} + void git_check_attr(struct index_state *istate, - const struct object_id *tree_oid, const char *path, + const char *path, struct attr_check *check) { int i; + const struct object_id *tree_oid = default_attr_source(); collect_some_attrs(istate, tree_oid, path, check); @@ -1187,10 +1219,11 @@ void git_check_attr(struct index_state *istate, } } -void git_all_attrs(struct index_state *istate, const struct object_id *tree_oid, +void git_all_attrs(struct index_state *istate, const char *path, struct attr_check *check) { int i; + const struct object_id *tree_oid = default_attr_source(); attr_check_reset(check); collect_some_attrs(istate, tree_oid, path, check); |