attr: convert git_check_attrs() callers to use the new API
The remaining callers are all simple "I have N attributes I am interested in. I'll ask about them with various paths one by one". After this step, no caller to git_check_attrs() remains. After removing it, we can extend "struct attr_check" struct with data that can be used in optimizing the query for the specific N attributes it contains. Signed-off-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7f8641112d
commit
2aef63d31c
24
archive.c
24
archive.c
@ -87,19 +87,6 @@ void *sha1_file_to_archive(const struct archiver_args *args,
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static void setup_archive_check(struct attr_check_item *check)
|
||||
{
|
||||
static struct git_attr *attr_export_ignore;
|
||||
static struct git_attr *attr_export_subst;
|
||||
|
||||
if (!attr_export_ignore) {
|
||||
attr_export_ignore = git_attr("export-ignore");
|
||||
attr_export_subst = git_attr("export-subst");
|
||||
}
|
||||
check[0].attr = attr_export_ignore;
|
||||
check[1].attr = attr_export_subst;
|
||||
}
|
||||
|
||||
struct directory {
|
||||
struct directory *up;
|
||||
struct object_id oid;
|
||||
@ -120,10 +107,10 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
|
||||
void *context)
|
||||
{
|
||||
static struct strbuf path = STRBUF_INIT;
|
||||
static struct attr_check *check;
|
||||
struct archiver_context *c = context;
|
||||
struct archiver_args *args = c->args;
|
||||
write_archive_entry_fn_t write_entry = c->write_entry;
|
||||
struct attr_check_item check[2];
|
||||
const char *path_without_prefix;
|
||||
int err;
|
||||
|
||||
@ -137,11 +124,12 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
|
||||
strbuf_addch(&path, '/');
|
||||
path_without_prefix = path.buf + args->baselen;
|
||||
|
||||
setup_archive_check(check);
|
||||
if (!git_check_attrs(path_without_prefix, ARRAY_SIZE(check), check)) {
|
||||
if (ATTR_TRUE(check[0].value))
|
||||
if (!check)
|
||||
check = attr_check_initl("export-ignore", "export-subst", NULL);
|
||||
if (!git_check_attr(path_without_prefix, check)) {
|
||||
if (ATTR_TRUE(check->items[0].value))
|
||||
return 0;
|
||||
args->convert = ATTR_TRUE(check[1].value);
|
||||
args->convert = ATTR_TRUE(check->items[1].value);
|
||||
}
|
||||
|
||||
if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
|
||||
|
@ -894,24 +894,15 @@ static void write_pack_file(void)
|
||||
written, nr_result);
|
||||
}
|
||||
|
||||
static void setup_delta_attr_check(struct attr_check_item *check)
|
||||
{
|
||||
static struct git_attr *attr_delta;
|
||||
|
||||
if (!attr_delta)
|
||||
attr_delta = git_attr("delta");
|
||||
|
||||
check[0].attr = attr_delta;
|
||||
}
|
||||
|
||||
static int no_try_delta(const char *path)
|
||||
{
|
||||
struct attr_check_item check[1];
|
||||
static struct attr_check *check;
|
||||
|
||||
setup_delta_attr_check(check);
|
||||
if (git_check_attrs(path, ARRAY_SIZE(check), check))
|
||||
if (!check)
|
||||
check = attr_check_initl("delta", NULL);
|
||||
if (git_check_attr(path, check))
|
||||
return 0;
|
||||
if (ATTR_FALSE(check->value))
|
||||
if (ATTR_FALSE(check->items[0].value))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
17
convert.c
17
convert.c
@ -1085,24 +1085,19 @@ struct conv_attrs {
|
||||
int ident;
|
||||
};
|
||||
|
||||
static const char *conv_attr_name[] = {
|
||||
"crlf", "ident", "filter", "eol", "text",
|
||||
};
|
||||
#define NUM_CONV_ATTRS ARRAY_SIZE(conv_attr_name)
|
||||
|
||||
static void convert_attrs(struct conv_attrs *ca, const char *path)
|
||||
{
|
||||
int i;
|
||||
static struct attr_check_item ccheck[NUM_CONV_ATTRS];
|
||||
static struct attr_check *check;
|
||||
|
||||
if (!ccheck[0].attr) {
|
||||
for (i = 0; i < NUM_CONV_ATTRS; i++)
|
||||
ccheck[i].attr = git_attr(conv_attr_name[i]);
|
||||
if (!check) {
|
||||
check = attr_check_initl("crlf", "ident", "filter",
|
||||
"eol", "text", NULL);
|
||||
user_convert_tail = &user_convert;
|
||||
git_config(read_convert_config, NULL);
|
||||
}
|
||||
|
||||
if (!git_check_attrs(path, NUM_CONV_ATTRS, ccheck)) {
|
||||
if (!git_check_attr(path, check)) {
|
||||
struct attr_check_item *ccheck = check->items;
|
||||
ca->crlf_action = git_path_check_crlf(ccheck + 4);
|
||||
if (ca->crlf_action == CRLF_UNDEFINED)
|
||||
ca->crlf_action = git_path_check_crlf(ccheck + 0);
|
||||
|
33
ll-merge.c
33
ll-merge.c
@ -336,15 +336,6 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr
|
||||
return &ll_merge_drv[LL_TEXT_MERGE];
|
||||
}
|
||||
|
||||
static int git_path_check_merge(const char *path, struct attr_check_item check[2])
|
||||
{
|
||||
if (!check[0].attr) {
|
||||
check[0].attr = git_attr("merge");
|
||||
check[1].attr = git_attr("conflict-marker-size");
|
||||
}
|
||||
return git_check_attrs(path, 2, check);
|
||||
}
|
||||
|
||||
static void normalize_file(mmfile_t *mm, const char *path)
|
||||
{
|
||||
struct strbuf strbuf = STRBUF_INIT;
|
||||
@ -362,7 +353,7 @@ int ll_merge(mmbuffer_t *result_buf,
|
||||
mmfile_t *theirs, const char *their_label,
|
||||
const struct ll_merge_options *opts)
|
||||
{
|
||||
static struct attr_check_item check[2];
|
||||
static struct attr_check *check;
|
||||
static const struct ll_merge_options default_opts;
|
||||
const char *ll_driver_name = NULL;
|
||||
int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
|
||||
@ -376,10 +367,14 @@ int ll_merge(mmbuffer_t *result_buf,
|
||||
normalize_file(ours, path);
|
||||
normalize_file(theirs, path);
|
||||
}
|
||||
if (!git_path_check_merge(path, check)) {
|
||||
ll_driver_name = check[0].value;
|
||||
if (check[1].value) {
|
||||
marker_size = atoi(check[1].value);
|
||||
|
||||
if (!check)
|
||||
check = attr_check_initl("merge", "conflict-marker-size", NULL);
|
||||
|
||||
if (!git_check_attr(path, check)) {
|
||||
ll_driver_name = check->items[0].value;
|
||||
if (check->items[1].value) {
|
||||
marker_size = atoi(check->items[1].value);
|
||||
if (marker_size <= 0)
|
||||
marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
|
||||
}
|
||||
@ -398,13 +393,13 @@ int ll_merge(mmbuffer_t *result_buf,
|
||||
|
||||
int ll_merge_marker_size(const char *path)
|
||||
{
|
||||
static struct attr_check_item check;
|
||||
static struct attr_check *check;
|
||||
int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
|
||||
|
||||
if (!check.attr)
|
||||
check.attr = git_attr("conflict-marker-size");
|
||||
if (!git_check_attrs(path, 1, &check) && check.value) {
|
||||
marker_size = atoi(check.value);
|
||||
if (!check)
|
||||
check = attr_check_initl("conflict-marker-size", NULL);
|
||||
if (!git_check_attr(path, check) && check->items[0].value) {
|
||||
marker_size = atoi(check->items[0].value);
|
||||
if (marker_size <= 0)
|
||||
marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
|
||||
}
|
||||
|
19
userdiff.c
19
userdiff.c
@ -262,25 +262,22 @@ struct userdiff_driver *userdiff_find_by_name(const char *name) {
|
||||
|
||||
struct userdiff_driver *userdiff_find_by_path(const char *path)
|
||||
{
|
||||
static struct git_attr *attr;
|
||||
struct attr_check_item check;
|
||||
|
||||
if (!attr)
|
||||
attr = git_attr("diff");
|
||||
check.attr = attr;
|
||||
static struct attr_check *check;
|
||||
|
||||
if (!check)
|
||||
check = attr_check_initl("diff", NULL);
|
||||
if (!path)
|
||||
return NULL;
|
||||
if (git_check_attrs(path, 1, &check))
|
||||
if (git_check_attr(path, check))
|
||||
return NULL;
|
||||
|
||||
if (ATTR_TRUE(check.value))
|
||||
if (ATTR_TRUE(check->items[0].value))
|
||||
return &driver_true;
|
||||
if (ATTR_FALSE(check.value))
|
||||
if (ATTR_FALSE(check->items[0].value))
|
||||
return &driver_false;
|
||||
if (ATTR_UNSET(check.value))
|
||||
if (ATTR_UNSET(check->items[0].value))
|
||||
return NULL;
|
||||
return userdiff_find_by_name(check.value);
|
||||
return userdiff_find_by_name(check->items[0].value);
|
||||
}
|
||||
|
||||
struct userdiff_driver *userdiff_get_textconv(struct userdiff_driver *driver)
|
||||
|
19
ws.c
19
ws.c
@ -71,24 +71,17 @@ unsigned parse_whitespace_rule(const char *string)
|
||||
return rule;
|
||||
}
|
||||
|
||||
static void setup_whitespace_attr_check(struct attr_check_item *check)
|
||||
{
|
||||
static struct git_attr *attr_whitespace;
|
||||
|
||||
if (!attr_whitespace)
|
||||
attr_whitespace = git_attr("whitespace");
|
||||
check[0].attr = attr_whitespace;
|
||||
}
|
||||
|
||||
unsigned whitespace_rule(const char *pathname)
|
||||
{
|
||||
struct attr_check_item attr_whitespace_rule;
|
||||
static struct attr_check *attr_whitespace_rule;
|
||||
|
||||
setup_whitespace_attr_check(&attr_whitespace_rule);
|
||||
if (!git_check_attrs(pathname, 1, &attr_whitespace_rule)) {
|
||||
if (!attr_whitespace_rule)
|
||||
attr_whitespace_rule = attr_check_initl("whitespace", NULL);
|
||||
|
||||
if (!git_check_attr(pathname, attr_whitespace_rule)) {
|
||||
const char *value;
|
||||
|
||||
value = attr_whitespace_rule.value;
|
||||
value = attr_whitespace_rule->items[0].value;
|
||||
if (ATTR_TRUE(value)) {
|
||||
/* true (whitespace) */
|
||||
unsigned all_rule = ws_tab_width(whitespace_rule_cfg);
|
||||
|
Loading…
Reference in New Issue
Block a user