Merge branch 'jc/attr-source-tree'
"git --attr-source=<tree> cmd $args" is a new way to have any command to read attributes not from the working tree but from the given tree object. * jc/attr-source-tree: attr: teach "--attr-source=<tree>" global option to "git"
This commit is contained in:
37
attr.c
37
attr.c
@ -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);
|
||||
|
Reference in New Issue
Block a user