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:
Junio C Hamano
2023-05-17 10:11:41 -07:00
16 changed files with 140 additions and 29 deletions

37
attr.c
View File

@ -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);