1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-05 03:36:31 +02:00

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;
}
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)) {

View File

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

View File

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

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];
}
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;
}

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)
{
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
View File

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