static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr) { struct ll_merge_driver *fn; const char *name; int i; initialize_ll_merge(); if (ATTR_TRUE(merge_attr)) return &ll_merge_drv[LL_TEXT_MERGE]; else if (ATTR_FALSE(merge_attr)) return &ll_merge_drv[LL_BINARY_MERGE]; else if (ATTR_UNSET(merge_attr)) { if (!default_ll_merge) return &ll_merge_drv[LL_TEXT_MERGE]; else name = default_ll_merge; } else name = merge_attr; for (fn = ll_user_merge; fn; fn = fn->next) if (!strcmp(fn->name, name)) return fn; for (i = 0; i < ARRAY_SIZE(ll_merge_drv); i++) if (!strcmp(ll_merge_drv[i].name, name)) return &ll_merge_drv[i]; /* default to the 3-way */ return &ll_merge_drv[LL_TEXT_MERGE]; }
static void output_attr(int cnt, struct git_attr_check *check, const char *file) { int j; for (j = 0; j < cnt; j++) { const char *value = check[j].value; if (ATTR_TRUE(value)) value = "set"; else if (ATTR_FALSE(value)) value = "unset"; else if (ATTR_UNSET(value)) value = "unspecified"; if (nul_term_line) { printf("%s%c" /* path */ "%s%c" /* attrname */ "%s%c" /* attrvalue */, file, 0, git_attr_name(check[j].attr), 0, value, 0); } else { quote_c_style(file, NULL, stdout, 0); printf(": %s: %s\n", git_attr_name(check[j].attr), value); } } }
unsigned whitespace_rule(const char *pathname) { static struct attr_check *attr_whitespace_rule; const char *value; if (!attr_whitespace_rule) attr_whitespace_rule = attr_check_initl("whitespace", NULL); git_check_attr(&the_index, pathname, attr_whitespace_rule); value = attr_whitespace_rule->items[0].value; if (ATTR_TRUE(value)) { /* true (whitespace) */ unsigned all_rule = ws_tab_width(whitespace_rule_cfg); int i; for (i = 0; i < ARRAY_SIZE(whitespace_rule_names); i++) if (!whitespace_rule_names[i].loosens_error && !whitespace_rule_names[i].exclude_default) all_rule |= whitespace_rule_names[i].rule_bits; return all_rule; } else if (ATTR_FALSE(value)) { /* false (-whitespace) */ return ws_tab_width(whitespace_rule_cfg); } else if (ATTR_UNSET(value)) { /* reset to default (!whitespace) */ return whitespace_rule_cfg; } else { /* string */ return parse_whitespace_rule(value); } }
unsigned whitespace_rule(const char *pathname) { struct git_attr_check attr_whitespace_rule; setup_whitespace_attr_check(&attr_whitespace_rule); if (!git_checkattr(pathname, 1, &attr_whitespace_rule)) { const char *value; value = attr_whitespace_rule.value; if (ATTR_TRUE(value)) { /* true (whitespace) */ unsigned all_rule = 0; int i; for (i = 0; i < ARRAY_SIZE(whitespace_rule_names); i++) if (!whitespace_rule_names[i].loosens_error) all_rule |= whitespace_rule_names[i].rule_bits; return all_rule; } else if (ATTR_FALSE(value)) { /* false (-whitespace) */ return 0; } else if (ATTR_UNSET(value)) { /* reset to default (!whitespace) */ return whitespace_rule_cfg; } else { /* string */ return parse_whitespace_rule(value); } } else { return whitespace_rule_cfg; } }
static void debug_set(const char *what, const char *match, struct git_attr *attr, const void *v) { const char *value = v; if (ATTR_TRUE(value)) value = "set"; else if (ATTR_FALSE(value)) value = "unset"; else if (ATTR_UNSET(value)) value = "unspecified"; fprintf(stderr, "%s: %s => %s (%s)\n", what, attr->name, (char *) value, match); }
static int skip_binary(struct grep_opt *opt, const char *filename) { if ((opt->binary & GREP_BINARY_NOMATCH)) { static struct git_attr *attr_text; struct git_attr_check check; if (!attr_text) attr_text = git_attr("text"); memset(&check, 0, sizeof(check)); check.attr = attr_text; return !git_check_attr(filename, 1, &check) && ATTR_FALSE(check.value); } return 0; }
static void output_attr(int cnt, struct git_attr_check *check, const char *file) { int j; for (j = 0; j < cnt; j++) { const char *value = check[j].value; if (ATTR_TRUE(value)) value = "set"; else if (ATTR_FALSE(value)) value = "unset"; else if (ATTR_UNSET(value)) value = "unspecified"; quote_c_style(file, NULL, stdout, 0); printf(": %s: %s\n", git_attr_name(check[j].attr), value); } }
struct userdiff_driver *userdiff_find_by_path(struct index_state *istate, const char *path) { static struct attr_check *check; if (!check) check = attr_check_initl("diff", NULL); if (!path) return NULL; git_check_attr(istate, path, check); if (ATTR_TRUE(check->items[0].value)) return &driver_true; if (ATTR_FALSE(check->items[0].value)) return &driver_false; if (ATTR_UNSET(check->items[0].value)) return NULL; return userdiff_find_by_name(check->items[0].value); }
static void check_attr(int cnt, struct git_attr_check *check, const char** name, const char *file) { int j; if (git_checkattr(file, cnt, check)) die("git_checkattr died"); for (j = 0; j < cnt; j++) { const char *value = check[j].value; if (ATTR_TRUE(value)) value = "set"; else if (ATTR_FALSE(value)) value = "unset"; else if (ATTR_UNSET(value)) value = "unspecified"; quote_c_style(file, NULL, stdout, 0); printf(": %s: %s\n", name[j], value); } }
struct userdiff_driver *userdiff_find_by_path(const char *path) { static struct git_attr *attr; struct git_attr_check check; if (!attr) attr = git_attr("diff"); check.attr = attr; if (!path) return NULL; if (git_checkattr(path, 1, &check)) return NULL; if (ATTR_TRUE(check.value)) return &driver_true; if (ATTR_FALSE(check.value)) return &driver_false; if (ATTR_UNSET(check.value)) return NULL; return userdiff_find_by_name(check.value); }