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:
Junio C Hamano 2017-01-27 18:01:57 -08:00
parent 7f8641112d
commit 2aef63d31c
6 changed files with 45 additions and 86 deletions

View File

@ -87,19 +87,6 @@ void *sha1_file_to_archive(const struct archiver_args *args,
return buffer; 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 {
struct directory *up; struct directory *up;
struct object_id oid; struct object_id oid;
@ -120,10 +107,10 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
void *context) void *context)
{ {
static struct strbuf path = STRBUF_INIT; static struct strbuf path = STRBUF_INIT;
static struct attr_check *check;
struct archiver_context *c = context; struct archiver_context *c = context;
struct archiver_args *args = c->args; struct archiver_args *args = c->args;
write_archive_entry_fn_t write_entry = c->write_entry; write_archive_entry_fn_t write_entry = c->write_entry;
struct attr_check_item check[2];
const char *path_without_prefix; const char *path_without_prefix;
int err; int err;
@ -137,11 +124,12 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
strbuf_addch(&path, '/'); strbuf_addch(&path, '/');
path_without_prefix = path.buf + args->baselen; path_without_prefix = path.buf + args->baselen;
setup_archive_check(check); if (!check)
if (!git_check_attrs(path_without_prefix, ARRAY_SIZE(check), check)) { check = attr_check_initl("export-ignore", "export-subst", NULL);
if (ATTR_TRUE(check[0].value)) if (!git_check_attr(path_without_prefix, check)) {
if (ATTR_TRUE(check->items[0].value))
return 0; return 0;
args->convert = ATTR_TRUE(check[1].value); args->convert = ATTR_TRUE(check->items[1].value);
} }
if (S_ISDIR(mode) || S_ISGITLINK(mode)) { if (S_ISDIR(mode) || S_ISGITLINK(mode)) {

View File

@ -894,24 +894,15 @@ static void write_pack_file(void)
written, nr_result); 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) 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 (!check)
if (git_check_attrs(path, ARRAY_SIZE(check), check)) check = attr_check_initl("delta", NULL);
if (git_check_attr(path, check))
return 0; return 0;
if (ATTR_FALSE(check->value)) if (ATTR_FALSE(check->items[0].value))
return 1; return 1;
return 0; return 0;
} }

View File

@ -1085,24 +1085,19 @@ struct conv_attrs {
int ident; 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) static void convert_attrs(struct conv_attrs *ca, const char *path)
{ {
int i; static struct attr_check *check;
static struct attr_check_item ccheck[NUM_CONV_ATTRS];
if (!ccheck[0].attr) { if (!check) {
for (i = 0; i < NUM_CONV_ATTRS; i++) check = attr_check_initl("crlf", "ident", "filter",
ccheck[i].attr = git_attr(conv_attr_name[i]); "eol", "text", NULL);
user_convert_tail = &user_convert; user_convert_tail = &user_convert;
git_config(read_convert_config, NULL); 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); ca->crlf_action = git_path_check_crlf(ccheck + 4);
if (ca->crlf_action == CRLF_UNDEFINED) if (ca->crlf_action == CRLF_UNDEFINED)
ca->crlf_action = git_path_check_crlf(ccheck + 0); ca->crlf_action = git_path_check_crlf(ccheck + 0);

View File

@ -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]; 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) static void normalize_file(mmfile_t *mm, const char *path)
{ {
struct strbuf strbuf = STRBUF_INIT; struct strbuf strbuf = STRBUF_INIT;
@ -362,7 +353,7 @@ int ll_merge(mmbuffer_t *result_buf,
mmfile_t *theirs, const char *their_label, mmfile_t *theirs, const char *their_label,
const struct ll_merge_options *opts) 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; static const struct ll_merge_options default_opts;
const char *ll_driver_name = NULL; const char *ll_driver_name = NULL;
int marker_size = DEFAULT_CONFLICT_MARKER_SIZE; int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
@ -376,10 +367,14 @@ int ll_merge(mmbuffer_t *result_buf,
normalize_file(ours, path); normalize_file(ours, path);
normalize_file(theirs, path); normalize_file(theirs, path);
} }
if (!git_path_check_merge(path, check)) {
ll_driver_name = check[0].value; if (!check)
if (check[1].value) { check = attr_check_initl("merge", "conflict-marker-size", NULL);
marker_size = atoi(check[1].value);
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) if (marker_size <= 0)
marker_size = DEFAULT_CONFLICT_MARKER_SIZE; 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) 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; int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
if (!check.attr) if (!check)
check.attr = git_attr("conflict-marker-size"); check = attr_check_initl("conflict-marker-size", NULL);
if (!git_check_attrs(path, 1, &check) && check.value) { if (!git_check_attr(path, check) && check->items[0].value) {
marker_size = atoi(check.value); marker_size = atoi(check->items[0].value);
if (marker_size <= 0) if (marker_size <= 0)
marker_size = DEFAULT_CONFLICT_MARKER_SIZE; marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
} }

View File

@ -262,25 +262,22 @@ struct userdiff_driver *userdiff_find_by_name(const char *name) {
struct userdiff_driver *userdiff_find_by_path(const char *path) struct userdiff_driver *userdiff_find_by_path(const char *path)
{ {
static struct git_attr *attr; static struct attr_check *check;
struct attr_check_item check;
if (!attr)
attr = git_attr("diff");
check.attr = attr;
if (!check)
check = attr_check_initl("diff", NULL);
if (!path) if (!path)
return NULL; return NULL;
if (git_check_attrs(path, 1, &check)) if (git_check_attr(path, check))
return NULL; return NULL;
if (ATTR_TRUE(check.value)) if (ATTR_TRUE(check->items[0].value))
return &driver_true; return &driver_true;
if (ATTR_FALSE(check.value)) if (ATTR_FALSE(check->items[0].value))
return &driver_false; return &driver_false;
if (ATTR_UNSET(check.value)) if (ATTR_UNSET(check->items[0].value))
return NULL; 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) struct userdiff_driver *userdiff_get_textconv(struct userdiff_driver *driver)

19
ws.c
View File

@ -71,24 +71,17 @@ unsigned parse_whitespace_rule(const char *string)
return rule; 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) 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 (!attr_whitespace_rule)
if (!git_check_attrs(pathname, 1, &attr_whitespace_rule)) { attr_whitespace_rule = attr_check_initl("whitespace", NULL);
if (!git_check_attr(pathname, attr_whitespace_rule)) {
const char *value; const char *value;
value = attr_whitespace_rule.value; value = attr_whitespace_rule->items[0].value;
if (ATTR_TRUE(value)) { if (ATTR_TRUE(value)) {
/* true (whitespace) */ /* true (whitespace) */
unsigned all_rule = ws_tab_width(whitespace_rule_cfg); unsigned all_rule = ws_tab_width(whitespace_rule_cfg);