{"thread":{"id":"37341","subject":"[PATCH 1/4] fast-import.c: replace `git_config()` with `git_config_get_*()` family","startedAt":"2014-08-13T08:21:59Z","lastAt":"2014-08-13T17:18:40Z","messageCount":19,"participants":["Tanay Abhra","Matthieu Moy","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":4},"messages":[{"id":"247643","messageId":"1407918122-29973-1-git-send-email-tanayabh@gmail.com","threadId":"37341","inReplyTo":null,"subject":"[PATCH 1/4] fast-import.c: replace `git_config()` with `git_config_get_*()` family","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T08:21:59Z","receivedAt":"2014-08-13T08:21:59Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"Use `git_config_get_*()` family instead of `git_config()` to take\nadvantage of the config-set API which provides a cleaner control flow.\n\nSigned-off-by: Tanay Abhra <tanayabh@gmail.com>\n---\n fast-import.c | 42 +++++++++++++++++++-----------------------\n 1 file changed, 19 insertions(+), 23 deletions(-)\n\ndiff --git a/fast-import.c b/fast-import.c\nindex d73f58c..eca5ed4 100644\n--- a/fast-import.c\n+++ b/fast-import.c\n@@ -3274,36 +3274,32 @@ static void parse_option(const char *option)\n \tdie(\"This version of fast-import does not support option: %s\", option);\n }\n \n-static int git_pack_config(const char *k, const char *v, void *cb)\n+static void git_pack_config(void)\n {\n-\tif (!strcmp(k, \"pack.depth\")) {\n-\t\tmax_depth = git_config_int(k, v);\n+\tint indexversion_value;\n+\tunsigned long packsizelimit_value;\n+\n+\tif (!git_config_get_ulong(\"pack.depth\", &max_depth)) {\n \t\tif (max_depth > MAX_DEPTH)\n \t\t\tmax_depth = MAX_DEPTH;\n-\t\treturn 0;\n \t}\n-\tif (!strcmp(k, \"pack.compression\")) {\n-\t\tint level = git_config_int(k, v);\n-\t\tif (level == -1)\n-\t\t\tlevel = Z_DEFAULT_COMPRESSION;\n-\t\telse if (level < 0 || level > Z_BEST_COMPRESSION)\n-\t\t\tdie(\"bad pack compression level %d\", level);\n-\t\tpack_compression_level = level;\n+\tif (!git_config_get_int(\"pack.compression\", &pack_compression_level)) {\n+\t\tif (pack_compression_level == -1)\n+\t\t\tpack_compression_level = Z_DEFAULT_COMPRESSION;\n+\t\telse if (pack_compression_level < 0 ||\n+\t\t\t pack_compression_level > Z_BEST_COMPRESSION)\n+\t\t\tdie(\"bad pack compression level %d\", pack_compression_level);\n \t\tpack_compression_seen = 1;\n-\t\treturn 0;\n \t}\n-\tif (!strcmp(k, \"pack.indexversion\")) {\n-\t\tpack_idx_opts.version = git_config_int(k, v);\n+\tif (!git_config_get_int(\"pack.indexversion\", &indexversion_value)) {\n+\t\tpack_idx_opts.version = indexversion_value;\n \t\tif (pack_idx_opts.version > 2)\n-\t\t\tdie(\"bad pack.indexversion=%\"PRIu32,\n-\t\t\t    pack_idx_opts.version);\n-\t\treturn 0;\n+\t\t\tdie(\"bad pack.indexversion=%\"PRIu32, pack_idx_opts.version);\n \t}\n-\tif (!strcmp(k, \"pack.packsizelimit\")) {\n-\t\tmax_packsize = git_config_ulong(k, v);\n-\t\treturn 0;\n-\t}\n-\treturn git_default_config(k, v, cb);\n+\tif (!git_config_get_ulong(\"pack.packsizelimit\", &packsizelimit_value))\n+\t\tmax_packsize = packsizelimit_value;\n+\n+\tgit_config(git_default_config, NULL);\n }\n \n static const char fast_import_usage[] =\n@@ -3356,7 +3352,7 @@ int main(int argc, char **argv)\n \n \tsetup_git_directory();\n \treset_pack_idx_option(&pack_idx_opts);\n-\tgit_config(git_pack_config, NULL);\n+\tgit_pack_config();\n \tif (!pack_compression_seen && core_compression_seen)\n \t\tpack_compression_level = core_compression_level;\n \n-- \n1.9.0.GIT\n"},{"id":"247644","messageId":"1407918122-29973-2-git-send-email-tanayabh@gmail.com","threadId":"37341","inReplyTo":"1407918122-29973-1-git-send-email-tanayabh@gmail.com","subject":"[PATCH 2/4] ll-merge.c: refactor `read_merge_config()` to use `git_config_string()`","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T08:22:00Z","receivedAt":"2014-08-13T08:22:00Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"Signed-off-by: Tanay Abhra <tanayabh@gmail.com>\n---\n ll-merge.c | 23 ++++++-----------------\n 1 file changed, 6 insertions(+), 17 deletions(-)\n\ndiff --git a/ll-merge.c b/ll-merge.c\nindex fb61ea6..8ea03e5 100644\n--- a/ll-merge.c\n+++ b/ll-merge.c\n@@ -225,11 +225,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n \tconst char *key, *name;\n \tint namelen;\n \n-\tif (!strcmp(var, \"merge.default\")) {\n-\t\tif (value)\n-\t\t\tdefault_ll_merge = xstrdup(value);\n-\t\treturn 0;\n-\t}\n+\tif (!strcmp(var, \"merge.default\"))\n+\t\treturn git_config_string(&default_ll_merge, var, value);\n \n \t/*\n \t * We are not interested in anything but \"merge.<name>.variable\";\n@@ -254,12 +251,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n \t\tll_user_merge_tail = &(fn->next);\n \t}\n \n-\tif (!strcmp(\"name\", key)) {\n-\t\tif (!value)\n-\t\t\treturn error(\"%s: lacks value\", var);\n-\t\tfn->description = xstrdup(value);\n-\t\treturn 0;\n-\t}\n+\tif (!strcmp(\"name\", key))\n+\t\treturn git_config_string(&fn->description, var, value);\n \n \tif (!strcmp(\"driver\", key)) {\n \t\tif (!value)\n@@ -285,12 +278,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n \t\treturn 0;\n \t}\n \n-\tif (!strcmp(\"recursive\", key)) {\n-\t\tif (!value)\n-\t\t\treturn error(\"%s: lacks value\", var);\n-\t\tfn->recursive = xstrdup(value);\n-\t\treturn 0;\n-\t}\n+\tif (!strcmp(\"recursive\", key))\n+\t\treturn git_config_string(&fn->recursive, var, value);\n \n \treturn 0;\n }\n-- \n1.9.0.GIT\n"},{"id":"247645","messageId":"1407918122-29973-3-git-send-email-tanayabh@gmail.com","threadId":"37341","inReplyTo":"1407918122-29973-1-git-send-email-tanayabh@gmail.com","subject":"[PATCH 3/4] merge-recursive.c: replace `git_config()` with `git_config_get_int()`","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T08:22:01Z","receivedAt":"2014-08-13T08:22:01Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"Use `git_config_get_int()` instead of `git_config()` to take advantage\nof the config-set API which provides a cleaner control flow.\n\nSigned-off-by: Tanay Abhra <tanayabh@gmail.com>\n---\n merge-recursive.c | 22 ++++++----------------\n 1 file changed, 6 insertions(+), 16 deletions(-)\n\ndiff --git a/merge-recursive.c b/merge-recursive.c\nindex 1d332b8..8ab944c 100644\n--- a/merge-recursive.c\n+++ b/merge-recursive.c\n@@ -2026,22 +2026,12 @@ int merge_recursive_generic(struct merge_options *o,\n \treturn clean ? 0 : 1;\n }\n \n-static int merge_recursive_config(const char *var, const char *value, void *cb)\n+static void merge_recursive_config(struct merge_options *o)\n {\n-\tstruct merge_options *o = cb;\n-\tif (!strcmp(var, \"merge.verbosity\")) {\n-\t\to->verbosity = git_config_int(var, value);\n-\t\treturn 0;\n-\t}\n-\tif (!strcmp(var, \"diff.renamelimit\")) {\n-\t\to->diff_rename_limit = git_config_int(var, value);\n-\t\treturn 0;\n-\t}\n-\tif (!strcmp(var, \"merge.renamelimit\")) {\n-\t\to->merge_rename_limit = git_config_int(var, value);\n-\t\treturn 0;\n-\t}\n-\treturn git_xmerge_config(var, value, cb);\n+\tgit_config_get_int(\"merge.verbosity\", &o->verbosity);\n+\tgit_config_get_int(\"diff.renamelimit\", &o->diff_rename_limit);\n+\tgit_config_get_int(\"merge.renamelimit\", &o->merge_rename_limit);\n+\tgit_config(git_xmerge_config, NULL);\n }\n \n void init_merge_options(struct merge_options *o)\n@@ -2052,7 +2042,7 @@ void init_merge_options(struct merge_options *o)\n \to->diff_rename_limit = -1;\n \to->merge_rename_limit = -1;\n \to->renormalize = 0;\n-\tgit_config(merge_recursive_config, o);\n+\tmerge_recursive_config(o);\n \tif (getenv(\"GIT_MERGE_VERBOSITY\"))\n \t\to->verbosity =\n \t\t\tstrtol(getenv(\"GIT_MERGE_VERBOSITY\"), NULL, 10);\n-- \n1.9.0.GIT\n"},{"id":"247646","messageId":"1407918122-29973-4-git-send-email-tanayabh@gmail.com","threadId":"37341","inReplyTo":"1407918122-29973-1-git-send-email-tanayabh@gmail.com","subject":"[PATCH 4/4] builtin/apply.c: replace `git_config()` with `git_config_get_string_const()`","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T08:22:02Z","receivedAt":"2014-08-13T08:22:02Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"Use `git_config_get_string_const()` instead of `git_config()` to take\nadvantage of the config-set API which provides a cleaner control flow.\n\nSigned-off-by: Tanay Abhra <tanayabh@gmail.com>\n---\n builtin/apply.c | 12 +++++-------\n 1 file changed, 5 insertions(+), 7 deletions(-)\n\ndiff --git a/builtin/apply.c b/builtin/apply.c\nindex be2b4ce..66acf32 100644\n--- a/builtin/apply.c\n+++ b/builtin/apply.c\n@@ -4269,13 +4269,11 @@ static int apply_patch(int fd, const char *filename, int options)\n \treturn 0;\n }\n \n-static int git_apply_config(const char *var, const char *value, void *cb)\n+static void git_apply_config(void)\n {\n-\tif (!strcmp(var, \"apply.whitespace\"))\n-\t\treturn git_config_string(&apply_default_whitespace, var, value);\n-\telse if (!strcmp(var, \"apply.ignorewhitespace\"))\n-\t\treturn git_config_string(&apply_default_ignorewhitespace, var, value);\n-\treturn git_default_config(var, value, cb);\n+\tgit_config_get_string_const(\"apply.whitespace\", &apply_default_whitespace);\n+\tgit_config_get_string_const(\"apply.ignorewhitespace\", &apply_default_ignorewhitespace);\n+\tgit_config(git_default_config, NULL);\n }\n \n static int option_parse_exclude(const struct option *opt,\n@@ -4423,7 +4421,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix_)\n \n \tprefix = prefix_;\n \tprefix_length = prefix ? strlen(prefix) : 0;\n-\tgit_config(git_apply_config, NULL);\n+\tgit_apply_config();\n \tif (apply_default_whitespace)\n \t\tparse_whitespace_option(apply_default_whitespace);\n \tif (apply_default_ignorewhitespace)\n-- \n1.9.0.GIT\n"},{"id":"247657","messageId":"vpqppg4vdii.fsf@anie.imag.fr","threadId":"37341","inReplyTo":"1407918122-29973-1-git-send-email-tanayabh@gmail.com","subject":"Re: [PATCH 1/4] fast-import.c: replace `git_config()` with `git_config_get_*()` family","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2014-08-13T11:24:05Z","receivedAt":"2014-08-13T11:24:05Z","isPatch":true,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n>  fast-import.c | 42 +++++++++++++++++++-----------------------\n>  1 file changed, 19 insertions(+), 23 deletions(-)\n\nOnly 4 lines less, how disappointing ;-).\n\nMore seriously, the old code was essentially dealing with special\nvalues, which your new code needs to do too, so you can hardly do any\nless.\n\n> +\tif (!git_config_get_int(\"pack.compression\", &pack_compression_level)) {\n> +\t\tif (pack_compression_level == -1)\n> +\t\t\tpack_compression_level = Z_DEFAULT_COMPRESSION;\n> +\t\telse if (pack_compression_level < 0 ||\n> +\t\t\t pack_compression_level > Z_BEST_COMPRESSION)\n> +\t\t\tdie(\"bad pack compression level %d\", pack_compression_level);\n\nThat would be a good use for git_die_config(), to give a better error\nmessage, right?\n\n> -\tif (!strcmp(k, \"pack.indexversion\")) {\n> -\t\tpack_idx_opts.version = git_config_int(k, v);\n> +\tif (!git_config_get_int(\"pack.indexversion\", &indexversion_value)) {\n> +\t\tpack_idx_opts.version = indexversion_value;\n\nI wondered why you were not assigning to pack_idx_opts.version directly,\nbut pack_idx_opts.version is uint32 and you don't have\nconfig_get_uint32, so it's OK.\n\n>  \t\tif (pack_idx_opts.version > 2)\n> -\t\t\tdie(\"bad pack.indexversion=%\"PRIu32,\n> -\t\t\t    pack_idx_opts.version);\n> -\t\treturn 0;\n> +\t\t\tdie(\"bad pack.indexversion=%\"PRIu32, pack_idx_opts.version);\n\nOne more opportunity for git_die_config()?\n\nNot that it's terribly important, but I think it's good that your\nrefactoring also brings a few end-users benefits. It will help you show\noff when you tell your friends what you did this summer (not \"I did\nuseless code churn\" ;-) ), and helps everybody see the benefits of your\nGSoC ;-).\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"247658","messageId":"vpqfvh0vd4a.fsf@anie.imag.fr","threadId":"37341","inReplyTo":"1407918122-29973-2-git-send-email-tanayabh@gmail.com","subject":"Re: [PATCH 2/4] ll-merge.c: refactor `read_merge_config()` to use `git_config_string()`","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2014-08-13T11:32:37Z","receivedAt":"2014-08-13T11:32:37Z","isPatch":true,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n> Signed-off-by: Tanay Abhra <tanayabh@gmail.com>\n> ---\n>  ll-merge.c | 23 ++++++-----------------\n>  1 file changed, 6 insertions(+), 17 deletions(-)\n>\n> diff --git a/ll-merge.c b/ll-merge.c\n> index fb61ea6..8ea03e5 100644\n> --- a/ll-merge.c\n> +++ b/ll-merge.c\n> @@ -225,11 +225,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n>  \tconst char *key, *name;\n>  \tint namelen;\n>  \n> -\tif (!strcmp(var, \"merge.default\")) {\n> -\t\tif (value)\n> -\t\t\tdefault_ll_merge = xstrdup(value);\n> -\t\treturn 0;\n> -\t}\n> +\tif (!strcmp(var, \"merge.default\"))\n> +\t\treturn git_config_string(&default_ll_merge, var, value);\n\nPreviously, merge.default without value was a no-op. It's now an error.\n\nI think it makes perfect sense, but should be documented in the log\nmessage.\n\nAlso, I think you should explain briefly the reason for not using your\nnon-callback API here.\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"247659","messageId":"vpq7g2cvd10.fsf@anie.imag.fr","threadId":"37341","inReplyTo":"1407918122-29973-3-git-send-email-tanayabh@gmail.com","subject":"Re: [PATCH 3/4] merge-recursive.c: replace `git_config()` with `git_config_get_int()`","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2014-08-13T11:34:35Z","receivedAt":"2014-08-13T11:34:35Z","isPatch":true,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n>  merge-recursive.c | 22 ++++++----------------\n>  1 file changed, 6 insertions(+), 16 deletions(-)\n\n>  builtin/apply.c | 12 +++++-------\n>  1 file changed, 5 insertions(+), 7 deletions(-)\n\nThese two look straightforward and good.\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"247660","messageId":"53EB55F7.9060508@gmail.com","threadId":"37341","inReplyTo":"vpqppg4vdii.fsf@anie.imag.fr","subject":"Re: [PATCH 1/4] fast-import.c: replace `git_config()` with `git_config_get_*()` family","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T12:11:35Z","receivedAt":"2014-08-13T12:11:35Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":">>  \t\tif (pack_idx_opts.version > 2)\n>> -\t\t\tdie(\"bad pack.indexversion=%\"PRIu32,\n>> -\t\t\t    pack_idx_opts.version);\n>> -\t\treturn 0;\n>> +\t\t\tdie(\"bad pack.indexversion=%\"PRIu32, pack_idx_opts.version);\n> \n> One more opportunity for git_die_config()?\n>\n\nYup, I had thought of changing that and above to git_die_config(), but didn't do\nit, will send a revised patch.\n\n\n> Not that it's terribly important, but I think it's good that your\n> refactoring also brings a few end-users benefits. It will help you show\n\nI have been rewriting callers and the law of diminishing returns kicked in. I had\nrewritten some other call sites but I didn't see them bringing any benefits (cleaner\ncontrol flow, less lines, bugs eliminated), so I left them out.\n\n> off when you tell your friends what you did this summer (not \"I did\n> useless code churn\" ;-) ), and helps everybody see the benefits of your\n> GSoC ;-).\n>\n"},{"id":"247661","messageId":"53EB58A0.10307@gmail.com","threadId":"37341","inReplyTo":"vpqppg4vdii.fsf@anie.imag.fr","subject":"[PATCH v2 1/5] fast-import.c: replace `git_config()` with `git_config_get_*()` family","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T12:22:56Z","receivedAt":"2014-08-13T12:22:56Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"Use `git_config_get_*()` family instead of `git_config()` to take\nadvantage of the config-set API which provides a cleaner control flow.\n\nSigned-off-by: Tanay Abhra <tanayabh@gmail.com>\n---\n fast-import.c | 44 +++++++++++++++++++++-----------------------\n 1 file changed, 21 insertions(+), 23 deletions(-)\n\ndiff --git a/fast-import.c b/fast-import.c\nindex d73f58c..34e780d 100644\n--- a/fast-import.c\n+++ b/fast-import.c\n@@ -3274,36 +3274,34 @@ static void parse_option(const char *option)\n \tdie(\"This version of fast-import does not support option: %s\", option);\n }\n\n-static int git_pack_config(const char *k, const char *v, void *cb)\n+static void git_pack_config(void)\n {\n-\tif (!strcmp(k, \"pack.depth\")) {\n-\t\tmax_depth = git_config_int(k, v);\n+\tint indexversion_value;\n+\tunsigned long packsizelimit_value;\n+\n+\tif (!git_config_get_ulong(\"pack.depth\", &max_depth)) {\n \t\tif (max_depth > MAX_DEPTH)\n \t\t\tmax_depth = MAX_DEPTH;\n-\t\treturn 0;\n \t}\n-\tif (!strcmp(k, \"pack.compression\")) {\n-\t\tint level = git_config_int(k, v);\n-\t\tif (level == -1)\n-\t\t\tlevel = Z_DEFAULT_COMPRESSION;\n-\t\telse if (level < 0 || level > Z_BEST_COMPRESSION)\n-\t\t\tdie(\"bad pack compression level %d\", level);\n-\t\tpack_compression_level = level;\n+\tif (!git_config_get_int(\"pack.compression\", &pack_compression_level)) {\n+\t\tif (pack_compression_level == -1)\n+\t\t\tpack_compression_level = Z_DEFAULT_COMPRESSION;\n+\t\telse if (pack_compression_level < 0 ||\n+\t\t\t pack_compression_level > Z_BEST_COMPRESSION)\n+\t\t\tgit_die_config(\"pack.compression\",\n+\t\t\t\t\t\"bad pack compression level %d\", pack_compression_level);\n \t\tpack_compression_seen = 1;\n-\t\treturn 0;\n \t}\n-\tif (!strcmp(k, \"pack.indexversion\")) {\n-\t\tpack_idx_opts.version = git_config_int(k, v);\n+\tif (!git_config_get_int(\"pack.indexversion\", &indexversion_value)) {\n+\t\tpack_idx_opts.version = indexversion_value;\n \t\tif (pack_idx_opts.version > 2)\n-\t\t\tdie(\"bad pack.indexversion=%\"PRIu32,\n-\t\t\t    pack_idx_opts.version);\n-\t\treturn 0;\n+\t\t\tgit_die_config(\"pack.indexversion\",\n+\t\t\t\t\t\"bad pack.indexversion=%\"PRIu32, pack_idx_opts.version);\n \t}\n-\tif (!strcmp(k, \"pack.packsizelimit\")) {\n-\t\tmax_packsize = git_config_ulong(k, v);\n-\t\treturn 0;\n-\t}\n-\treturn git_default_config(k, v, cb);\n+\tif (!git_config_get_ulong(\"pack.packsizelimit\", &packsizelimit_value))\n+\t\tmax_packsize = packsizelimit_value;\n+\n+\tgit_config(git_default_config, NULL);\n }\n\n static const char fast_import_usage[] =\n@@ -3356,7 +3354,7 @@ int main(int argc, char **argv)\n\n \tsetup_git_directory();\n \treset_pack_idx_option(&pack_idx_opts);\n-\tgit_config(git_pack_config, NULL);\n+\tgit_pack_config();\n \tif (!pack_compression_seen && core_compression_seen)\n \t\tpack_compression_level = core_compression_level;\n\n-- \n1.9.0.GIT\n"},{"id":"247662","messageId":"53EB5D58.7000300@gmail.com","threadId":"37341","inReplyTo":"vpqfvh0vd4a.fsf@anie.imag.fr","subject":"[PATCH v2 2/4] ll-merge.c: refactor `read_merge_config()` to use `git_config_string()`","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T12:43:04Z","receivedAt":"2014-08-13T12:43:04Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"There is one slight behavior change, previously \"merge.default\"\nsilently ignored a NULL value and didn't raise any error. But,\nin the same function, all other values raise an error on a NULL\nvalue. So to conform with other call sites in Git, a NULL value\nfor \"merge.default\" raises an error.\n\nSigned-off-by: Tanay Abhra <tanayabh@gmail.com>\n---\nWe cannot easily use the new config-set API here, because\nmuch of the function is dedicated to processing\n\"merge.<name>.variable\" which does not easily translate to\nthe new API. If it were for variables like,\n\"merge.summary\", \"merge.tool\", and \"merge.verbosity\", we\ncould use the new API.\n\n ll-merge.c | 23 ++++++-----------------\n 1 file changed, 6 insertions(+), 17 deletions(-)\n\ndiff --git a/ll-merge.c b/ll-merge.c\nindex fb61ea6..8ea03e5 100644\n--- a/ll-merge.c\n+++ b/ll-merge.c\n@@ -225,11 +225,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n \tconst char *key, *name;\n \tint namelen;\n\n-\tif (!strcmp(var, \"merge.default\")) {\n-\t\tif (value)\n-\t\t\tdefault_ll_merge = xstrdup(value);\n-\t\treturn 0;\n-\t}\n+\tif (!strcmp(var, \"merge.default\"))\n+\t\treturn git_config_string(&default_ll_merge, var, value);\n\n \t/*\n \t * We are not interested in anything but \"merge.<name>.variable\";\n@@ -254,12 +251,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n \t\tll_user_merge_tail = &(fn->next);\n \t}\n\n-\tif (!strcmp(\"name\", key)) {\n-\t\tif (!value)\n-\t\t\treturn error(\"%s: lacks value\", var);\n-\t\tfn->description = xstrdup(value);\n-\t\treturn 0;\n-\t}\n+\tif (!strcmp(\"name\", key))\n+\t\treturn git_config_string(&fn->description, var, value);\n\n \tif (!strcmp(\"driver\", key)) {\n \t\tif (!value)\n@@ -285,12 +278,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n \t\treturn 0;\n \t}\n\n-\tif (!strcmp(\"recursive\", key)) {\n-\t\tif (!value)\n-\t\t\treturn error(\"%s: lacks value\", var);\n-\t\tfn->recursive = xstrdup(value);\n-\t\treturn 0;\n-\t}\n+\tif (!strcmp(\"recursive\", key))\n+\t\treturn git_config_string(&fn->recursive, var, value);\n\n \treturn 0;\n }\n-- \n1.9.0.GIT\n"},{"id":"247664","messageId":"vpq8umstu5c.fsf@anie.imag.fr","threadId":"37341","inReplyTo":"53EB5D58.7000300@gmail.com","subject":"Re: [PATCH v2 2/4] ll-merge.c: refactor `read_merge_config()` to use `git_config_string()`","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2014-08-13T13:07:43Z","receivedAt":"2014-08-13T13:07:43Z","isPatch":true,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n> There is one slight behavior change, previously \"merge.default\"\n> silently ignored a NULL value and didn't raise any error. But,\n> in the same function, all other values raise an error on a NULL\n> value. So to conform with other call sites in Git, a NULL value\n> for \"merge.default\" raises an error.\n\nGood, thanks.\n\n> We cannot easily use the new config-set API here, because\n> much of the function is dedicated to processing\n> \"merge.<name>.variable\" which does not easily translate to\n> the new API. If it were for variables like,\n> \"merge.summary\", \"merge.tool\", and \"merge.verbosity\", we\n> could use the new API.\n\nI think this would deserve to be in the commit message, but I'm fine\nwith keeping it here too.\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"247665","messageId":"vpq4mxgtu07.fsf@anie.imag.fr","threadId":"37341","inReplyTo":"53EB58A0.10307@gmail.com","subject":"Re: [PATCH v2 1/5] fast-import.c: replace `git_config()` with `git_config_get_*()` family","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2014-08-13T13:10:48Z","receivedAt":"2014-08-13T13:10:48Z","isPatch":true,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n> +\tif (!git_config_get_int(\"pack.compression\", &pack_compression_level)) {\n> +\t\tif (pack_compression_level == -1)\n> +\t\t\tpack_compression_level = Z_DEFAULT_COMPRESSION;\n> +\t\telse if (pack_compression_level < 0 ||\n> +\t\t\t pack_compression_level > Z_BEST_COMPRESSION)\n> +\t\t\tgit_die_config(\"pack.compression\",\n> +\t\t\t\t\t\"bad pack compression level %d\", pack_compression_level);\n\nPerfect. With v2 for PATCH 2 and PATCH 5, the series looks good to me.\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"247666","messageId":"53EB6914.2030807@gmail.com","threadId":"37341","inReplyTo":"vpq4mxgtu07.fsf@anie.imag.fr","subject":"[PATCH/RFC v2 1/2] git_default_config() rewritten using the config-set API","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T13:33:08Z","receivedAt":"2014-08-13T13:33:08Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"git_default_config() now uses config-set API functions to query for\nvalues.\n\nSigned-off-by: Tanay Abhra <tanayabh@gmail.com>\n---\nSorry, for the short log message, I will explain why.\nThe git_default_config() rewrite is 100% complete, the only\nproblem remains is the call sites; there are too many of them.\nSome are called from callback functions which pass the remaining\nvariables to git_default_config() which they do not have any use for.\nThose call sites can remain as they are, because git_default_config()\nis a single call function now, and is guarded by a sentinel value.\nSo after one call, it would just return immediately instead of going on\nchecking.\n\nFor callers like git_config(git_default_config, NULL) (there are 38 of them),\nwe can leave them as they are or rewrite them as I have illustrated in the\nnext attached patch.\n\nI will take this series out of RFC as soon as we have decided what to do with\nthe call sites.\n\nCheers,\nTanay Abhra.\n\n advice.c |  17 ++--\n advice.h |   2 +-\n cache.h  |   2 +-\n config.c | 346 ++++++++++++++++++++++-----------------------------------------\n ident.c  |  17 ++--\n 5 files changed, 136 insertions(+), 248 deletions(-)\n\ndiff --git a/advice.c b/advice.c\nindex 9b42033..34e1ccc 100644\n--- a/advice.c\n+++ b/advice.c\n@@ -59,22 +59,17 @@ void advise(const char *advice, ...)\n \tstrbuf_release(&buf);\n }\n\n-int git_default_advice_config(const char *var, const char *value)\n+void git_default_advice_config(void)\n {\n-\tconst char *k;\n+\tstruct strbuf var = STRBUF_INIT;\n \tint i;\n\n-\tif (!skip_prefix(var, \"advice.\", &k))\n-\t\treturn 0;\n-\n \tfor (i = 0; i < ARRAY_SIZE(advice_config); i++) {\n-\t\tif (strcmp(k, advice_config[i].name))\n-\t\t\tcontinue;\n-\t\t*advice_config[i].preference = git_config_bool(var, value);\n-\t\treturn 0;\n+\t\tstrbuf_addf(&var, \"advice.%s\", advice_config[i].name);\n+\t\tgit_config_get_bool(var.buf, advice_config[i].preference);\n+\t\tstrbuf_reset(&var);\n \t}\n-\n-\treturn 0;\n+\tstrbuf_release(&var);\n }\n\n int error_resolve_conflict(const char *me)\ndiff --git a/advice.h b/advice.h\nindex 5ecc6c1..5bfe46c 100644\n--- a/advice.h\n+++ b/advice.h\n@@ -19,7 +19,7 @@ extern int advice_set_upstream_failure;\n extern int advice_object_name_warning;\n extern int advice_rm_hints;\n\n-int git_default_advice_config(const char *var, const char *value);\n+void git_default_advice_config(void);\n __attribute__((format (printf, 1, 2)))\n void advise(const char *advice, ...);\n int error_resolve_conflict(const char *me);\ndiff --git a/cache.h b/cache.h\nindex 2693a37..fa28b40 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -1065,7 +1065,7 @@ extern const char *fmt_name(const char *name, const char *email);\n extern const char *ident_default_email(void);\n extern const char *git_editor(void);\n extern const char *git_pager(int stdout_is_tty);\n-extern int git_ident_config(const char *, const char *, void *);\n+extern void git_ident_config(void);\n\n struct ident_split {\n \tconst char *name_begin;\ndiff --git a/config.c b/config.c\nindex 427850a..36b9124 100644\n--- a/config.c\n+++ b/config.c\n@@ -46,6 +46,8 @@ static int zlib_compression_seen;\n  */\n static struct config_set the_config_set;\n\n+static int default_config_loaded;\n+\n static int config_file_fgetc(struct config_source *conf)\n {\n \treturn fgetc(conf->u.file);\n@@ -670,147 +672,91 @@ int git_config_pathname(const char **dest, const char *var, const char *value)\n \treturn 0;\n }\n\n-static int git_default_core_config(const char *var, const char *value)\n+static void git_default_core_config(void)\n {\n+\tconst char *value = NULL;\n+\tunsigned long v_l = 0;\n+\tint abbrev;\n+\tconst char *comment;\n+\n \t/* This needs a better name */\n-\tif (!strcmp(var, \"core.filemode\")) {\n-\t\ttrust_executable_bit = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\tif (!strcmp(var, \"core.trustctime\")) {\n-\t\ttrust_ctime = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\tif (!strcmp(var, \"core.checkstat\")) {\n+\tgit_config_get_bool(\"core.filemode\", &trust_executable_bit);\n+\tgit_config_get_bool(\"core.trustctime\", &trust_ctime);\n+\n+\tif (!git_config_get_value(\"core.checkstat\", &value)) {\n \t\tif (!strcasecmp(value, \"default\"))\n \t\t\tcheck_stat = 1;\n \t\telse if (!strcasecmp(value, \"minimal\"))\n \t\t\tcheck_stat = 0;\n \t}\n\n-\tif (!strcmp(var, \"core.quotepath\")) {\n-\t\tquote_path_fully = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n+\tgit_config_get_bool(\"core.quotepath\", &quote_path_fully);\n+\tgit_config_get_bool(\"core.symlinks\", &has_symlinks);\n+\tgit_config_get_bool(\"core.ignorecase\", &ignore_case);\n+\tgit_config_get_pathname(\"core.attributesfile\", &git_attributes_file);\n+\tgit_config_get_bool(\"core.bare\", &is_bare_repository_cfg);\n+\tgit_config_get_bool(\"core.ignorestat\", &assume_unchanged);\n+\tgit_config_get_bool(\"core.prefersymlinkrefs\", &prefer_symlink_refs);\n+\tgit_config_get_bool(\"core.logallrefupdates\", &log_all_ref_updates);\n+\tgit_config_get_bool(\"core.warnambiguousrefs\", &warn_ambiguous_refs);\n\n-\tif (!strcmp(var, \"core.symlinks\")) {\n-\t\thas_symlinks = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.ignorecase\")) {\n-\t\tignore_case = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.attributesfile\"))\n-\t\treturn git_config_pathname(&git_attributes_file, var, value);\n-\n-\tif (!strcmp(var, \"core.bare\")) {\n-\t\tis_bare_repository_cfg = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.ignorestat\")) {\n-\t\tassume_unchanged = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.prefersymlinkrefs\")) {\n-\t\tprefer_symlink_refs = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.logallrefupdates\")) {\n-\t\tlog_all_ref_updates = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.warnambiguousrefs\")) {\n-\t\twarn_ambiguous_refs = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.abbrev\")) {\n-\t\tint abbrev = git_config_int(var, value);\n+\tif (!git_config_get_int(\"core.abbrev\", &abbrev)) {\n \t\tif (abbrev < minimum_abbrev || abbrev > 40)\n-\t\t\treturn -1;\n+\t\t\tgit_die_config(\"core.abbrev\", NULL);\n \t\tdefault_abbrev = abbrev;\n-\t\treturn 0;\n \t}\n-\n-\tif (!strcmp(var, \"core.loosecompression\")) {\n-\t\tint level = git_config_int(var, value);\n-\t\tif (level == -1)\n-\t\t\tlevel = Z_DEFAULT_COMPRESSION;\n-\t\telse if (level < 0 || level > Z_BEST_COMPRESSION)\n-\t\t\tdie(_(\"bad zlib compression level %d\"), level);\n-\t\tzlib_compression_level = level;\n+\tif (!git_config_get_int(\"core.loosecompression\", &zlib_compression_level)) {\n+\t\tif (zlib_compression_level == -1)\n+\t\t\tzlib_compression_level = Z_DEFAULT_COMPRESSION;\n+\t\telse if (zlib_compression_level < 0 ||\n+\t\t\t zlib_compression_level > Z_BEST_COMPRESSION)\n+\t\t\tgit_die_config(\"core.loosecompression\", _(\"bad zlib compression level %d\"),\n+\t\t\t\t\tzlib_compression_level);\n \t\tzlib_compression_seen = 1;\n-\t\treturn 0;\n \t}\n-\n-\tif (!strcmp(var, \"core.compression\")) {\n-\t\tint level = git_config_int(var, value);\n-\t\tif (level == -1)\n-\t\t\tlevel = Z_DEFAULT_COMPRESSION;\n-\t\telse if (level < 0 || level > Z_BEST_COMPRESSION)\n-\t\t\tdie(_(\"bad zlib compression level %d\"), level);\n-\t\tcore_compression_level = level;\n+\tif (!git_config_get_int(\"core.compression\", &core_compression_level)) {\n+\t\tif (core_compression_level == -1)\n+\t\t\tcore_compression_level = Z_DEFAULT_COMPRESSION;\n+\t\telse if (core_compression_level < 0 ||\n+\t\t\t core_compression_level > Z_BEST_COMPRESSION)\n+\t\t\tgit_die_config(\"core.compression\", _(\"bad zlib compression level %d\"),\n+\t\t\t\t\tcore_compression_level);\n \t\tcore_compression_seen = 1;\n \t\tif (!zlib_compression_seen)\n-\t\t\tzlib_compression_level = level;\n-\t\treturn 0;\n+\t\t\tzlib_compression_level = core_compression_level;\n \t}\n-\n-\tif (!strcmp(var, \"core.packedgitwindowsize\")) {\n+\tif (!git_config_get_ulong(\"core.packedgitwindowsize\", &v_l)) {\n \t\tint pgsz_x2 = getpagesize() * 2;\n-\t\tpacked_git_window_size = git_config_ulong(var, value);\n+\t\tpacked_git_window_size = v_l;\n\n \t\t/* This value must be multiple of (pagesize * 2) */\n \t\tpacked_git_window_size /= pgsz_x2;\n \t\tif (packed_git_window_size < 1)\n \t\t\tpacked_git_window_size = 1;\n \t\tpacked_git_window_size *= pgsz_x2;\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.bigfilethreshold\")) {\n-\t\tbig_file_threshold = git_config_ulong(var, value);\n-\t\treturn 0;\n \t}\n+\tgit_config_get_ulong(\"core.bigfilethreshold\", &big_file_threshold);\n+\tif (!git_config_get_ulong(\"core.packedgitlimit\", &v_l))\n+\t\tpacked_git_limit = v_l;\n+\tif (!git_config_get_ulong(\"core.deltabasecachelimit\", &v_l))\n+\t\tdelta_base_cache_limit = v_l;\n\n-\tif (!strcmp(var, \"core.packedgitlimit\")) {\n-\t\tpacked_git_limit = git_config_ulong(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.deltabasecachelimit\")) {\n-\t\tdelta_base_cache_limit = git_config_ulong(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.autocrlf\")) {\n+\tif (!git_config_get_value(\"core.autocrlf\", &value)) {\n \t\tif (value && !strcasecmp(value, \"input\")) {\n \t\t\tif (core_eol == EOL_CRLF)\n-\t\t\t\treturn error(\"core.autocrlf=input conflicts with core.eol=crlf\");\n+\t\t\t\tgit_die_config(\"core.autocrlf\",\n+\t\t\t\t\t\t\"core.autocrlf=input conflicts with core.eol=crlf\");\n \t\t\tauto_crlf = AUTO_CRLF_INPUT;\n-\t\t\treturn 0;\n-\t\t}\n-\t\tauto_crlf = git_config_bool(var, value);\n-\t\treturn 0;\n+\t\t} else\n+\t\t\tauto_crlf = git_config_bool(\"core.autocrlf\", value);\n \t}\n-\n-\tif (!strcmp(var, \"core.safecrlf\")) {\n-\t\tif (value && !strcasecmp(value, \"warn\")) {\n+\tif (!git_config_get_value(\"core.safecrlf\", &value)) {\n+\t\tif (value && !strcasecmp(value, \"warn\"))\n \t\t\tsafe_crlf = SAFE_CRLF_WARN;\n-\t\t\treturn 0;\n-\t\t}\n-\t\tsafe_crlf = git_config_bool(var, value);\n-\t\treturn 0;\n+\t\telse\n+\t\t\tsafe_crlf = git_config_bool(\"core.safecrlf\", value);\n \t}\n-\n-\tif (!strcmp(var, \"core.eol\")) {\n+\tif (!git_config_get_value(\"core.eol\", &value)) {\n \t\tif (value && !strcasecmp(value, \"lf\"))\n \t\t\tcore_eol = EOL_LF;\n \t\telse if (value && !strcasecmp(value, \"crlf\"))\n@@ -820,106 +766,71 @@ static int git_default_core_config(const char *var, const char *value)\n \t\telse\n \t\t\tcore_eol = EOL_UNSET;\n \t\tif (core_eol == EOL_CRLF && auto_crlf == AUTO_CRLF_INPUT)\n-\t\t\treturn error(\"core.autocrlf=input conflicts with core.eol=crlf\");\n-\t\treturn 0;\n+\t\t\tgit_die_config(\"core.autocrlf\",\n+\t\t\t\t\t\"core.autocrlf=input conflicts with core.eol=crlf\");\n \t}\n+\tgit_config_get_string(\"core.notesref\", &notes_ref_name);\n+\tgit_config_get_string_const(\"core.pager\", &pager_program);\n+\tgit_config_get_string_const(\"core.editor\", &editor_program);\n\n-\tif (!strcmp(var, \"core.notesref\")) {\n-\t\tnotes_ref_name = xstrdup(value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.pager\"))\n-\t\treturn git_config_string(&pager_program, var, value);\n-\n-\tif (!strcmp(var, \"core.editor\"))\n-\t\treturn git_config_string(&editor_program, var, value);\n-\n-\tif (!strcmp(var, \"core.commentchar\")) {\n-\t\tif (!value)\n-\t\t\treturn config_error_nonbool(var);\n-\t\telse if (!strcasecmp(value, \"auto\"))\n+\tif (!git_config_get_string_const(\"core.commentchar\", &comment)) {\n+\t\tif (!strcasecmp(comment, \"auto\"))\n \t\t\tauto_comment_line_char = 1;\n-\t\telse if (value[0] && !value[1]) {\n-\t\t\tcomment_line_char = value[0];\n+\t\telse if (comment[0] && !comment[1]) {\n+\t\t\tcomment_line_char = comment[0];\n \t\t\tauto_comment_line_char = 0;\n \t\t} else\n-\t\t\treturn error(\"core.commentChar should only be one character\");\n-\t\treturn 0;\n+\t\t\tgit_die_config(\"core.commentchar\",\n+\t\t\t\t\t\"core.commentchar should only be one character\");\n \t}\n+\tgit_config_get_string_const(\"core.askpass\", &askpass_program);\n+\tgit_config_get_pathname(\"core.excludesfile\", &excludes_file);\n\n-\tif (!strcmp(var, \"core.askpass\"))\n-\t\treturn git_config_string(&askpass_program, var, value);\n-\n-\tif (!strcmp(var, \"core.excludesfile\"))\n-\t\treturn git_config_pathname(&excludes_file, var, value);\n-\n-\tif (!strcmp(var, \"core.whitespace\")) {\n+\tif (!git_config_get_value(\"core.whitespace\", &value)) {\n \t\tif (!value)\n-\t\t\treturn config_error_nonbool(var);\n-\t\twhitespace_rule_cfg = parse_whitespace_rule(value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.fsyncobjectfiles\")) {\n-\t\tfsync_object_files = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.preloadindex\")) {\n-\t\tcore_preload_index = git_config_bool(var, value);\n-\t\treturn 0;\n+\t\t\tgit_die_config(\"core.whitespace\", \"Missing value for 'core.whitespace'\");\n+\t\telse\n+\t\t\twhitespace_rule_cfg = parse_whitespace_rule(value);\n \t}\n+\tgit_config_get_bool(\"core.fsyncobjectfiles\", &fsync_object_files);\n+\tgit_config_get_bool(\"core.preloadindex\", &core_preload_index);\n\n-\tif (!strcmp(var, \"core.createobject\")) {\n+\tif (!git_config_get_value(\"core.createobject\", &value)) {\n \t\tif (!strcmp(value, \"rename\"))\n \t\t\tobject_creation_mode = OBJECT_CREATION_USES_RENAMES;\n \t\telse if (!strcmp(value, \"link\"))\n \t\t\tobject_creation_mode = OBJECT_CREATION_USES_HARDLINKS;\n \t\telse\n-\t\t\tdie(_(\"invalid mode for object creation: %s\"), value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.sparsecheckout\")) {\n-\t\tcore_apply_sparse_checkout = git_config_bool(var, value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"core.precomposeunicode\")) {\n-\t\tprecomposed_unicode = git_config_bool(var, value);\n-\t\treturn 0;\n+\t\t\tgit_die_config(\"core.createobject\",\n+\t\t\t\t\t_(\"Invalid mode for object creation: %s\"), value);\n \t}\n+\tgit_config_get_bool(\"core.sparsecheckout\", &core_apply_sparse_checkout);\n+\tgit_config_get_bool(\"core.precomposeunicode\", &precomposed_unicode);\n\n \t/* Add other config variables here and to Documentation/config.txt. */\n-\treturn 0;\n }\n\n-static int git_default_i18n_config(const char *var, const char *value)\n+static void git_default_i18n_config(void)\n {\n-\tif (!strcmp(var, \"i18n.commitencoding\"))\n-\t\treturn git_config_string(&git_commit_encoding, var, value);\n-\n-\tif (!strcmp(var, \"i18n.logoutputencoding\"))\n-\t\treturn git_config_string(&git_log_output_encoding, var, value);\n+\tgit_config_get_string_const(\"i18n.commitencoding\", &git_commit_encoding);\n+\tgit_config_get_string_const(\"i18n.logoutputencoding\", &git_log_output_encoding);\n\n \t/* Add other config variables here and to Documentation/config.txt. */\n-\treturn 0;\n }\n\n-static int git_default_branch_config(const char *var, const char *value)\n+static void git_default_branch_config(void)\n {\n-\tif (!strcmp(var, \"branch.autosetupmerge\")) {\n-\t\tif (value && !strcasecmp(value, \"always\")) {\n+\tconst char *value = NULL;\n+\tif (!git_config_get_value(\"branch.autosetupmerge\", &value)) {\n+\t\tif (value && !strcasecmp(value, \"always\"))\n \t\t\tgit_branch_track = BRANCH_TRACK_ALWAYS;\n-\t\t\treturn 0;\n-\t\t}\n-\t\tgit_branch_track = git_config_bool(var, value);\n-\t\treturn 0;\n+\t\telse\n+\t\t\tgit_branch_track = git_config_bool(\"branch.autosetupmerge\", value);\n \t}\n-\tif (!strcmp(var, \"branch.autosetuprebase\")) {\n+\tif (!git_config_get_value(\"branch.autosetuprebase\", &value)) {\n \t\tif (!value)\n-\t\t\treturn config_error_nonbool(var);\n+\t\t\tgit_die_config(\"branch.autosetuprebase\",\n+\t\t\t\t\t\"Missing value for 'branch.autosetuprebase'\");\n \t\telse if (!strcmp(value, \"never\"))\n \t\t\tautorebase = AUTOREBASE_NEVER;\n \t\telse if (!strcmp(value, \"local\"))\n@@ -929,19 +840,19 @@ static int git_default_branch_config(const char *var, const char *value)\n \t\telse if (!strcmp(value, \"always\"))\n \t\t\tautorebase = AUTOREBASE_ALWAYS;\n \t\telse\n-\t\t\treturn error(\"Malformed value for %s\", var);\n-\t\treturn 0;\n+\t\t\tgit_die_config(\"branch.autosetuprebase\",\n+\t\t\t\t\t\"Malformed value for branch.autosetuprebase\");\n \t}\n\n \t/* Add other config variables here and to Documentation/config.txt. */\n-\treturn 0;\n }\n\n-static int git_default_push_config(const char *var, const char *value)\n+static void git_default_push_config(void)\n {\n-\tif (!strcmp(var, \"push.default\")) {\n+\tconst char *value  = NULL;\n+\tif (!git_config_get_value(\"push.default\", &value)) {\n \t\tif (!value)\n-\t\t\treturn config_error_nonbool(var);\n+\t\t\tgit_die_config(\"push.default\", \"Missing value for 'push.default'\");\n \t\telse if (!strcmp(value, \"nothing\"))\n \t\t\tpush_default = PUSH_DEFAULT_NOTHING;\n \t\telse if (!strcmp(value, \"matching\"))\n@@ -955,60 +866,44 @@ static int git_default_push_config(const char *var, const char *value)\n \t\telse if (!strcmp(value, \"current\"))\n \t\t\tpush_default = PUSH_DEFAULT_CURRENT;\n \t\telse {\n-\t\t\terror(\"Malformed value for %s: %s\", var, value);\n-\t\t\treturn error(\"Must be one of nothing, matching, simple, \"\n+\t\t\terror(\"Malformed value for push.default: %s\", value);\n+\t\t\tgit_die_config(\"push.default\", \"Must be one of nothing, matching, simple, \"\n \t\t\t\t     \"upstream or current.\");\n \t\t}\n-\t\treturn 0;\n \t}\n\n \t/* Add other config variables here and to Documentation/config.txt. */\n-\treturn 0;\n }\n\n-static int git_default_mailmap_config(const char *var, const char *value)\n+static void git_default_mailmap_config(void)\n {\n-\tif (!strcmp(var, \"mailmap.file\"))\n-\t\treturn git_config_pathname(&git_mailmap_file, var, value);\n-\tif (!strcmp(var, \"mailmap.blob\"))\n-\t\treturn git_config_string(&git_mailmap_blob, var, value);\n+\tgit_config_get_pathname(\"mailmap.file\", &git_mailmap_file);\n+\tgit_config_get_string_const(\"mailmap.blob\", &git_mailmap_blob);\n\n \t/* Add other config variables here and to Documentation/config.txt. */\n-\treturn 0;\n }\n\n-int git_default_config(const char *var, const char *value, void *dummy)\n+int git_default_config(const char *unused, const char *unused2, void *dummy)\n {\n-\tif (starts_with(var, \"core.\"))\n-\t\treturn git_default_core_config(var, value);\n-\n-\tif (starts_with(var, \"user.\"))\n-\t\treturn git_ident_config(var, value, dummy);\n-\n-\tif (starts_with(var, \"i18n.\"))\n-\t\treturn git_default_i18n_config(var, value);\n-\n-\tif (starts_with(var, \"branch.\"))\n-\t\treturn git_default_branch_config(var, value);\n-\n-\tif (starts_with(var, \"push.\"))\n-\t\treturn git_default_push_config(var, value);\n+\tconst char *v = NULL;\n\n-\tif (starts_with(var, \"mailmap.\"))\n-\t\treturn git_default_mailmap_config(var, value);\n-\n-\tif (starts_with(var, \"advice.\"))\n-\t\treturn git_default_advice_config(var, value);\n-\n-\tif (!strcmp(var, \"pager.color\") || !strcmp(var, \"color.pager\")) {\n-\t\tpager_use_color = git_config_bool(var,value);\n-\t\treturn 0;\n-\t}\n-\n-\tif (!strcmp(var, \"pack.packsizelimit\")) {\n-\t\tpack_size_limit_cfg = git_config_ulong(var, value);\n+\tif (default_config_loaded)\n \t\treturn 0;\n-\t}\n+\tgit_default_core_config();\n+\tgit_ident_config();\n+\tgit_default_i18n_config();\n+\tgit_default_branch_config();\n+\tgit_default_push_config();\n+\tgit_default_mailmap_config();\n+\tgit_default_advice_config();\n+\n+\tif (!git_config_get_value(\"pager.color\", &v))\n+\t\tpager_use_color = git_config_bool(\"pager.color\",v);\n+\telse if (!git_config_get_value(\"color.pager\", &v))\n+\t\tpager_use_color = git_config_bool(\"color.pager\",v);\n+\n+\tgit_config_get_ulong(\"pack.packsizelimit\", &pack_size_limit_cfg);\n+\tdefault_config_loaded = 1;\n \t/* Add other config variables here and to Documentation/config.txt. */\n \treturn 0;\n }\n@@ -2082,6 +1977,7 @@ int git_config_set_multivar_in_file(const char *config_filename,\n\n \t/* Invalidate the config cache */\n \tgit_config_clear();\n+\tdefault_config_loaded = 0;\n\n out_free:\n \tif (lock)\ndiff --git a/ident.c b/ident.c\nindex 1d9b6e7..0db595f 100644\n--- a/ident.c\n+++ b/ident.c\n@@ -392,29 +392,26 @@ int author_ident_sufficiently_given(void)\n \treturn ident_is_sufficient(author_ident_explicitly_given);\n }\n\n-int git_ident_config(const char *var, const char *value, void *data)\n+void git_ident_config(void)\n {\n-\tif (!strcmp(var, \"user.name\")) {\n+\tconst char *value = NULL;\n+\n+\tif (!git_config_get_value(\"user.name\", &value)) {\n \t\tif (!value)\n-\t\t\treturn config_error_nonbool(var);\n+\t\t\tgit_die_config(\"user.name\", \"Missing value for 'user.name'\");\n \t\tstrbuf_reset(&git_default_name);\n \t\tstrbuf_addstr(&git_default_name, value);\n \t\tcommitter_ident_explicitly_given |= IDENT_NAME_GIVEN;\n \t\tauthor_ident_explicitly_given |= IDENT_NAME_GIVEN;\n-\t\treturn 0;\n \t}\n-\n-\tif (!strcmp(var, \"user.email\")) {\n+\tif (!git_config_get_value(\"user.email\", &value)) {\n \t\tif (!value)\n-\t\t\treturn config_error_nonbool(var);\n+\t\t\tgit_die_config(\"user.email\", \"Missing value for 'user.email'\");\n \t\tstrbuf_reset(&git_default_email);\n \t\tstrbuf_addstr(&git_default_email, value);\n \t\tcommitter_ident_explicitly_given |= IDENT_MAIL_GIVEN;\n \t\tauthor_ident_explicitly_given |= IDENT_MAIL_GIVEN;\n-\t\treturn 0;\n \t}\n-\n-\treturn 0;\n }\n\n static int buf_cmp(const char *a_begin, const char *a_end,\n-- \n1.9.0.GIT\n"},{"id":"247667","messageId":"53EB6AA5.7070706@gmail.com","threadId":"37341","inReplyTo":"53EB6914.2030807@gmail.com","subject":"[PATCH/RFC v2 2/2] use the new git_default_config()","fromName":"Tanay Abhra","fromEmail":"tanayabh@gmail.com","sentAt":"2014-08-13T13:39:49Z","receivedAt":"2014-08-13T13:39:49Z","isPatch":true,"sender":{"key":"tanayabh@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2097229?v=4"},"body":"If we change the signature to void git_default_config(void),\nwe would have to use a patch like this to change the call sites\nof the function. This patch is just for illustrative purpose,\nI couldn't finalize if this was unnecessary code cruft or\na valid approach.\n\n---\n builtin/check-attr.c         | 2 +-\n builtin/check-ignore.c       | 2 +-\n builtin/check-mailmap.c      | 2 +-\n builtin/checkout-index.c     | 2 +-\n builtin/clone.c              | 2 +-\n builtin/config.c             | 2 +-\n builtin/describe.c           | 2 +-\n builtin/fast-export.c        | 2 +-\n builtin/for-each-ref.c       | 2 +-\n builtin/hash-object.c        | 2 +-\n builtin/init-db.c            | 2 +-\n builtin/ls-files.c           | 2 +-\n builtin/ls-tree.c            | 2 +-\n builtin/merge-base.c         | 2 +-\n builtin/mv.c                 | 2 +-\n builtin/name-rev.c           | 2 +-\n builtin/notes.c              | 2 +-\n builtin/push.c               | 2 +-\n builtin/read-tree.c          | 2 +-\n builtin/reset.c              | 2 +-\n builtin/rev-list.c           | 2 +-\n builtin/rev-parse.c          | 2 +-\n builtin/revert.c             | 4 ++--\n builtin/rm.c                 | 2 +-\n builtin/shortlog.c           | 2 +-\n builtin/stripspace.c         | 2 +-\n builtin/symbolic-ref.c       | 2 +-\n builtin/unpack-file.c        | 2 +-\n builtin/unpack-objects.c     | 2 +-\n builtin/update-index.c       | 2 +-\n builtin/update-ref.c         | 2 +-\n builtin/update-server-info.c | 2 +-\n builtin/var.c                | 2 +-\n builtin/verify-pack.c        | 2 +-\n builtin/write-tree.c         | 2 +-\n http-fetch.c                 | 2 +-\n pager.c                      | 2 +-\n 37 files changed, 38 insertions(+), 38 deletions(-)\n\ndiff --git a/builtin/check-attr.c b/builtin/check-attr.c\nindex 5600ec3..e2d7826 100644\n--- a/builtin/check-attr.c\n+++ b/builtin/check-attr.c\n@@ -105,7 +105,7 @@ int cmd_check_attr(int argc, const char **argv, const char *prefix)\n \tif (!is_bare_repository())\n \t\tsetup_work_tree();\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \targc = parse_options(argc, argv, prefix, check_attr_options,\n \t\t\t     check_attr_usage, PARSE_OPT_KEEP_DASHDASH);\ndiff --git a/builtin/check-ignore.c b/builtin/check-ignore.c\nindex 594463a..c14c977 100644\n--- a/builtin/check-ignore.c\n+++ b/builtin/check-ignore.c\n@@ -144,7 +144,7 @@ int cmd_check_ignore(int argc, const char **argv, const char *prefix)\n \tint num_ignored;\n \tstruct dir_struct dir;\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \targc = parse_options(argc, argv, prefix, check_ignore_options,\n \t\t\t     check_ignore_usage, 0);\ndiff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c\nindex 8f4d809..f9d0de6 100644\n--- a/builtin/check-mailmap.c\n+++ b/builtin/check-mailmap.c\n@@ -40,7 +40,7 @@ int cmd_check_mailmap(int argc, const char **argv, const char *prefix)\n \tint i;\n \tstruct string_list mailmap = STRING_LIST_INIT_NODUP;\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, check_mailmap_options,\n \t\t\t     check_mailmap_usage, 0);\n \tif (argc == 0 && !use_stdin)\ndiff --git a/builtin/checkout-index.c b/builtin/checkout-index.c\nindex 05edd9e..197a987 100644\n--- a/builtin/checkout-index.c\n+++ b/builtin/checkout-index.c\n@@ -213,7 +213,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)\n \tif (argc == 2 && !strcmp(argv[1], \"-h\"))\n \t\tusage_with_options(builtin_checkout_index_usage,\n \t\t\t\t   builtin_checkout_index_options);\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tstate.base_dir = \"\";\n \tprefix_length = prefix ? strlen(prefix) : 0;\n\ndiff --git a/builtin/clone.c b/builtin/clone.c\nindex bbd169c..bcfd322 100644\n--- a/builtin/clone.c\n+++ b/builtin/clone.c\n@@ -864,7 +864,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)\n \tinit_db(option_template, INIT_DB_QUIET);\n \twrite_config(&option_config);\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \tif (option_bare) {\n \t\tif (option_mirror)\ndiff --git a/builtin/config.c b/builtin/config.c\nindex fcd8474..eed430d 100644\n--- a/builtin/config.c\n+++ b/builtin/config.c\n@@ -558,7 +558,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)\n \t\t\tdie(\"editing stdin is not supported\");\n \t\tif (given_config_source.blob)\n \t\t\tdie(\"editing blobs is not supported\");\n-\t\tgit_config(git_default_config, NULL);\n+\t\tgit_default_config();\n \t\tlaunch_editor(given_config_source.file ?\n \t\t\t      given_config_source.file : git_path(\"config\"),\n \t\t\t      NULL, NULL);\ndiff --git a/builtin/describe.c b/builtin/describe.c\nindex ee6a3b9..a4969d8 100644\n--- a/builtin/describe.c\n+++ b/builtin/describe.c\n@@ -413,7 +413,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)\n \t\tOPT_END(),\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, options, describe_usage, 0);\n \tif (abbrev < 0)\n \t\tabbrev = DEFAULT_ABBREV;\ndiff --git a/builtin/fast-export.c b/builtin/fast-export.c\nindex 92b4624..344a8a4 100644\n--- a/builtin/fast-export.c\n+++ b/builtin/fast-export.c\n@@ -726,7 +726,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \t\tusage_with_options (fast_export_usage, options);\n\n \t/* we handle encodings */\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \tinit_revisions(&revs, prefix);\n \trevs.topo_order = 1;\ndiff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c\nindex 47bd624..3991679 100644\n--- a/builtin/for-each-ref.c\n+++ b/builtin/for-each-ref.c\n@@ -1095,7 +1095,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)\n \t\tsort = default_sort();\n\n \t/* for warn_ambiguous_refs */\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \tmemset(&cbdata, 0, sizeof(cbdata));\n \tcbdata.grab_pattern = argv;\ndiff --git a/builtin/hash-object.c b/builtin/hash-object.c\nindex d7fcf4c..0a9fe1b 100644\n--- a/builtin/hash-object.c\n+++ b/builtin/hash-object.c\n@@ -96,7 +96,7 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)\n \t\t\tvpath = prefix_filename(prefix, prefix_length, vpath);\n \t}\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \tif (stdin_paths) {\n \t\tif (hashstdin)\ndiff --git a/builtin/init-db.c b/builtin/init-db.c\nindex 56f85e2..337cd0a 100644\n--- a/builtin/init-db.c\n+++ b/builtin/init-db.c\n@@ -211,7 +211,7 @@ static int create_default_files(const char *template_path)\n \t */\n \tcopy_templates(template_path);\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tis_bare_repository_cfg = init_is_bare_repository;\n\n \t/* reading existing config may have overwrote it */\ndiff --git a/builtin/ls-files.c b/builtin/ls-files.c\nindex 47c3880..18d4241 100644\n--- a/builtin/ls-files.c\n+++ b/builtin/ls-files.c\n@@ -513,7 +513,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)\n \tprefix = cmd_prefix;\n \tif (prefix)\n \t\tprefix_len = strlen(prefix);\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \tif (read_cache() < 0)\n \t\tdie(\"index file corrupt\");\ndiff --git a/builtin/ls-tree.c b/builtin/ls-tree.c\nindex 51184df..814b358 100644\n--- a/builtin/ls-tree.c\n+++ b/builtin/ls-tree.c\n@@ -146,7 +146,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tls_tree_prefix = prefix;\n \tif (prefix && *prefix)\n \t\tchomp_prefix = strlen(prefix);\ndiff --git a/builtin/merge-base.c b/builtin/merge-base.c\nindex 0ecde8d..c442e49 100644\n--- a/builtin/merge-base.c\n+++ b/builtin/merge-base.c\n@@ -223,7 +223,7 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, options, merge_base_usage, 0);\n\n \tif (cmdmode == 'a') {\ndiff --git a/builtin/mv.c b/builtin/mv.c\nindex 6ffe540..ea5da87 100644\n--- a/builtin/mv.c\n+++ b/builtin/mv.c\n@@ -78,7 +78,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \tstruct string_list src_for_dst = STRING_LIST_INIT_NODUP;\n\n \tgitmodules_config();\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \targc = parse_options(argc, argv, prefix, builtin_mv_options,\n \t\t\t     builtin_mv_usage, 0);\ndiff --git a/builtin/name-rev.c b/builtin/name-rev.c\nindex 3c8f319..fdf9771 100644\n--- a/builtin/name-rev.c\n+++ b/builtin/name-rev.c\n@@ -325,7 +325,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)\n \t\tOPT_END(),\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, opts, name_rev_usage, 0);\n \tif (all + transform_stdin + !!argc > 1) {\n \t\terror(\"Specify either a list, or --all, not both!\");\ndiff --git a/builtin/notes.c b/builtin/notes.c\nindex 820c341..47cec8a 100644\n--- a/builtin/notes.c\n+++ b/builtin/notes.c\n@@ -944,7 +944,7 @@ int cmd_notes(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, options, git_notes_usage,\n \t\t\t     PARSE_OPT_STOP_AT_NON_OPTION);\n\ndiff --git a/builtin/push.c b/builtin/push.c\nindex f50e3d5..a25fc00 100644\n--- a/builtin/push.c\n+++ b/builtin/push.c\n@@ -510,7 +510,7 @@ int cmd_push(int argc, const char **argv, const char *prefix)\n \t};\n\n \tpacket_trace_identity(\"push\");\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, options, push_usage, 0);\n\n \tif (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))\ndiff --git a/builtin/read-tree.c b/builtin/read-tree.c\nindex e7e1c33..40d41fa 100644\n--- a/builtin/read-tree.c\n+++ b/builtin/read-tree.c\n@@ -144,7 +144,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)\n \topts.src_index = &the_index;\n \topts.dst_index = &the_index;\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \targc = parse_options(argc, argv, unused_prefix, read_tree_options,\n \t\t\t     read_tree_usage, 0);\ndiff --git a/builtin/reset.c b/builtin/reset.c\nindex 855d478..3f5c0c0 100644\n--- a/builtin/reset.c\n+++ b/builtin/reset.c\n@@ -288,7 +288,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \targc = parse_options(argc, argv, prefix, options, git_reset_usage,\n \t\t\t\t\t\tPARSE_OPT_KEEP_DASHDASH);\ndiff --git a/builtin/rev-list.c b/builtin/rev-list.c\nindex ff84a82..3243fcd 100644\n--- a/builtin/rev-list.c\n+++ b/builtin/rev-list.c\n@@ -280,7 +280,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)\n \tint bisect_find_all = 0;\n \tint use_bitmap_index = 0;\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tinit_revisions(&revs, prefix);\n \trevs.abbrev = DEFAULT_ABBREV;\n \trevs.commit_format = CMIT_FMT_UNSPECIFIED;\ndiff --git a/builtin/rev-parse.c b/builtin/rev-parse.c\nindex d85e08c..0465540 100644\n--- a/builtin/rev-parse.c\n+++ b/builtin/rev-parse.c\n@@ -527,7 +527,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)\n \t}\n\n \tprefix = setup_git_directory();\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tfor (i = 1; i < argc; i++) {\n \t\tconst char *arg = argv[i];\n\ndiff --git a/builtin/revert.c b/builtin/revert.c\nindex f9ed5bd..1975f46 100644\n--- a/builtin/revert.c\n+++ b/builtin/revert.c\n@@ -190,7 +190,7 @@ int cmd_revert(int argc, const char **argv, const char *prefix)\n \tif (isatty(0))\n \t\topts.edit = 1;\n \topts.action = REPLAY_REVERT;\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tparse_args(argc, argv, &opts);\n \tres = sequencer_pick_revisions(&opts);\n \tif (res < 0)\n@@ -205,7 +205,7 @@ int cmd_cherry_pick(int argc, const char **argv, const char *prefix)\n\n \tmemset(&opts, 0, sizeof(opts));\n \topts.action = REPLAY_PICK;\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tparse_args(argc, argv, &opts);\n \tres = sequencer_pick_revisions(&opts);\n \tif (res < 0)\ndiff --git a/builtin/rm.c b/builtin/rm.c\nindex bc6490b..7e4c2c6 100644\n--- a/builtin/rm.c\n+++ b/builtin/rm.c\n@@ -283,7 +283,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)\n \tchar *seen;\n\n \tgitmodules_config();\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \targc = parse_options(argc, argv, prefix, builtin_rm_options,\n \t\t\t     builtin_rm_usage, 0);\ndiff --git a/builtin/shortlog.c b/builtin/shortlog.c\nindex 4b7e536..9f4627b 100644\n--- a/builtin/shortlog.c\n+++ b/builtin/shortlog.c\n@@ -239,7 +239,7 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)\n\n \tstruct parse_opt_ctx_t ctx;\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tshortlog_init(&log);\n \tinit_revisions(&rev, prefix);\n \tparse_options_start(&ctx, argc, argv, prefix, options,\ndiff --git a/builtin/stripspace.c b/builtin/stripspace.c\nindex 1259ed7..27cd0bb 100644\n--- a/builtin/stripspace.c\n+++ b/builtin/stripspace.c\n@@ -105,7 +105,7 @@ int cmd_stripspace(int argc, const char **argv, const char *prefix)\n \t\tusage(usage_msg);\n\n \tif (strip_comments || mode == COMMENT_LINES)\n-\t\tgit_config(git_default_config, NULL);\n+\t\tgit_default_config();\n\n \tif (strbuf_read(&buf, 0, 1024) < 0)\n \t\tdie_errno(\"could not read the input\");\ndiff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c\nindex b6a711d..c6abff3 100644\n--- a/builtin/symbolic-ref.c\n+++ b/builtin/symbolic-ref.c\n@@ -44,7 +44,7 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix)\n \t\tOPT_END(),\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, options,\n \t\t\t     git_symbolic_ref_usage, 0);\n \tif (msg && !*msg)\ndiff --git a/builtin/unpack-file.c b/builtin/unpack-file.c\nindex 1920029..47eba5f 100644\n--- a/builtin/unpack-file.c\n+++ b/builtin/unpack-file.c\n@@ -29,7 +29,7 @@ int cmd_unpack_file(int argc, const char **argv, const char *prefix)\n \tif (get_sha1(argv[1], sha1))\n \t\tdie(\"Not a valid object name %s\", argv[1]);\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \tputs(create_temp_file(sha1));\n \treturn 0;\ndiff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c\nindex 99cde45..970056b 100644\n--- a/builtin/unpack-objects.c\n+++ b/builtin/unpack-objects.c\n@@ -499,7 +499,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)\n\n \tcheck_replace_refs = 0;\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \tquiet = !isatty(2);\n\ndiff --git a/builtin/update-index.c b/builtin/update-index.c\nindex e8c7fd4..0a5fff9 100644\n--- a/builtin/update-index.c\n+++ b/builtin/update-index.c\n@@ -837,7 +837,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)\n \tif (argc == 2 && !strcmp(argv[1], \"-h\"))\n \t\tusage_with_options(update_index_usage, options);\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \t/* We can't free this memory, it becomes part of a linked list parsed atexit() */\n \tlock_file = xcalloc(1, sizeof(struct lock_file));\ndiff --git a/builtin/update-ref.c b/builtin/update-ref.c\nindex 3067b11..e12edfe 100644\n--- a/builtin/update-ref.c\n+++ b/builtin/update-ref.c\n@@ -355,7 +355,7 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)\n \t\tOPT_END(),\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, options, git_update_ref_usage,\n \t\t\t     0);\n \tif (msg && !*msg)\ndiff --git a/builtin/update-server-info.c b/builtin/update-server-info.c\nindex 6c8cc3e..ecf791c 100644\n--- a/builtin/update-server-info.c\n+++ b/builtin/update-server-info.c\n@@ -15,7 +15,7 @@ int cmd_update_server_info(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, options,\n \t\t\t     update_server_info_usage, 0);\n \tif (argc > 0)\ndiff --git a/builtin/var.c b/builtin/var.c\nindex aedbb53..d4b7dcd 100644\n--- a/builtin/var.c\n+++ b/builtin/var.c\n@@ -82,7 +82,7 @@ int cmd_var(int argc, const char **argv, const char *prefix)\n \t\tlist_vars();\n \t\treturn 0;\n \t}\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \tval = read_var(argv[1]);\n \tif (!val)\n \t\tusage(var_usage);\ndiff --git a/builtin/verify-pack.c b/builtin/verify-pack.c\nindex 972579f..c017efd 100644\n--- a/builtin/verify-pack.c\n+++ b/builtin/verify-pack.c\n@@ -69,7 +69,7 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, prefix, verify_pack_options,\n \t\t\t     verify_pack_usage, 0);\n \tif (argc < 1)\ndiff --git a/builtin/write-tree.c b/builtin/write-tree.c\nindex 084c0df..95a0ca4 100644\n--- a/builtin/write-tree.c\n+++ b/builtin/write-tree.c\n@@ -33,7 +33,7 @@ int cmd_write_tree(int argc, const char **argv, const char *unused_prefix)\n \t\tOPT_END()\n \t};\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n \targc = parse_options(argc, argv, unused_prefix, write_tree_options,\n \t\t\t     write_tree_usage, 0);\n\ndiff --git a/http-fetch.c b/http-fetch.c\nindex ba3ea10..afa9f40 100644\n--- a/http-fetch.c\n+++ b/http-fetch.c\n@@ -67,7 +67,7 @@ int main(int argc, const char **argv)\n\n \tsetup_git_directory();\n\n-\tgit_config(git_default_config, NULL);\n+\tgit_default_config();\n\n \thttp_init(NULL, url, 0);\n \twalker = get_http_walker(url);\ndiff --git a/pager.c b/pager.c\nindex 8b5cbc5..c22fc04 100644\n--- a/pager.c\n+++ b/pager.c\n@@ -47,7 +47,7 @@ const char *git_pager(int stdout_is_tty)\n \tpager = getenv(\"GIT_PAGER\");\n \tif (!pager) {\n \t\tif (!pager_program)\n-\t\t\tgit_config(git_default_config, NULL);\n+\t\t\tgit_default_config();\n \t\tpager = pager_program;\n \t}\n \tif (!pager)\n-- \n1.9.0.GIT\n"},{"id":"247669","messageId":"vpq1tsks7kg.fsf@anie.imag.fr","threadId":"37341","inReplyTo":"53EB6914.2030807@gmail.com","subject":"Re: [PATCH/RFC v2 1/2] git_default_config() rewritten using the config-set API","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2014-08-13T16:00:47Z","receivedAt":"2014-08-13T16:00:47Z","isPatch":true,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n> git_default_config() now uses config-set API functions to query for\n> values.\n\nI believe you missed a few spots:\n\n$ git grep -n 'git_default_config[^(]'\nDocumentation/user-manual.txt:4287:        git_config(git_default_config);\narchive.c:416:  git_config(git_default_config, NULL);\nbuiltin/config.c:577:           git_config(git_default_config, NULL);\ncolor.h:73: * if you are just going to change to git_default_config, too.\nfetch-pack.c:880:       git_config(git_default_config, NULL);\nhttp.c:393:     config.cascade_fn = git_default_config;\nrerere.c:580:   git_config(git_default_config, NULL);\nrerere.c:710:   git_config(git_default_config, NULL);\n\nThe following ones should probably be rewritten too:\n\narchive.c:416:  git_config(git_default_config, NULL);\nbuiltin/config.c:577:           git_config(git_default_config, NULL);\nfetch-pack.c:880:       git_config(git_default_config, NULL);\nrerere.c:580:   git_config(git_default_config, NULL);\nrerere.c:710:   git_config(git_default_config, NULL);\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"247670","messageId":"vpqa978qs9f.fsf@anie.imag.fr","threadId":"37341","inReplyTo":"53EB6914.2030807@gmail.com","subject":"Re: [PATCH/RFC v2 1/2] git_default_config() rewritten using the config-set API","fromName":"Matthieu Moy","fromEmail":"matthieu.moy@grenoble-inp.fr","sentAt":"2014-08-13T16:16:44Z","receivedAt":"2014-08-13T16:16:44Z","isPatch":true,"sender":{"key":"matthieu.moy@grenoble-inp.fr","avatar":"https://gravatar.com/avatar/72c8a2705971a25dfaff23cece15130d405685845d911aedd5667ace277f3fc5?d=mp&s=160"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n> git_default_config() now uses config-set API functions to query for\n> values.\n>\n> Signed-off-by: Tanay Abhra <tanayabh@gmail.com>\n> ---\n> Sorry, for the short log message, I will explain why.\n> The git_default_config() rewrite is 100% complete, the only\n> problem remains is the call sites; there are too many of them.\n> Some are called from callback functions which pass the remaining\n> variables to git_default_config() which they do not have any use for.\n> Those call sites can remain as they are, because git_default_config()\n> is a single call function now, and is guarded by a sentinel value.\n\nThey can remain as they are, but it would also be relatively easy to\nturn them into non-callback style by doing something like this on each\ncall:\n\n--- a/builtin/commit-tree.c\n+++ b/builtin/commit-tree.c\n@@ -37,7 +37,7 @@ static int commit_tree_config(const char *var, const char *value, void *cb)\n                sign_commit = git_config_bool(var, value) ? \"\" : NULL;\n                return 0;\n        }\n-       return git_default_config(var, value, cb);\n+       return 0\n }\n \n int cmd_commit_tree(int argc, const char **argv, const char *prefix)\n@@ -49,6 +49,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)\n        struct strbuf buffer = STRBUF_INIT;\n \n        git_config(commit_tree_config, NULL);\n+       git_default_config();\n \n        if (argc < 2 || !strcmp(argv[1], \"-h\"))\n                usage(commit_tree_usage);\n\n> -int git_default_config(const char *var, const char *value, void *dummy)\n> +int git_default_config(const char *unused, const char *unused2, void *dummy)\n\nBy having these dummy arguments, you force callers to pass dummy actual\nparameters.\n\nActually, you don't pass anything in PATCH 2, hence the result is not\ncompilable:\n\nhttp-fetch.c:70:2: error: too few arguments to function ‘git_default_config’\n  git_default_config();\n  ^\nIn file included from http-fetch.c:1:0:\ncache.h:1299:12: note: declared here\n extern int git_default_config(const char *, const char *, void *);\n\nAfter your patch, there are two things git_default_config do:\n\n1) normal callers want to call git_default_config();\n\n2) callback-style callers want to write\n   return git_default_config(var, value, cb);\n\nI think this deserves two functions, calling each others:\n\n/* For 1) */\nvoid git_load_default_config(void)\n{\n\tdo the actual stuff\n}\n\n/* For 2) */\nint git_default_config(const char *unused, const char *unused2, void *dummy)\n{\n\tif (default_config_loaded)\n\t\treturn;\n\tgit_load_default_config(NULL, NULL, NULL);\n\tdefault_config_loaded = 1;\n\treturn 0;\n}\n\nIn an ideal world, git_default_config would disappear after the rewrite\nis completed. In practice, it may stay if needed, it doesn't harm\nanyone.\n\nPATCH 2 would turn git_config(git_default_config, NULL); into\ngit_load_default_config().\n\n> @@ -2082,6 +1977,7 @@ int git_config_set_multivar_in_file(const char *config_filename,\n>\n>  \t/* Invalidate the config cache */\n>  \tgit_config_clear();\n> +\tdefault_config_loaded = 0;\n\nWhat about the other callsite in setup.c? We may have left the\nconfiguration half-loaded, and if anyone calls git_load_default_config()\nagain after that, we do want to reload it, don't we?\n\nWhich leads to another question: why not put this default_config_loaded\n= 0; inside git_config_clear(), to avoid forgetting?\n\n> index 1d9b6e7..0db595f 100644\n> --- a/ident.c\n> +++ b/ident.c\n> @@ -392,29 +392,26 @@ int author_ident_sufficiently_given(void)\n>  \treturn ident_is_sufficient(author_ident_explicitly_given);\n>  }\n>\n> -int git_ident_config(const char *var, const char *value, void *data)\n> +void git_ident_config(void)\n>  {\n> -\tif (!strcmp(var, \"user.name\")) {\n> +\tconst char *value = NULL;\n> +\n> +\tif (!git_config_get_value(\"user.name\", &value)) {\n>  \t\tif (!value)\n> -\t\t\treturn config_error_nonbool(var);\n> +\t\t\tgit_die_config(\"user.name\", \"Missing value for 'user.name'\");\n\nI'd rather have git_config_get_string() and a free() afterwards to avoid\nduplicating this \"Missing value for 'user.name'\" (which should be _()-ed\nif it stays).\n\n> -\n> -\tif (!strcmp(var, \"user.email\")) {\n> +\tif (!git_config_get_value(\"user.email\", &value)) {\n>  \t\tif (!value)\n> -\t\t\treturn config_error_nonbool(var);\n> +\t\t\tgit_die_config(\"user.email\", \"Missing value for 'user.email'\");\n\nLikewise.\n\n-- \nMatthieu Moy\nhttp://www-verimag.imag.fr/~moy/\n"},{"id":"247673","messageId":"xmqqd2c448tq.fsf@gitster.dls.corp.google.com","threadId":"37341","inReplyTo":"53EB5D58.7000300@gmail.com","subject":"Re: [PATCH v2 2/4] ll-merge.c: refactor `read_merge_config()` to use `git_config_string()`","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2014-08-13T17:07:29Z","receivedAt":"2014-08-13T17:07:29Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Tanay Abhra <tanayabh@gmail.com> writes:\n\n> There is one slight behavior change, previously \"merge.default\"\n> silently ignored a NULL value and didn't raise any error. But,\n> in the same function, all other values raise an error on a NULL\n> value. So to conform with other call sites in Git, a NULL value\n> for \"merge.default\" raises an error.\n\nBetter explained than v1 ;-)\n\n> Signed-off-by: Tanay Abhra <tanayabh@gmail.com>\n> ---\n> We cannot easily use the new config-set API here, because\n> much of the function is dedicated to processing\n> \"merge.<name>.variable\" which does not easily translate to\n> the new API. If it were for variables like,\n> \"merge.summary\", \"merge.tool\", and \"merge.verbosity\", we\n> could use the new API.\n\nI think this comment belongs to the log message, if only to serve as\na reminder for us that the API needs to be made more usable when the\ncaller wants to use these three-level names, which are quite common.\nThis code path knows the name of a low-level merge driver and wants\nto learn everything about that driver.  Another code path may know\nthe name of the branch and may want to scan \"branch.<name>.*\".\n\n>  ll-merge.c | 23 ++++++-----------------\n>  1 file changed, 6 insertions(+), 17 deletions(-)\n>\n> diff --git a/ll-merge.c b/ll-merge.c\n> index fb61ea6..8ea03e5 100644\n> --- a/ll-merge.c\n> +++ b/ll-merge.c\n> @@ -225,11 +225,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n>  \tconst char *key, *name;\n>  \tint namelen;\n>\n> -\tif (!strcmp(var, \"merge.default\")) {\n> -\t\tif (value)\n> -\t\t\tdefault_ll_merge = xstrdup(value);\n> -\t\treturn 0;\n> -\t}\n> +\tif (!strcmp(var, \"merge.default\"))\n> +\t\treturn git_config_string(&default_ll_merge, var, value);\n>\n>  \t/*\n>  \t * We are not interested in anything but \"merge.<name>.variable\";\n> @@ -254,12 +251,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n>  \t\tll_user_merge_tail = &(fn->next);\n>  \t}\n>\n> -\tif (!strcmp(\"name\", key)) {\n> -\t\tif (!value)\n> -\t\t\treturn error(\"%s: lacks value\", var);\n> -\t\tfn->description = xstrdup(value);\n> -\t\treturn 0;\n> -\t}\n> +\tif (!strcmp(\"name\", key))\n> +\t\treturn git_config_string(&fn->description, var, value);\n>\n>  \tif (!strcmp(\"driver\", key)) {\n>  \t\tif (!value)\n> @@ -285,12 +278,8 @@ static int read_merge_config(const char *var, const char *value, void *cb)\n>  \t\treturn 0;\n>  \t}\n>\n> -\tif (!strcmp(\"recursive\", key)) {\n> -\t\tif (!value)\n> -\t\t\treturn error(\"%s: lacks value\", var);\n> -\t\tfn->recursive = xstrdup(value);\n> -\t\treturn 0;\n> -\t}\n> +\tif (!strcmp(\"recursive\", key))\n> +\t\treturn git_config_string(&fn->recursive, var, value);\n>\n>  \treturn 0;\n>  }\n"},{"id":"247674","messageId":"xmqq8ums48hm.fsf@gitster.dls.corp.google.com","threadId":"37341","inReplyTo":"vpqppg4vdii.fsf@anie.imag.fr","subject":"Re: [PATCH 1/4] fast-import.c: replace `git_config()` with `git_config_get_*()` family","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2014-08-13T17:14:45Z","receivedAt":"2014-08-13T17:14:45Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> writes:\n\n> Not that it's terribly important, but I think it's good that your\n> refactoring also brings a few end-users benefits. It will help you show\n> off when you tell your friends what you did this summer (not \"I did\n> useless code churn\" ;-) ), and helps everybody see the benefits of your\n> GSoC ;-).\n\n;-)\n"},{"id":"247675","messageId":"xmqq4mxg48b3.fsf@gitster.dls.corp.google.com","threadId":"37341","inReplyTo":"vpq1tsks7kg.fsf@anie.imag.fr","subject":"Re: [PATCH/RFC v2 1/2] git_default_config() rewritten using the config-set API","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2014-08-13T17:18:40Z","receivedAt":"2014-08-13T17:18:40Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> writes:\n\n> Tanay Abhra <tanayabh@gmail.com> writes:\n>\n>> git_default_config() now uses config-set API functions to query for\n>> values.\n>\n> I believe you missed a few spots:\n>\n> $ git grep -n 'git_default_config[^(]'\n> Documentation/user-manual.txt:4287:        git_config(git_default_config);\n> archive.c:416:  git_config(git_default_config, NULL);\n> builtin/config.c:577:           git_config(git_default_config, NULL);\n> color.h:73: * if you are just going to change to git_default_config, too.\n> fetch-pack.c:880:       git_config(git_default_config, NULL);\n> http.c:393:     config.cascade_fn = git_default_config;\n> rerere.c:580:   git_config(git_default_config, NULL);\n> rerere.c:710:   git_config(git_default_config, NULL);\n>\n> The following ones should probably be rewritten too:\n>\n> archive.c:416:  git_config(git_default_config, NULL);\n> builtin/config.c:577:           git_config(git_default_config, NULL);\n> fetch-pack.c:880:       git_config(git_default_config, NULL);\n> rerere.c:580:   git_config(git_default_config, NULL);\n> rerere.c:710:   git_config(git_default_config, NULL);\n\nFor a one-person toy project it is OK to repurpose the existing\ngit_default_config() to do completely different thing and make it a\nflag day to switch the entire codebase, but in a collaborative\nenvironment where there may be multiple topics in flight, some of\nwhich may be happening where you are not even aware of, it is better\nto remove the existing git_default_config() and use a different name\nfor the different function you are introducing, to force new places\nthat expect the old git_default_config() to work as before to be\nnoticed with a linkage error.\n"}]}