static int fsck_config(const char *var, const char *value, void *cb) { if (strcmp(var, "fsck.skiplist") == 0) { const char *path; struct strbuf sb = STRBUF_INIT; if (git_config_pathname(&path, var, value)) return 1; strbuf_addf(&sb, "skiplist=%s", path); free((char *)path); fsck_set_msg_types(&fsck_obj_options, sb.buf); strbuf_release(&sb); return 0; } if (skip_prefix(var, "fsck.", &var)) { fsck_set_msg_type(&fsck_obj_options, var, value); return 0; } return git_default_config(var, value, cb); }
void fsck_set_msg_types(struct fsck_options *options, const char *values) { char *buf = xstrdup(values), *to_free = buf; int done = 0; while (!done) { int len = strcspn(buf, " ,|"), equal; done = !buf[len]; if (!len) { buf++; continue; } buf[len] = '\0'; for (equal = 0; equal < len && buf[equal] != '=' && buf[equal] != ':'; equal++) buf[equal] = tolower(buf[equal]); buf[equal] = '\0'; if (!strcmp(buf, "skiplist")) { if (equal == len) die("skiplist requires a path"); init_skiplist(options, buf + equal + 1); buf += len + 1; continue; } if (equal == len) die("Missing '=': '%s'", buf); fsck_set_msg_type(options, buf, buf + equal + 1); buf += len + 1; } free(to_free); }