Merge branch 'ta/config-set-2'

Update git_config() users with callback functions for a very narrow
scope with calls to config-set API that lets us query a single
variable.

* ta/config-set-2:
  builtin/apply.c: replace `git_config()` with `git_config_get_string_const()`
  merge-recursive.c: replace `git_config()` with `git_config_get_int()`
  ll-merge.c: refactor `read_merge_config()` to use `git_config_string()`
  fast-import.c: replace `git_config()` with `git_config_get_*()` family
  branch.c: replace `git_config()` with `git_config_get_string()
  alias.c: replace `git_config()` with `git_config_get_string()`
  imap-send.c: replace `git_config()` with `git_config_get_*()` family
  pager.c: replace `git_config()` with `git_config_get_value()`
  builtin/gc.c: replace `git_config()` with `git_config_get_*()` family
  rerere.c: replace `git_config()` with `git_config_get_*()` family
  fetchpack.c: replace `git_config()` with `git_config_get_*()` family
  archive.c: replace `git_config()` with `git_config_get_bool()` family
  read-cache.c: replace `git_config()` with `git_config_get_*()` family
  http-backend.c: replace `git_config()` with `git_config_get_bool()` family
  daemon.c: replace `git_config()` with `git_config_get_bool()` family
maint
Junio C Hamano 2014-09-11 10:33:26 -07:00
commit 554913daf4
15 changed files with 154 additions and 315 deletions

25
alias.c
View File

@ -1,26 +1,13 @@
#include "cache.h" #include "cache.h"


static const char *alias_key;
static char *alias_val;

static int alias_lookup_cb(const char *k, const char *v, void *cb)
{
const char *name;
if (skip_prefix(k, "alias.", &name) && !strcmp(name, alias_key)) {
if (!v)
return config_error_nonbool(k);
alias_val = xstrdup(v);
return 0;
}
return 0;
}

char *alias_lookup(const char *alias) char *alias_lookup(const char *alias)
{ {
alias_key = alias; char *v = NULL;
alias_val = NULL; struct strbuf key = STRBUF_INIT;
git_config(alias_lookup_cb, NULL); strbuf_addf(&key, "alias.%s", alias);
return alias_val; git_config_get_string(key.buf, &v);
strbuf_release(&key);
return v;
} }


#define SPLIT_CMDLINE_BAD_ENDING 1 #define SPLIT_CMDLINE_BAD_ENDING 1

View File

@ -402,14 +402,6 @@ static int parse_archive_args(int argc, const char **argv,
return argc; return argc;
} }


static int git_default_archive_config(const char *var, const char *value,
void *cb)
{
if (!strcmp(var, "uploadarchive.allowunreachable"))
remote_allow_unreachable = git_config_bool(var, value);
return git_default_config(var, value, cb);
}

int write_archive(int argc, const char **argv, const char *prefix, int write_archive(int argc, const char **argv, const char *prefix,
int setup_prefix, const char *name_hint, int remote) int setup_prefix, const char *name_hint, int remote)
{ {
@ -420,7 +412,9 @@ int write_archive(int argc, const char **argv, const char *prefix,
if (setup_prefix && prefix == NULL) if (setup_prefix && prefix == NULL)
prefix = setup_git_directory_gently(&nongit); prefix = setup_git_directory_gently(&nongit);


git_config(git_default_archive_config, NULL); git_config_get_bool("uploadarchive.allowunreachable", &remote_allow_unreachable);
git_config(git_default_config, NULL);

init_tar_archiver(); init_tar_archiver();
init_zip_archiver(); init_zip_archiver();



View File

@ -140,30 +140,17 @@ static int setup_tracking(const char *new_ref, const char *orig_ref,
return 0; return 0;
} }


struct branch_desc_cb {
const char *config_name;
const char *value;
};

static int read_branch_desc_cb(const char *var, const char *value, void *cb)
{
struct branch_desc_cb *desc = cb;
if (strcmp(desc->config_name, var))
return 0;
free((char *)desc->value);
return git_config_string(&desc->value, var, value);
}

int read_branch_desc(struct strbuf *buf, const char *branch_name) int read_branch_desc(struct strbuf *buf, const char *branch_name)
{ {
struct branch_desc_cb cb; char *v = NULL;
struct strbuf name = STRBUF_INIT; struct strbuf name = STRBUF_INIT;
strbuf_addf(&name, "branch.%s.description", branch_name); strbuf_addf(&name, "branch.%s.description", branch_name);
cb.config_name = name.buf; if (git_config_get_string(name.buf, &v)) {
cb.value = NULL; strbuf_release(&name);
git_config(read_branch_desc_cb, &cb); return -1;
if (cb.value) }
strbuf_addstr(buf, cb.value); strbuf_addstr(buf, v);
free(v);
strbuf_release(&name); strbuf_release(&name);
return 0; return 0;
} }

View File

@ -4274,13 +4274,11 @@ static int apply_patch(int fd, const char *filename, int options)
return 0; return 0;
} }


static int git_apply_config(const char *var, const char *value, void *cb) static void git_apply_config(void)
{ {
if (!strcmp(var, "apply.whitespace")) git_config_get_string_const("apply.whitespace", &apply_default_whitespace);
return git_config_string(&apply_default_whitespace, var, value); git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace);
else if (!strcmp(var, "apply.ignorewhitespace")) git_config(git_default_config, NULL);
return git_config_string(&apply_default_ignorewhitespace, var, value);
return git_default_config(var, value, cb);
} }


static int option_parse_exclude(const struct option *opt, static int option_parse_exclude(const struct option *opt,
@ -4428,7 +4426,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix_)


prefix = prefix_; prefix = prefix_;
prefix_length = prefix ? strlen(prefix) : 0; prefix_length = prefix ? strlen(prefix) : 0;
git_config(git_apply_config, NULL); git_apply_config();
if (apply_default_whitespace) if (apply_default_whitespace)
parse_whitespace_option(apply_default_whitespace); parse_whitespace_option(apply_default_whitespace);
if (apply_default_ignorewhitespace) if (apply_default_ignorewhitespace)

View File

@ -55,44 +55,33 @@ static void remove_pidfile_on_signal(int signo)
raise(signo); raise(signo);
} }


static int gc_config(const char *var, const char *value, void *cb) static void gc_config(void)
{ {
if (!strcmp(var, "gc.packrefs")) { const char *value;

if (!git_config_get_value("gc.packrefs", &value)) {
if (value && !strcmp(value, "notbare")) if (value && !strcmp(value, "notbare"))
pack_refs = -1; pack_refs = -1;
else else
pack_refs = git_config_bool(var, value); pack_refs = git_config_bool("gc.packrefs", value);
return 0;
} }
if (!strcmp(var, "gc.aggressivewindow")) {
aggressive_window = git_config_int(var, value); git_config_get_int("gc.aggressivewindow", &aggressive_window);
return 0; git_config_get_int("gc.aggressivedepth", &aggressive_depth);
} git_config_get_int("gc.auto", &gc_auto_threshold);
if (!strcmp(var, "gc.aggressivedepth")) { git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit);
aggressive_depth = git_config_int(var, value); git_config_get_bool("gc.autodetach", &detach_auto);
return 0;
} if (!git_config_get_string_const("gc.pruneexpire", &prune_expire)) {
if (!strcmp(var, "gc.auto")) { if (strcmp(prune_expire, "now")) {
gc_auto_threshold = git_config_int(var, value);
return 0;
}
if (!strcmp(var, "gc.autopacklimit")) {
gc_auto_pack_limit = git_config_int(var, value);
return 0;
}
if (!strcmp(var, "gc.autodetach")) {
detach_auto = git_config_bool(var, value);
return 0;
}
if (!strcmp(var, "gc.pruneexpire")) {
if (value && strcmp(value, "now")) {
unsigned long now = approxidate("now"); unsigned long now = approxidate("now");
if (approxidate(value) >= now) if (approxidate(prune_expire) >= now) {
return error(_("Invalid %s: '%s'"), var, value); git_die_config("gc.pruneexpire", _("Invalid gc.pruneexpire: '%s'"),
prune_expire);
}
} }
return git_config_string(&prune_expire, var, value);
} }
return git_default_config(var, value, cb); git_config(git_default_config, NULL);
} }


static int too_many_loose_objects(void) static int too_many_loose_objects(void)
@ -301,7 +290,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
argv_array_pushl(&prune, "prune", "--expire", NULL ); argv_array_pushl(&prune, "prune", "--expire", NULL );
argv_array_pushl(&rerere, "rerere", "gc", NULL); argv_array_pushl(&rerere, "rerere", "gc", NULL);


git_config(gc_config, NULL); gc_config();


if (pack_refs < 0) if (pack_refs < 0)
pack_refs = !is_bare_repository(); pack_refs = !is_bare_repository();

View File

@ -230,23 +230,6 @@ struct daemon_service {
int overridable; int overridable;
}; };


static struct daemon_service *service_looking_at;
static int service_enabled;

static int git_daemon_config(const char *var, const char *value, void *cb)
{
const char *service;

if (skip_prefix(var, "daemon.", &service) &&
!strcmp(service, service_looking_at->config_name)) {
service_enabled = git_config_bool(var, value);
return 0;
}

/* we are not interested in parsing any other configuration here */
return 0;
}

static int daemon_error(const char *dir, const char *msg) static int daemon_error(const char *dir, const char *msg)
{ {
if (!informative_errors) if (!informative_errors)
@ -324,6 +307,7 @@ static int run_service(const char *dir, struct daemon_service *service)
{ {
const char *path; const char *path;
int enabled = service->enabled; int enabled = service->enabled;
struct strbuf var = STRBUF_INIT;


loginfo("Request %s for '%s'", service->name, dir); loginfo("Request %s for '%s'", service->name, dir);


@ -354,11 +338,9 @@ static int run_service(const char *dir, struct daemon_service *service)
} }


if (service->overridable) { if (service->overridable) {
service_looking_at = service; strbuf_addf(&var, "daemon.%s", service->config_name);
service_enabled = -1; git_config_get_bool(var.buf, &enabled);
git_config(git_daemon_config, NULL); strbuf_release(&var);
if (0 <= service_enabled)
enabled = service_enabled;
} }
if (!enabled) { if (!enabled) {
logerror("'%s': service not enabled for '%s'", logerror("'%s': service not enabled for '%s'",

View File

@ -3274,36 +3274,34 @@ static void parse_option(const char *option)
die("This version of fast-import does not support option: %s", option); die("This version of fast-import does not support option: %s", option);
} }


static int git_pack_config(const char *k, const char *v, void *cb) static void git_pack_config(void)
{ {
if (!strcmp(k, "pack.depth")) { int indexversion_value;
max_depth = git_config_int(k, v); unsigned long packsizelimit_value;

if (!git_config_get_ulong("pack.depth", &max_depth)) {
if (max_depth > MAX_DEPTH) if (max_depth > MAX_DEPTH)
max_depth = MAX_DEPTH; max_depth = MAX_DEPTH;
return 0;
} }
if (!strcmp(k, "pack.compression")) { if (!git_config_get_int("pack.compression", &pack_compression_level)) {
int level = git_config_int(k, v); if (pack_compression_level == -1)
if (level == -1) pack_compression_level = Z_DEFAULT_COMPRESSION;
level = Z_DEFAULT_COMPRESSION; else if (pack_compression_level < 0 ||
else if (level < 0 || level > Z_BEST_COMPRESSION) pack_compression_level > Z_BEST_COMPRESSION)
die("bad pack compression level %d", level); git_die_config("pack.compression",
pack_compression_level = level; "bad pack compression level %d", pack_compression_level);
pack_compression_seen = 1; pack_compression_seen = 1;
return 0;
} }
if (!strcmp(k, "pack.indexversion")) { if (!git_config_get_int("pack.indexversion", &indexversion_value)) {
pack_idx_opts.version = git_config_int(k, v); pack_idx_opts.version = indexversion_value;
if (pack_idx_opts.version > 2) if (pack_idx_opts.version > 2)
die("bad pack.indexversion=%"PRIu32, git_die_config("pack.indexversion",
pack_idx_opts.version); "bad pack.indexversion=%"PRIu32, pack_idx_opts.version);
return 0;
} }
if (!strcmp(k, "pack.packsizelimit")) { if (!git_config_get_ulong("pack.packsizelimit", &packsizelimit_value))
max_packsize = git_config_ulong(k, v); max_packsize = packsizelimit_value;
return 0;
} git_config(git_default_config, NULL);
return git_default_config(k, v, cb);
} }


static const char fast_import_usage[] = static const char fast_import_usage[] =
@ -3356,7 +3354,7 @@ int main(int argc, char **argv)


setup_git_directory(); setup_git_directory();
reset_pack_idx_option(&pack_idx_opts); reset_pack_idx_option(&pack_idx_opts);
git_config(git_pack_config, NULL); git_pack_config();
if (!pack_compression_seen && core_compression_seen) if (!pack_compression_seen && core_compression_seen)
pack_compression_level = core_compression_level; pack_compression_level = core_compression_level;



View File

@ -869,34 +869,15 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
return ref; return ref;
} }


static int fetch_pack_config(const char *var, const char *value, void *cb) static void fetch_pack_config(void)
{ {
if (strcmp(var, "fetch.unpacklimit") == 0) { git_config_get_int("fetch.unpacklimit", &fetch_unpack_limit);
fetch_unpack_limit = git_config_int(var, value); git_config_get_int("transfer.unpacklimit", &transfer_unpack_limit);
return 0; git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta);
} git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects);
git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects);


if (strcmp(var, "transfer.unpacklimit") == 0) { git_config(git_default_config, NULL);
transfer_unpack_limit = git_config_int(var, value);
return 0;
}

if (strcmp(var, "repack.usedeltabaseoffset") == 0) {
prefer_ofs_delta = git_config_bool(var, value);
return 0;
}

if (!strcmp(var, "fetch.fsckobjects")) {
fetch_fsck_objects = git_config_bool(var, value);
return 0;
}

if (!strcmp(var, "transfer.fsckobjects")) {
transfer_fsck_objects = git_config_bool(var, value);
return 0;
}

return git_default_config(var, value, cb);
} }


static void fetch_pack_setup(void) static void fetch_pack_setup(void)
@ -904,7 +885,7 @@ static void fetch_pack_setup(void)
static int did_setup; static int did_setup;
if (did_setup) if (did_setup)
return; return;
git_config(fetch_pack_config, NULL); fetch_pack_config();
if (0 <= transfer_unpack_limit) if (0 <= transfer_unpack_limit)
unpack_limit = transfer_unpack_limit; unpack_limit = transfer_unpack_limit;
else if (0 <= fetch_unpack_limit) else if (0 <= fetch_unpack_limit)

View File

@ -219,29 +219,22 @@ static void get_idx_file(char *name)
send_local_file("application/x-git-packed-objects-toc", name); send_local_file("application/x-git-packed-objects-toc", name);
} }


static int http_config(const char *var, const char *value, void *cb) static void http_config(void)
{ {
const char *p; int i, value = 0;
struct strbuf var = STRBUF_INIT;


if (!strcmp(var, "http.getanyfile")) { git_config_get_bool("http.getanyfile", &getanyfile);
getanyfile = git_config_bool(var, value);
return 0; for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
struct rpc_service *svc = &rpc_service[i];
strbuf_addf(&var, "http.%s", svc->config_name);
if (!git_config_get_bool(var.buf, &value))
svc->enabled = value;
strbuf_reset(&var);
} }


if (skip_prefix(var, "http.", &p)) { strbuf_release(&var);
int i;

for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
struct rpc_service *svc = &rpc_service[i];
if (!strcmp(p, svc->config_name)) {
svc->enabled = git_config_bool(var, value);
return 0;
}
}
}

/* we are not interested in parsing any other configuration here */
return 0;
} }


static struct rpc_service *select_service(const char *name) static struct rpc_service *select_service(const char *name)
@ -627,7 +620,7 @@ int main(int argc, char **argv)
access("git-daemon-export-ok", F_OK) ) access("git-daemon-export-ok", F_OK) )
not_found("Repository not exported: '%s'", dir); not_found("Repository not exported: '%s'", dir);


git_config(http_config, NULL); http_config();
cmd->imp(cmd_arg); cmd->imp(cmd_arg);
return 0; return 0;
} }

View File

@ -1308,43 +1308,35 @@ static int split_msg(struct strbuf *all_msgs, struct strbuf *msg, int *ofs)


static char *imap_folder; static char *imap_folder;


static int git_imap_config(const char *key, const char *val, void *cb) static void git_imap_config(void)
{ {
if (!skip_prefix(key, "imap.", &key)) const char *val = NULL;
return 0;


/* check booleans first, and barf on others */ git_config_get_bool("imap.sslverify", &server.ssl_verify);
if (!strcmp("sslverify", key)) git_config_get_bool("imap.preformattedhtml", &server.use_html);
server.ssl_verify = git_config_bool(key, val); git_config_get_string("imap.folder", &imap_folder);
else if (!strcmp("preformattedhtml", key))
server.use_html = git_config_bool(key, val);
else if (!val)
return config_error_nonbool(key);


if (!strcmp("folder", key)) { if (!git_config_get_value("imap.host", &val)) {
imap_folder = xstrdup(val); if (!val) {
} else if (!strcmp("host", key)) { git_die_config("imap.host", "Missing value for 'imap.host'");
if (starts_with(val, "imap:")) } else {
val += 5; if (starts_with(val, "imap:"))
else if (starts_with(val, "imaps:")) { val += 5;
val += 6; else if (starts_with(val, "imaps:")) {
server.use_ssl = 1; val += 6;
server.use_ssl = 1;
}
if (starts_with(val, "//"))
val += 2;
server.host = xstrdup(val);
} }
if (starts_with(val, "//")) }
val += 2;
server.host = xstrdup(val);
} else if (!strcmp("user", key))
server.user = xstrdup(val);
else if (!strcmp("pass", key))
server.pass = xstrdup(val);
else if (!strcmp("port", key))
server.port = git_config_int(key, val);
else if (!strcmp("tunnel", key))
server.tunnel = xstrdup(val);
else if (!strcmp("authmethod", key))
server.auth_method = xstrdup(val);


return 0; git_config_get_string("imap.user", &server.user);
git_config_get_string("imap.pass", &server.pass);
git_config_get_int("imap.port", &server.port);
git_config_get_string("imap.tunnel", &server.tunnel);
git_config_get_string("imap.authmethod", &server.auth_method);
} }


int main(int argc, char **argv) int main(int argc, char **argv)
@ -1365,7 +1357,7 @@ int main(int argc, char **argv)
usage(imap_send_usage); usage(imap_send_usage);


setup_git_directory_gently(&nongit_ok); setup_git_directory_gently(&nongit_ok);
git_config(git_imap_config, NULL); git_imap_config();


if (!server.port) if (!server.port)
server.port = server.use_ssl ? 993 : 143; server.port = server.use_ssl ? 993 : 143;

View File

@ -225,11 +225,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)
const char *key, *name; const char *key, *name;
int namelen; int namelen;


if (!strcmp(var, "merge.default")) { if (!strcmp(var, "merge.default"))
if (value) return git_config_string(&default_ll_merge, var, value);
default_ll_merge = xstrdup(value);
return 0;
}


/* /*
* We are not interested in anything but "merge.<name>.variable"; * We are not interested in anything but "merge.<name>.variable";
@ -254,12 +251,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)
ll_user_merge_tail = &(fn->next); ll_user_merge_tail = &(fn->next);
} }


if (!strcmp("name", key)) { if (!strcmp("name", key))
if (!value) return git_config_string(&fn->description, var, value);
return error("%s: lacks value", var);
fn->description = xstrdup(value);
return 0;
}


if (!strcmp("driver", key)) { if (!strcmp("driver", key)) {
if (!value) if (!value)
@ -285,12 +278,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)
return 0; return 0;
} }


if (!strcmp("recursive", key)) { if (!strcmp("recursive", key))
if (!value) return git_config_string(&fn->recursive, var, value);
return error("%s: lacks value", var);
fn->recursive = xstrdup(value);
return 0;
}


return 0; return 0;
} }

View File

@ -2026,22 +2026,12 @@ int merge_recursive_generic(struct merge_options *o,
return clean ? 0 : 1; return clean ? 0 : 1;
} }


static int merge_recursive_config(const char *var, const char *value, void *cb) static void merge_recursive_config(struct merge_options *o)
{ {
struct merge_options *o = cb; git_config_get_int("merge.verbosity", &o->verbosity);
if (!strcmp(var, "merge.verbosity")) { git_config_get_int("diff.renamelimit", &o->diff_rename_limit);
o->verbosity = git_config_int(var, value); git_config_get_int("merge.renamelimit", &o->merge_rename_limit);
return 0; git_config(git_xmerge_config, NULL);
}
if (!strcmp(var, "diff.renamelimit")) {
o->diff_rename_limit = git_config_int(var, value);
return 0;
}
if (!strcmp(var, "merge.renamelimit")) {
o->merge_rename_limit = git_config_int(var, value);
return 0;
}
return git_xmerge_config(var, value, cb);
} }


void init_merge_options(struct merge_options *o) void init_merge_options(struct merge_options *o)
@ -2052,7 +2042,7 @@ void init_merge_options(struct merge_options *o)
o->diff_rename_limit = -1; o->diff_rename_limit = -1;
o->merge_rename_limit = -1; o->merge_rename_limit = -1;
o->renormalize = 0; o->renormalize = 0;
git_config(merge_recursive_config, o); merge_recursive_config(o);
if (getenv("GIT_MERGE_VERBOSITY")) if (getenv("GIT_MERGE_VERBOSITY"))
o->verbosity = o->verbosity =
strtol(getenv("GIT_MERGE_VERBOSITY"), NULL, 10); strtol(getenv("GIT_MERGE_VERBOSITY"), NULL, 10);

44
pager.c
View File

@ -6,12 +6,6 @@
#define DEFAULT_PAGER "less" #define DEFAULT_PAGER "less"
#endif #endif


struct pager_config {
const char *cmd;
int want;
char *value;
};

/* /*
* This is split up from the rest of git so that we can do * This is split up from the rest of git so that we can do
* something different on Windows. * something different on Windows.
@ -155,30 +149,22 @@ int decimal_width(int number)
return width; return width;
} }


static int pager_command_config(const char *var, const char *value, void *data)
{
struct pager_config *c = data;
if (starts_with(var, "pager.") && !strcmp(var + 6, c->cmd)) {
int b = git_config_maybe_bool(var, value);
if (b >= 0)
c->want = b;
else {
c->want = 1;
c->value = xstrdup(value);
}
}
return 0;
}

/* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */ /* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
int check_pager_config(const char *cmd) int check_pager_config(const char *cmd)
{ {
struct pager_config c; int want = -1;
c.cmd = cmd; struct strbuf key = STRBUF_INIT;
c.want = -1; const char *value = NULL;
c.value = NULL; strbuf_addf(&key, "pager.%s", cmd);
git_config(pager_command_config, &c); if (!git_config_get_value(key.buf, &value)) {
if (c.value) int b = git_config_maybe_bool(key.buf, value);
pager_program = c.value; if (b >= 0)
return c.want; want = b;
else {
want = 1;
pager_program = xstrdup(value);
}
}
strbuf_release(&key);
return want;
} }

View File

@ -1246,24 +1246,16 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,


#define INDEX_FORMAT_DEFAULT 3 #define INDEX_FORMAT_DEFAULT 3


static int index_format_config(const char *var, const char *value, void *cb)
{
unsigned int *version = cb;
if (!strcmp(var, "index.version")) {
*version = git_config_int(var, value);
return 0;
}
return 1;
}

static unsigned int get_index_format_default(void) static unsigned int get_index_format_default(void)
{ {
char *envversion = getenv("GIT_INDEX_VERSION"); char *envversion = getenv("GIT_INDEX_VERSION");
char *endp; char *endp;
int value;
unsigned int version = INDEX_FORMAT_DEFAULT; unsigned int version = INDEX_FORMAT_DEFAULT;


if (!envversion) { if (!envversion) {
git_config(index_format_config, &version); if (!git_config_get_int("index.version", &value))
version = value;
if (version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) { if (version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) {
warning(_("index.version set, but the value is invalid.\n" warning(_("index.version set, but the value is invalid.\n"
"Using version %i"), INDEX_FORMAT_DEFAULT); "Using version %i"), INDEX_FORMAT_DEFAULT);

View File

@ -573,15 +573,11 @@ static int do_plain_rerere(struct string_list *rr, int fd)
return write_rr(rr, fd); return write_rr(rr, fd);
} }


static int git_rerere_config(const char *var, const char *value, void *cb) static void git_rerere_config(void)
{ {
if (!strcmp(var, "rerere.enabled")) git_config_get_bool("rerere.enabled", &rerere_enabled);
rerere_enabled = git_config_bool(var, value); git_config_get_bool("rerere.autoupdate", &rerere_autoupdate);
else if (!strcmp(var, "rerere.autoupdate")) git_config(git_default_config, NULL);
rerere_autoupdate = git_config_bool(var, value);
else
return git_default_config(var, value, cb);
return 0;
} }


static int is_rerere_enabled(void) static int is_rerere_enabled(void)
@ -606,7 +602,7 @@ int setup_rerere(struct string_list *merge_rr, int flags)
{ {
int fd; int fd;


git_config(git_rerere_config, NULL); git_rerere_config();
if (!is_rerere_enabled()) if (!is_rerere_enabled())
return -1; return -1;


@ -699,24 +695,6 @@ static void unlink_rr_item(const char *name)
rmdir(git_path("rr-cache/%s", name)); rmdir(git_path("rr-cache/%s", name));
} }


struct rerere_gc_config_cb {
int cutoff_noresolve;
int cutoff_resolve;
};

static int git_rerere_gc_config(const char *var, const char *value, void *cb)
{
struct rerere_gc_config_cb *cf = cb;

if (!strcmp(var, "gc.rerereresolved"))
cf->cutoff_resolve = git_config_int(var, value);
else if (!strcmp(var, "gc.rerereunresolved"))
cf->cutoff_noresolve = git_config_int(var, value);
else
return git_default_config(var, value, cb);
return 0;
}

void rerere_gc(struct string_list *rr) void rerere_gc(struct string_list *rr)
{ {
struct string_list to_remove = STRING_LIST_INIT_DUP; struct string_list to_remove = STRING_LIST_INIT_DUP;
@ -724,9 +702,12 @@ void rerere_gc(struct string_list *rr)
struct dirent *e; struct dirent *e;
int i, cutoff; int i, cutoff;
time_t now = time(NULL), then; time_t now = time(NULL), then;
struct rerere_gc_config_cb cf = { 15, 60 }; int cutoff_noresolve = 15;
int cutoff_resolve = 60;


git_config(git_rerere_gc_config, &cf); git_config_get_int("gc.rerereresolved", &cutoff_resolve);
git_config_get_int("gc.rerereunresolved", &cutoff_noresolve);
git_config(git_default_config, NULL);
dir = opendir(git_path("rr-cache")); dir = opendir(git_path("rr-cache"));
if (!dir) if (!dir)
die_errno("unable to open rr-cache directory"); die_errno("unable to open rr-cache directory");
@ -736,12 +717,12 @@ void rerere_gc(struct string_list *rr)


then = rerere_last_used_at(e->d_name); then = rerere_last_used_at(e->d_name);
if (then) { if (then) {
cutoff = cf.cutoff_resolve; cutoff = cutoff_resolve;
} else { } else {
then = rerere_created_at(e->d_name); then = rerere_created_at(e->d_name);
if (!then) if (!then)
continue; continue;
cutoff = cf.cutoff_noresolve; cutoff = cutoff_noresolve;
} }
if (then < now - cutoff * 86400) if (then < now - cutoff * 86400)
string_list_append(&to_remove, e->d_name); string_list_append(&to_remove, e->d_name);