{"thread":{"id":"13518","subject":"[PATCH 0/2] Fix two pet peeves of mine","startedAt":"2008-05-14T17:46:02Z","lastAt":"2008-05-15T01:52:55Z","messageCount":6,"participants":["Johannes Schindelin","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"76959","messageId":"alpine.DEB.1.00.0805141844580.30431@racer","threadId":"13518","inReplyTo":null,"subject":"[PATCH 0/2] Fix two pet peeves of mine","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-05-14T17:46:02Z","receivedAt":"2008-05-14T17:46:02Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nBoth of these patches can be considered cleanups: path_list is finally\nrenamed to string_list (since it is not special to paths), and\nproviding git_config() with a callback parameter.\n\nThe latter change is only the beginning: existing callers are not fixed.\n\nThese cleanup patches are rather large, so I though it would be best to \nprovide them just at the end of the merge window.\n\nJohannes Schindelin (2):\n  Rename path_list to string_list\n  Provide git_config with a callback-data parameter\n\n Documentation/CodingGuidelines              |    5 +-\n Documentation/technical/api-path-list.txt   |    9 --\n Documentation/technical/api-string-list.txt |   10 ++\n Makefile                                    |    4 +-\n alias.c                                     |    5 +-\n archive-tar.c                               |    6 +-\n builtin-add.c                               |    6 +-\n builtin-apply.c                             |    6 +-\n builtin-blame.c                             |   10 +-\n builtin-branch.c                            |    6 +-\n builtin-cat-file.c                          |    2 +-\n builtin-checkout-index.c                    |    2 +-\n builtin-checkout.c                          |    2 +-\n builtin-clean.c                             |    6 +-\n builtin-clone.c                             |    2 +-\n builtin-commit-tree.c                       |    2 +-\n builtin-commit.c                            |   28 +++---\n builtin-config.c                            |   26 +++---\n builtin-diff-files.c                        |    2 +-\n builtin-diff-index.c                        |    2 +-\n builtin-diff-tree.c                         |    2 +-\n builtin-diff.c                              |    2 +-\n builtin-fast-export.c                       |   16 ++--\n builtin-fetch-pack.c                        |    6 +-\n builtin-fetch.c                             |   20 ++--\n builtin-fmt-merge-msg.c                     |    4 +-\n builtin-gc.c                                |    6 +-\n builtin-http-fetch.c                        |    2 +-\n builtin-init-db.c                           |    4 +-\n builtin-log.c                               |   18 ++--\n builtin-ls-files.c                          |    2 +-\n builtin-ls-tree.c                           |    2 +-\n builtin-mailinfo.c                          |    2 +-\n builtin-mailsplit.c                         |   12 +-\n builtin-merge-base.c                        |    2 +-\n builtin-merge-recursive.c                   |  102 ++++++++++----------\n builtin-mv.c                                |   43 ++++----\n builtin-name-rev.c                          |    2 +-\n builtin-pack-objects.c                      |    6 +-\n builtin-read-tree.c                         |    4 +-\n builtin-reflog.c                            |    6 +-\n builtin-remote.c                            |  131 +++++++++++++-------------\n builtin-rerere.c                            |   54 +++++-----\n builtin-reset.c                             |    2 +-\n builtin-rev-list.c                          |    2 +-\n builtin-rev-parse.c                         |    2 +-\n builtin-revert.c                            |    2 +-\n builtin-rm.c                                |    2 +-\n builtin-shortlog.c                          |   42 ++++----\n builtin-show-branch.c                       |    6 +-\n builtin-show-ref.c                          |   10 +-\n builtin-symbolic-ref.c                      |    2 +-\n builtin-tag.c                               |    6 +-\n builtin-unpack-objects.c                    |    2 +-\n builtin-update-index.c                      |    2 +-\n builtin-update-ref.c                        |    2 +-\n builtin-verify-pack.c                       |    2 +-\n builtin-verify-tag.c                        |    2 +-\n builtin-write-tree.c                        |    2 +-\n cache.h                                     |   10 +-\n color.c                                     |    4 +-\n color.h                                     |    2 +-\n config.c                                    |   27 +++---\n connect.c                                   |    7 +-\n convert.c                                   |    4 +-\n daemon.c                                    |    4 +-\n diff-lib.c                                  |   22 ++--\n diff.c                                      |    8 +-\n diff.h                                      |    4 +-\n fast-import.c                               |    6 +-\n hash-object.c                               |    2 +-\n help.c                                      |    6 +-\n http.c                                      |    6 +-\n imap-send.c                                 |    4 +-\n index-pack.c                                |    6 +-\n ll-merge.c                                  |    4 +-\n mailmap.c                                   |   12 +-\n mailmap.h                                   |    4 +-\n pager.c                                     |    2 +-\n path-list.c                                 |  134 --------------------------\n path-list.h                                 |   28 ------\n receive-pack.c                              |    6 +-\n reflog-walk.c                               |   10 +-\n remote.c                                    |    4 +-\n setup.c                                     |    4 +-\n shortlog.h                                  |    6 +-\n string-list.c                               |  138 +++++++++++++++++++++++++++\n string-list.h                               |   28 ++++++\n unpack-file.c                               |    2 +-\n var.c                                       |    8 +-\n wt-status.c                                 |    4 +-\n wt-status.h                                 |    2 +-\n 92 files changed, 603 insertions(+), 592 deletions(-)\n delete mode 100644 Documentation/technical/api-path-list.txt\n create mode 100644 Documentation/technical/api-string-list.txt\n delete mode 100644 path-list.c\n delete mode 100644 path-list.h\n create mode 100644 string-list.c\n create mode 100644 string-list.h\n"},{"id":"76960","messageId":"alpine.DEB.1.00.0805141846170.30431@racer","threadId":"13518","inReplyTo":"alpine.DEB.1.00.0805141844580.30431@racer","subject":"[PATCH 1/2] Rename path_list to string_list","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-05-14T17:46:29Z","receivedAt":"2008-05-14T17:46:29Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nThe name path_list was correct for the first usage of that data structure,\nbut it really is a general-purpose string list.\n\n$ perl -i -pe 's/path-list/string-list/g' $(git grep -l path-list)\n$ perl -i -pe 's/path_list/string_list/g' $(git grep -l path_list)\n$ git mv path-list.h string-list.h\n$ git mv path-list.c string-list.c\n$ perl -i -pe 's/has_path/has_string/g' $(git grep -l has_path)\n$ perl -i -pe 's/path/string/g' string-list.[ch]\n\n... and then fix all users of string-list to access the member \"string\"\ninstead of \"path\"...\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n Documentation/CodingGuidelines              |    5 +-\n Documentation/technical/api-path-list.txt   |    9 --\n Documentation/technical/api-string-list.txt |   10 ++\n Makefile                                    |    4 +-\n builtin-blame.c                             |    4 +-\n builtin-commit.c                            |   20 ++--\n builtin-fast-export.c                       |   14 ++--\n builtin-fetch.c                             |   20 ++--\n builtin-mailsplit.c                         |   12 +-\n builtin-merge-recursive.c                   |   96 +++++++++---------\n builtin-mv.c                                |   41 ++++----\n builtin-remote.c                            |  123 ++++++++++++------------\n builtin-rerere.c                            |   48 +++++-----\n builtin-shortlog.c                          |   42 ++++----\n builtin-show-ref.c                          |   10 +-\n diff-lib.c                                  |   22 ++--\n mailmap.c                                   |   12 +-\n mailmap.h                                   |    4 +-\n path-list.c                                 |  134 --------------------------\n path-list.h                                 |   28 ------\n reflog-walk.c                               |   10 +-\n shortlog.h                                  |    6 +-\n string-list.c                               |  138 +++++++++++++++++++++++++++\n string-list.h                               |   28 ++++++\n 24 files changed, 424 insertions(+), 416 deletions(-)\n delete mode 100644 Documentation/technical/api-path-list.txt\n create mode 100644 Documentation/technical/api-string-list.txt\n delete mode 100644 path-list.c\n delete mode 100644 path-list.h\n create mode 100644 string-list.c\n create mode 100644 string-list.h\n\ndiff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines\nindex 994eb91..2dec38b 100644\n--- a/Documentation/CodingGuidelines\n+++ b/Documentation/CodingGuidelines\n@@ -103,8 +103,9 @@ For C programs:\n \n  - Use the API.  No, really.  We have a strbuf (variable length\n    string), several arrays with the ALLOC_GROW() macro, a\n-   path_list for sorted string lists, a hash map (mapping struct\n-   objects) named \"struct decorate\", amongst other things.\n+   string_list for sorted and unsorted string lists, a hash map\n+   (mapping struct objects) named \"struct decorate\", amongst other\n+   things.\n \n  - When you come up with an API, document it.\n \ndiff --git a/Documentation/technical/api-path-list.txt b/Documentation/technical/api-path-list.txt\ndeleted file mode 100644\nindex d077683..0000000\n--- a/Documentation/technical/api-path-list.txt\n+++ /dev/null\n@@ -1,9 +0,0 @@\n-path-list API\n-=============\n-\n-Talk about <path-list.h>, things like\n-\n-* it is not just paths but strings in general;\n-* the calling sequence.\n-\n-(Dscho)\ndiff --git a/Documentation/technical/api-string-list.txt b/Documentation/technical/api-string-list.txt\nnew file mode 100644\nindex 0000000..50fa4d0\n--- /dev/null\n+++ b/Documentation/technical/api-string-list.txt\n@@ -0,0 +1,10 @@\n+string-list API\n+===============\n+\n+Talk about <string-list.h>, things like\n+\n+* it can be a sorted list, or an unsorted list;\n+* discuss performance implications;\n+* the calling sequence.\n+\n+(Dscho)\ndiff --git a/Makefile b/Makefile\nindex 001a846..d3b980d 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -357,7 +357,7 @@ LIB_H += pack.h\n LIB_H += pack-revindex.h\n LIB_H += parse-options.h\n LIB_H += patch-ids.h\n-LIB_H += path-list.h\n+LIB_H += string-list.h\n LIB_H += pkt-line.h\n LIB_H += progress.h\n LIB_H += quote.h\n@@ -433,7 +433,7 @@ LIB_OBJS += pager.o\n LIB_OBJS += parse-options.o\n LIB_OBJS += patch-delta.o\n LIB_OBJS += patch-ids.o\n-LIB_OBJS += path-list.o\n+LIB_OBJS += string-list.o\n LIB_OBJS += path.o\n LIB_OBJS += pkt-line.o\n LIB_OBJS += pretty.o\ndiff --git a/builtin-blame.c b/builtin-blame.c\nindex 5c7546d..258ae42 100644\n--- a/builtin-blame.c\n+++ b/builtin-blame.c\n@@ -16,7 +16,7 @@\n #include \"quote.h\"\n #include \"xdiff-interface.h\"\n #include \"cache-tree.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"mailmap.h\"\n \n static char blame_usage[] =\n@@ -48,7 +48,7 @@ static int blank_boundary;\n static int incremental;\n static int cmd_is_annotate;\n static int xdl_opts = XDF_NEED_MINIMAL;\n-static struct path_list mailmap;\n+static struct string_list mailmap;\n \n #ifndef DEBUG\n #define DEBUG 0\ndiff --git a/builtin-commit.c b/builtin-commit.c\nindex d752243..59af472 100644\n--- a/builtin-commit.c\n+++ b/builtin-commit.c\n@@ -21,7 +21,7 @@\n #include \"strbuf.h\"\n #include \"utf8.h\"\n #include \"parse-options.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"unpack-trees.h\"\n \n static const char * const builtin_commit_usage[] = {\n@@ -147,7 +147,7 @@ static int commit_index_files(void)\n  * Take a union of paths in the index and the named tree (typically, \"HEAD\"),\n  * and return the paths that match the given pattern in list.\n  */\n-static int list_paths(struct path_list *list, const char *with_tree,\n+static int list_paths(struct string_list *list, const char *with_tree,\n \t\t      const char *prefix, const char **pattern)\n {\n \tint i;\n@@ -166,24 +166,24 @@ static int list_paths(struct path_list *list, const char *with_tree,\n \t\t\tcontinue;\n \t\tif (!pathspec_match(pattern, m, ce->name, 0))\n \t\t\tcontinue;\n-\t\tpath_list_insert(ce->name, list);\n+\t\tstring_list_insert(ce->name, list);\n \t}\n \n \treturn report_path_error(m, pattern, prefix ? strlen(prefix) : 0);\n }\n \n-static void add_remove_files(struct path_list *list)\n+static void add_remove_files(struct string_list *list)\n {\n \tint i;\n \tfor (i = 0; i < list->nr; i++) {\n \t\tstruct stat st;\n-\t\tstruct path_list_item *p = &(list->items[i]);\n+\t\tstruct string_list_item *p = &(list->items[i]);\n \n-\t\tif (!lstat(p->path, &st)) {\n-\t\t\tif (add_to_cache(p->path, &st, 0))\n+\t\tif (!lstat(p->string, &st)) {\n+\t\t\tif (add_to_cache(p->string, &st, 0))\n \t\t\t\tdie(\"updating files failed\");\n \t\t} else\n-\t\t\tremove_file_from_cache(p->path);\n+\t\t\tremove_file_from_cache(p->string);\n \t}\n }\n \n@@ -218,7 +218,7 @@ static void create_base_index(void)\n static char *prepare_index(int argc, const char **argv, const char *prefix)\n {\n \tint fd;\n-\tstruct path_list partial;\n+\tstruct string_list partial;\n \tconst char **pathspec = NULL;\n \n \tif (interactive) {\n@@ -300,7 +300,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)\n \t\tdie(\"cannot do a partial commit during a merge.\");\n \n \tmemset(&partial, 0, sizeof(partial));\n-\tpartial.strdup_paths = 1;\n+\tpartial.strdup_strings = 1;\n \tif (list_paths(&partial, initial_commit ? NULL : \"HEAD\", prefix, pathspec))\n \t\texit(1);\n \ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex e1c5630..a705029 100755\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -13,7 +13,7 @@\n #include \"log-tree.h\"\n #include \"revision.h\"\n #include \"decorate.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"utf8.h\"\n #include \"parse-options.h\"\n \n@@ -286,7 +286,7 @@ static void handle_tag(const char *name, struct tag *tag)\n }\n \n static void get_tags_and_duplicates(struct object_array *pending,\n-\t\t\t\t    struct path_list *extra_refs)\n+\t\t\t\t    struct string_list *extra_refs)\n {\n \tstruct tag *tag;\n \tint i;\n@@ -307,7 +307,7 @@ static void get_tags_and_duplicates(struct object_array *pending,\n \t\tcase OBJ_TAG:\n \t\t\ttag = (struct tag *)e->item;\n \t\t\twhile (tag && tag->object.type == OBJ_TAG) {\n-\t\t\t\tpath_list_insert(full_name, extra_refs)->util = tag;\n+\t\t\t\tstring_list_insert(full_name, extra_refs)->util = tag;\n \t\t\t\ttag = (struct tag *)tag->tagged;\n \t\t\t}\n \t\t\tif (!tag)\n@@ -327,19 +327,19 @@ static void get_tags_and_duplicates(struct object_array *pending,\n \t\t}\n \t\tif (commit->util)\n \t\t\t/* more than one name for the same object */\n-\t\t\tpath_list_insert(full_name, extra_refs)->util = commit;\n+\t\t\tstring_list_insert(full_name, extra_refs)->util = commit;\n \t\telse\n \t\t\tcommit->util = full_name;\n \t}\n }\n \n-static void handle_tags_and_duplicates(struct path_list *extra_refs)\n+static void handle_tags_and_duplicates(struct string_list *extra_refs)\n {\n \tstruct commit *commit;\n \tint i;\n \n \tfor (i = extra_refs->nr - 1; i >= 0; i--) {\n-\t\tconst char *name = extra_refs->items[i].path;\n+\t\tconst char *name = extra_refs->items[i].string;\n \t\tstruct object *object = extra_refs->items[i].util;\n \t\tswitch (object->type) {\n \t\tcase OBJ_TAG:\n@@ -360,7 +360,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info revs;\n \tstruct object_array commits = { 0, 0, NULL };\n-\tstruct path_list extra_refs = { NULL, 0, 0, 0 };\n+\tstruct string_list extra_refs = { NULL, 0, 0, 0 };\n \tstruct commit *commit;\n \tstruct option options[] = {\n \t\tOPT_INTEGER(0, \"progress\", &progress,\ndiff --git a/builtin-fetch.c b/builtin-fetch.c\nindex bfe7711..a3363e0 100644\n--- a/builtin-fetch.c\n+++ b/builtin-fetch.c\n@@ -5,7 +5,7 @@\n #include \"refs.h\"\n #include \"commit.h\"\n #include \"builtin.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"remote.h\"\n #include \"transport.h\"\n #include \"run-command.h\"\n@@ -446,8 +446,8 @@ static int fetch_refs(struct transport *transport, struct ref *ref_map)\n static int add_existing(const char *refname, const unsigned char *sha1,\n \t\t\tint flag, void *cbdata)\n {\n-\tstruct path_list *list = (struct path_list *)cbdata;\n-\tpath_list_insert(refname, list);\n+\tstruct string_list *list = (struct string_list *)cbdata;\n+\tstring_list_insert(refname, list);\n \treturn 0;\n }\n \n@@ -466,8 +466,8 @@ static void find_non_local_tags(struct transport *transport,\n \t\t\tstruct ref **head,\n \t\t\tstruct ref ***tail)\n {\n-\tstruct path_list existing_refs = { NULL, 0, 0, 0 };\n-\tstruct path_list new_refs = { NULL, 0, 0, 1 };\n+\tstatic struct string_list existing_refs = { NULL, 0, 0, 0 };\n+\tstruct string_list new_refs = { NULL, 0, 0, 1 };\n \tchar *ref_name;\n \tint ref_name_len;\n \tconst unsigned char *ref_sha1;\n@@ -496,11 +496,11 @@ static void find_non_local_tags(struct transport *transport,\n \t\t\t}\n \t\t}\n \n-\t\tif (!path_list_has_path(&existing_refs, ref_name) &&\n-\t\t    !path_list_has_path(&new_refs, ref_name) &&\n+\t\tif (!string_list_has_string(&existing_refs, ref_name) &&\n+\t\t    !string_list_has_string(&new_refs, ref_name) &&\n \t\t    (has_sha1_file(ref->old_sha1) ||\n \t\t     will_fetch(head, ref->old_sha1))) {\n-\t\t\tpath_list_insert(ref_name, &new_refs);\n+\t\t\tstring_list_insert(ref_name, &new_refs);\n \n \t\t\trm = alloc_ref_from_str(ref_name);\n \t\t\trm->peer_ref = alloc_ref_from_str(ref_name);\n@@ -511,8 +511,8 @@ static void find_non_local_tags(struct transport *transport,\n \t\t}\n \t\tfree(ref_name);\n \t}\n-\tpath_list_clear(&existing_refs, 0);\n-\tpath_list_clear(&new_refs, 0);\n+\tstring_list_clear(&existing_refs, 0);\n+\tstring_list_clear(&new_refs, 0);\n }\n \n static int do_fetch(struct transport *transport,\ndiff --git a/builtin-mailsplit.c b/builtin-mailsplit.c\nindex 46b27cd..29df10f 100644\n--- a/builtin-mailsplit.c\n+++ b/builtin-mailsplit.c\n@@ -6,7 +6,7 @@\n  */\n #include \"cache.h\"\n #include \"builtin.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n \n static const char git_mailsplit_usage[] =\n \"git-mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> <mbox>|<Maildir>...\";\n@@ -97,7 +97,7 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)\n \texit(1);\n }\n \n-static int populate_maildir_list(struct path_list *list, const char *path)\n+static int populate_maildir_list(struct string_list *list, const char *path)\n {\n \tDIR *dir;\n \tstruct dirent *dent;\n@@ -118,7 +118,7 @@ static int populate_maildir_list(struct path_list *list, const char *path)\n \t\t\tif (dent->d_name[0] == '.')\n \t\t\t\tcontinue;\n \t\t\tsnprintf(name, sizeof(name), \"%s/%s\", *sub, dent->d_name);\n-\t\t\tpath_list_insert(name, list);\n+\t\t\tstring_list_insert(name, list);\n \t\t}\n \n \t\tclosedir(dir);\n@@ -134,14 +134,14 @@ static int split_maildir(const char *maildir, const char *dir,\n \tchar name[PATH_MAX];\n \tint ret = -1;\n \tint i;\n-\tstruct path_list list = {NULL, 0, 0, 1};\n+\tstruct string_list list = {NULL, 0, 0, 1};\n \n \tif (populate_maildir_list(&list, maildir) < 0)\n \t\tgoto out;\n \n \tfor (i = 0; i < list.nr; i++) {\n \t\tFILE *f;\n-\t\tsnprintf(file, sizeof(file), \"%s/%s\", maildir, list.items[i].path);\n+\t\tsnprintf(file, sizeof(file), \"%s/%s\", maildir, list.items[i].string);\n \t\tf = fopen(file, \"r\");\n \t\tif (!f) {\n \t\t\terror(\"cannot open mail %s (%s)\", file, strerror(errno));\n@@ -161,7 +161,7 @@ static int split_maildir(const char *maildir, const char *dir,\n \n \tret = skip;\n out:\n-\tpath_list_clear(&list, 1);\n+\tstring_list_clear(&list, 1);\n \treturn ret;\n }\n \ndiff --git a/builtin-merge-recursive.c b/builtin-merge-recursive.c\nindex 46e636f..fd4a032 100644\n--- a/builtin-merge-recursive.c\n+++ b/builtin-merge-recursive.c\n@@ -13,7 +13,7 @@\n #include \"diffcore.h\"\n #include \"tag.h\"\n #include \"unpack-trees.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"xdiff-interface.h\"\n #include \"ll-merge.h\"\n #include \"interpolate.h\"\n@@ -87,8 +87,8 @@ struct stage_data\n \tunsigned processed:1;\n };\n \n-static struct path_list current_file_set = {NULL, 0, 0, 1};\n-static struct path_list current_directory_set = {NULL, 0, 0, 1};\n+static struct string_list current_file_set = {NULL, 0, 0, 1};\n+static struct string_list current_directory_set = {NULL, 0, 0, 1};\n \n static int call_depth = 0;\n static int verbosity = 2;\n@@ -265,9 +265,9 @@ static int save_files_dirs(const unsigned char *sha1,\n \tnewpath[baselen + len] = '\\0';\n \n \tif (S_ISDIR(mode))\n-\t\tpath_list_insert(newpath, &current_directory_set);\n+\t\tstring_list_insert(newpath, &current_directory_set);\n \telse\n-\t\tpath_list_insert(newpath, &current_file_set);\n+\t\tstring_list_insert(newpath, &current_file_set);\n \tfree(newpath);\n \n \treturn READ_TREE_RECURSIVE;\n@@ -288,9 +288,9 @@ static int get_files_dirs(struct tree *tree)\n  */\n static struct stage_data *insert_stage_data(const char *path,\n \t\tstruct tree *o, struct tree *a, struct tree *b,\n-\t\tstruct path_list *entries)\n+\t\tstruct string_list *entries)\n {\n-\tstruct path_list_item *item;\n+\tstruct string_list_item *item;\n \tstruct stage_data *e = xcalloc(1, sizeof(struct stage_data));\n \tget_tree_entry(o->object.sha1, path,\n \t\t\te->stages[1].sha, &e->stages[1].mode);\n@@ -298,7 +298,7 @@ static struct stage_data *insert_stage_data(const char *path,\n \t\t\te->stages[2].sha, &e->stages[2].mode);\n \tget_tree_entry(b->object.sha1, path,\n \t\t\te->stages[3].sha, &e->stages[3].mode);\n-\titem = path_list_insert(path, entries);\n+\titem = string_list_insert(path, entries);\n \titem->util = e;\n \treturn e;\n }\n@@ -307,23 +307,23 @@ static struct stage_data *insert_stage_data(const char *path,\n  * Create a dictionary mapping file names to stage_data objects. The\n  * dictionary contains one entry for every path with a non-zero stage entry.\n  */\n-static struct path_list *get_unmerged(void)\n+static struct string_list *get_unmerged(void)\n {\n-\tstruct path_list *unmerged = xcalloc(1, sizeof(struct path_list));\n+\tstruct string_list *unmerged = xcalloc(1, sizeof(struct string_list));\n \tint i;\n \n-\tunmerged->strdup_paths = 1;\n+\tunmerged->strdup_strings = 1;\n \n \tfor (i = 0; i < active_nr; i++) {\n-\t\tstruct path_list_item *item;\n+\t\tstruct string_list_item *item;\n \t\tstruct stage_data *e;\n \t\tstruct cache_entry *ce = active_cache[i];\n \t\tif (!ce_stage(ce))\n \t\t\tcontinue;\n \n-\t\titem = path_list_lookup(ce->name, unmerged);\n+\t\titem = string_list_lookup(ce->name, unmerged);\n \t\tif (!item) {\n-\t\t\titem = path_list_insert(ce->name, unmerged);\n+\t\t\titem = string_list_insert(ce->name, unmerged);\n \t\t\titem->util = xcalloc(1, sizeof(struct stage_data));\n \t\t}\n \t\te = item->util;\n@@ -348,17 +348,17 @@ struct rename\n  * 'b_tree') to be able to associate the correct cache entries with\n  * the rename information. 'tree' is always equal to either a_tree or b_tree.\n  */\n-static struct path_list *get_renames(struct tree *tree,\n+static struct string_list *get_renames(struct tree *tree,\n \t\t\t\t\tstruct tree *o_tree,\n \t\t\t\t\tstruct tree *a_tree,\n \t\t\t\t\tstruct tree *b_tree,\n-\t\t\t\t\tstruct path_list *entries)\n+\t\t\t\t\tstruct string_list *entries)\n {\n \tint i;\n-\tstruct path_list *renames;\n+\tstruct string_list *renames;\n \tstruct diff_options opts;\n \n-\trenames = xcalloc(1, sizeof(struct path_list));\n+\trenames = xcalloc(1, sizeof(struct string_list));\n \tdiff_setup(&opts);\n \tDIFF_OPT_SET(&opts, RECURSIVE);\n \topts.detect_rename = DIFF_DETECT_RENAME;\n@@ -372,7 +372,7 @@ static struct path_list *get_renames(struct tree *tree,\n \tdiff_tree_sha1(o_tree->object.sha1, tree->object.sha1, \"\", &opts);\n \tdiffcore_std(&opts);\n \tfor (i = 0; i < diff_queued_diff.nr; ++i) {\n-\t\tstruct path_list_item *item;\n+\t\tstruct string_list_item *item;\n \t\tstruct rename *re;\n \t\tstruct diff_filepair *pair = diff_queued_diff.queue[i];\n \t\tif (pair->status != 'R') {\n@@ -382,20 +382,20 @@ static struct path_list *get_renames(struct tree *tree,\n \t\tre = xmalloc(sizeof(*re));\n \t\tre->processed = 0;\n \t\tre->pair = pair;\n-\t\titem = path_list_lookup(re->pair->one->path, entries);\n+\t\titem = string_list_lookup(re->pair->one->path, entries);\n \t\tif (!item)\n \t\t\tre->src_entry = insert_stage_data(re->pair->one->path,\n \t\t\t\t\to_tree, a_tree, b_tree, entries);\n \t\telse\n \t\t\tre->src_entry = item->util;\n \n-\t\titem = path_list_lookup(re->pair->two->path, entries);\n+\t\titem = string_list_lookup(re->pair->two->path, entries);\n \t\tif (!item)\n \t\t\tre->dst_entry = insert_stage_data(re->pair->two->path,\n \t\t\t\t\to_tree, a_tree, b_tree, entries);\n \t\telse\n \t\t\tre->dst_entry = item->util;\n-\t\titem = path_list_insert(pair->one->path, renames);\n+\t\titem = string_list_insert(pair->one->path, renames);\n \t\titem->util = re;\n \t}\n \topts.output_format = DIFF_FORMAT_NO_OUTPUT;\n@@ -472,12 +472,12 @@ static char *unique_path(const char *path, const char *branch)\n \tfor (; *p; ++p)\n \t\tif ('/' == *p)\n \t\t\t*p = '_';\n-\twhile (path_list_has_path(&current_file_set, newpath) ||\n-\t       path_list_has_path(&current_directory_set, newpath) ||\n+\twhile (string_list_has_string(&current_file_set, newpath) ||\n+\t       string_list_has_string(&current_directory_set, newpath) ||\n \t       lstat(newpath, &st) == 0)\n \t\tsprintf(p, \"_%d\", suffix++);\n \n-\tpath_list_insert(newpath, &current_file_set);\n+\tstring_list_insert(newpath, &current_file_set);\n \treturn newpath;\n }\n \n@@ -733,13 +733,13 @@ static void conflict_rename_rename(struct rename *ren1,\n \tconst char *ren2_dst = ren2->pair->two->path;\n \tconst char *dst_name1 = ren1_dst;\n \tconst char *dst_name2 = ren2_dst;\n-\tif (path_list_has_path(&current_directory_set, ren1_dst)) {\n+\tif (string_list_has_string(&current_directory_set, ren1_dst)) {\n \t\tdst_name1 = del[delp++] = unique_path(ren1_dst, branch1);\n \t\toutput(1, \"%s is a directory in %s added as %s instead\",\n \t\t       ren1_dst, branch2, dst_name1);\n \t\tremove_file(0, ren1_dst, 0);\n \t}\n-\tif (path_list_has_path(&current_directory_set, ren2_dst)) {\n+\tif (string_list_has_string(&current_directory_set, ren2_dst)) {\n \t\tdst_name2 = del[delp++] = unique_path(ren2_dst, branch2);\n \t\toutput(1, \"%s is a directory in %s added as %s instead\",\n \t\t       ren2_dst, branch1, dst_name2);\n@@ -789,30 +789,30 @@ static void conflict_rename_rename_2(struct rename *ren1,\n \tfree(new_path1);\n }\n \n-static int process_renames(struct path_list *a_renames,\n-\t\t\t   struct path_list *b_renames,\n+static int process_renames(struct string_list *a_renames,\n+\t\t\t   struct string_list *b_renames,\n \t\t\t   const char *a_branch,\n \t\t\t   const char *b_branch)\n {\n \tint clean_merge = 1, i, j;\n-\tstruct path_list a_by_dst = {NULL, 0, 0, 0}, b_by_dst = {NULL, 0, 0, 0};\n+\tstruct string_list a_by_dst = {NULL, 0, 0, 0}, b_by_dst = {NULL, 0, 0, 0};\n \tconst struct rename *sre;\n \n \tfor (i = 0; i < a_renames->nr; i++) {\n \t\tsre = a_renames->items[i].util;\n-\t\tpath_list_insert(sre->pair->two->path, &a_by_dst)->util\n+\t\tstring_list_insert(sre->pair->two->path, &a_by_dst)->util\n \t\t\t= sre->dst_entry;\n \t}\n \tfor (i = 0; i < b_renames->nr; i++) {\n \t\tsre = b_renames->items[i].util;\n-\t\tpath_list_insert(sre->pair->two->path, &b_by_dst)->util\n+\t\tstring_list_insert(sre->pair->two->path, &b_by_dst)->util\n \t\t\t= sre->dst_entry;\n \t}\n \n \tfor (i = 0, j = 0; i < a_renames->nr || j < b_renames->nr;) {\n \t\tint compare;\n \t\tchar *src;\n-\t\tstruct path_list *renames1, *renames2, *renames2Dst;\n+\t\tstruct string_list *renames1, *renames2, *renames2Dst;\n \t\tstruct rename *ren1 = NULL, *ren2 = NULL;\n \t\tconst char *branch1, *branch2;\n \t\tconst char *ren1_src, *ren1_dst;\n@@ -824,8 +824,8 @@ static int process_renames(struct path_list *a_renames,\n \t\t\tcompare = -1;\n \t\t\tren1 = a_renames->items[i++].util;\n \t\t} else {\n-\t\t\tcompare = strcmp(a_renames->items[i].path,\n-\t\t\t\t\tb_renames->items[j].path);\n+\t\t\tcompare = strcmp(a_renames->items[i].string,\n+\t\t\t\t\tb_renames->items[j].string);\n \t\t\tif (compare <= 0)\n \t\t\t\tren1 = a_renames->items[i++].util;\n \t\t\tif (compare >= 0)\n@@ -914,7 +914,7 @@ static int process_renames(struct path_list *a_renames,\n \t\t\t}\n \t\t} else {\n \t\t\t/* Renamed in 1, maybe changed in 2 */\n-\t\t\tstruct path_list_item *item;\n+\t\t\tstruct string_list_item *item;\n \t\t\t/* we only use sha1 and mode of these */\n \t\t\tstruct diff_filespec src_other, dst_other;\n \t\t\tint try_merge, stage = a_renames == renames1 ? 3: 2;\n@@ -928,7 +928,7 @@ static int process_renames(struct path_list *a_renames,\n \n \t\t\ttry_merge = 0;\n \n-\t\t\tif (path_list_has_path(&current_directory_set, ren1_dst)) {\n+\t\t\tif (string_list_has_string(&current_directory_set, ren1_dst)) {\n \t\t\t\tclean_merge = 0;\n \t\t\t\toutput(1, \"CONFLICT (rename/directory): Renamed %s->%s in %s \"\n \t\t\t\t       \" directory %s added in %s\",\n@@ -953,7 +953,7 @@ static int process_renames(struct path_list *a_renames,\n \t\t\t\tnew_path = unique_path(ren1_dst, branch2);\n \t\t\t\toutput(1, \"Added as %s instead\", new_path);\n \t\t\t\tupdate_file(0, dst_other.sha1, dst_other.mode, new_path);\n-\t\t\t} else if ((item = path_list_lookup(ren1_dst, renames2Dst))) {\n+\t\t\t} else if ((item = string_list_lookup(ren1_dst, renames2Dst))) {\n \t\t\t\tren2 = item->util;\n \t\t\t\tclean_merge = 0;\n \t\t\t\tren2->processed = 1;\n@@ -1009,8 +1009,8 @@ static int process_renames(struct path_list *a_renames,\n \t\t\t}\n \t\t}\n \t}\n-\tpath_list_clear(&a_by_dst, 0);\n-\tpath_list_clear(&b_by_dst, 0);\n+\tstring_list_clear(&a_by_dst, 0);\n+\tstring_list_clear(&b_by_dst, 0);\n \n \treturn clean_merge;\n }\n@@ -1088,7 +1088,7 @@ static int process_entry(const char *path, struct stage_data *entry,\n \t\t\tsha = b_sha;\n \t\t\tconf = \"directory/file\";\n \t\t}\n-\t\tif (path_list_has_path(&current_directory_set, path)) {\n+\t\tif (string_list_has_string(&current_directory_set, path)) {\n \t\t\tconst char *new_path = unique_path(path, add_branch);\n \t\t\tclean_merge = 0;\n \t\t\toutput(1, \"CONFLICT (%s): There is a directory with name %s in %s. \"\n@@ -1179,10 +1179,10 @@ int merge_trees(struct tree *head,\n \t\t    sha1_to_hex(merge->object.sha1));\n \n \tif (unmerged_cache()) {\n-\t\tstruct path_list *entries, *re_head, *re_merge;\n+\t\tstruct string_list *entries, *re_head, *re_merge;\n \t\tint i;\n-\t\tpath_list_clear(&current_file_set, 1);\n-\t\tpath_list_clear(&current_directory_set, 1);\n+\t\tstring_list_clear(&current_file_set, 1);\n+\t\tstring_list_clear(&current_directory_set, 1);\n \t\tget_files_dirs(head);\n \t\tget_files_dirs(merge);\n \n@@ -1192,16 +1192,16 @@ int merge_trees(struct tree *head,\n \t\tclean = process_renames(re_head, re_merge,\n \t\t\t\tbranch1, branch2);\n \t\tfor (i = 0; i < entries->nr; i++) {\n-\t\t\tconst char *path = entries->items[i].path;\n+\t\t\tconst char *path = entries->items[i].string;\n \t\t\tstruct stage_data *e = entries->items[i].util;\n \t\t\tif (!e->processed\n \t\t\t\t&& !process_entry(path, e, branch1, branch2))\n \t\t\t\tclean = 0;\n \t\t}\n \n-\t\tpath_list_clear(re_merge, 0);\n-\t\tpath_list_clear(re_head, 0);\n-\t\tpath_list_clear(entries, 1);\n+\t\tstring_list_clear(re_merge, 0);\n+\t\tstring_list_clear(re_head, 0);\n+\t\tstring_list_clear(entries, 1);\n \n \t}\n \telse\ndiff --git a/builtin-mv.c b/builtin-mv.c\nindex fb8ffb4..c0e31d8 100644\n--- a/builtin-mv.c\n+++ b/builtin-mv.c\n@@ -7,7 +7,7 @@\n #include \"builtin.h\"\n #include \"dir.h\"\n #include \"cache-tree.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"parse-options.h\"\n \n static const char * const builtin_mv_usage[] = {\n@@ -36,13 +36,14 @@ static const char **copy_pathspec(const char *prefix, const char **pathspec,\n \treturn get_pathspec(prefix, result);\n }\n \n-static void show_list(const char *label, struct path_list *list)\n+static void show_list(const char *label, struct string_list *list)\n {\n \tif (list->nr > 0) {\n \t\tint i;\n \t\tprintf(\"%s\", label);\n \t\tfor (i = 0; i < list->nr; i++)\n-\t\t\tprintf(\"%s%s\", i > 0 ? \", \" : \"\", list->items[i].path);\n+\t\t\tprintf(\"%s%s\", i > 0 ? \", \" : \"\",\n+\t\t\t\t\tlist->items[i].string);\n \t\tputchar('\\n');\n \t}\n }\n@@ -75,11 +76,11 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \tconst char **source, **destination, **dest_path;\n \tenum update_mode { BOTH = 0, WORKING_DIRECTORY, INDEX } *modes;\n \tstruct stat st;\n-\tstruct path_list overwritten = {NULL, 0, 0, 0};\n-\tstruct path_list src_for_dst = {NULL, 0, 0, 0};\n-\tstruct path_list added = {NULL, 0, 0, 0};\n-\tstruct path_list deleted = {NULL, 0, 0, 0};\n-\tstruct path_list changed = {NULL, 0, 0, 0};\n+\tstruct string_list overwritten = {NULL, 0, 0, 0};\n+\tstruct string_list src_for_dst = {NULL, 0, 0, 0};\n+\tstruct string_list added = {NULL, 0, 0, 0};\n+\tstruct string_list deleted = {NULL, 0, 0, 0};\n+\tstruct string_list changed = {NULL, 0, 0, 0};\n \n \tgit_config(git_default_config);\n \n@@ -189,16 +190,16 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \t\t\t\t\t\t\t\" will overwrite!\\n\",\n \t\t\t\t\t\t\tbad);\n \t\t\t\t\tbad = NULL;\n-\t\t\t\t\tpath_list_insert(dst, &overwritten);\n+\t\t\t\t\tstring_list_insert(dst, &overwritten);\n \t\t\t\t} else\n \t\t\t\t\tbad = \"Cannot overwrite\";\n \t\t\t}\n \t\t} else if (cache_name_pos(src, length) < 0)\n \t\t\tbad = \"not under version control\";\n-\t\telse if (path_list_has_path(&src_for_dst, dst))\n+\t\telse if (string_list_has_string(&src_for_dst, dst))\n \t\t\tbad = \"multiple sources for the same target\";\n \t\telse\n-\t\t\tpath_list_insert(dst, &src_for_dst);\n+\t\t\tstring_list_insert(dst, &src_for_dst);\n \n \t\tif (bad) {\n \t\t\tif (ignore_errors) {\n@@ -228,15 +229,15 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \t\t\tcontinue;\n \n \t\tif (cache_name_pos(src, strlen(src)) >= 0) {\n-\t\t\tpath_list_insert(src, &deleted);\n+\t\t\tstring_list_insert(src, &deleted);\n \n \t\t\t/* destination can be a directory with 1 file inside */\n-\t\t\tif (path_list_has_path(&overwritten, dst))\n-\t\t\t\tpath_list_insert(dst, &changed);\n+\t\t\tif (string_list_has_string(&overwritten, dst))\n+\t\t\t\tstring_list_insert(dst, &changed);\n \t\t\telse\n-\t\t\t\tpath_list_insert(dst, &added);\n+\t\t\t\tstring_list_insert(dst, &added);\n \t\t} else\n-\t\t\tpath_list_insert(dst, &added);\n+\t\t\tstring_list_insert(dst, &added);\n \t}\n \n \tif (show_only) {\n@@ -245,7 +246,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \t\tshow_list(\"Deleting : \", &deleted);\n \t} else {\n \t\tfor (i = 0; i < changed.nr; i++) {\n-\t\t\tconst char *path = changed.items[i].path;\n+\t\t\tconst char *path = changed.items[i].string;\n \t\t\tint j = cache_name_pos(path, strlen(path));\n \t\t\tstruct cache_entry *ce = active_cache[j];\n \n@@ -255,13 +256,13 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \t\t}\n \n \t\tfor (i = 0; i < added.nr; i++) {\n-\t\t\tconst char *path = added.items[i].path;\n-\t\t\tif (add_file_to_cache(path, verbose))\n+\t\t\tconst char *string = added.items[i].string;\n+\t\t\tif (add_file_to_cache(string, verbose))\n \t\t\t\tdie(\"updating index entries failed\");\n \t\t}\n \n \t\tfor (i = 0; i < deleted.nr; i++)\n-\t\t\tremove_file_from_cache(deleted.items[i].path);\n+\t\t\tremove_file_from_cache(deleted.items[i].string);\n \n \t\tif (active_cache_changed) {\n \t\t\tif (write_cache(newfd, active_cache, active_nr) ||\ndiff --git a/builtin-remote.c b/builtin-remote.c\nindex 8b63619..4b4b2fc 100644\n--- a/builtin-remote.c\n+++ b/builtin-remote.c\n@@ -2,7 +2,7 @@\n #include \"parse-options.h\"\n #include \"transport.h\"\n #include \"remote.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"strbuf.h\"\n #include \"run-command.h\"\n #include \"refs.h\"\n@@ -37,11 +37,11 @@ static inline const char *skip_prefix(const char *name, const char *prefix)\n \n static int opt_parse_track(const struct option *opt, const char *arg, int not)\n {\n-\tstruct path_list *list = opt->value;\n+\tstruct string_list *list = opt->value;\n \tif (not)\n-\t\tpath_list_clear(list, 0);\n+\t\tstring_list_clear(list, 0);\n \telse\n-\t\tpath_list_append(arg, list);\n+\t\tstring_list_append(arg, list);\n \treturn 0;\n }\n \n@@ -57,7 +57,7 @@ static int fetch_remote(const char *name)\n static int add(int argc, const char **argv)\n {\n \tint fetch = 0, mirror = 0;\n-\tstruct path_list track = { NULL, 0, 0 };\n+\tstruct string_list track = { NULL, 0, 0 };\n \tconst char *master = NULL;\n \tstruct remote *remote;\n \tstruct strbuf buf, buf2;\n@@ -102,18 +102,18 @@ static int add(int argc, const char **argv)\n \tstrbuf_addf(&buf, \"remote.%s.fetch\", name);\n \n \tif (track.nr == 0)\n-\t\tpath_list_append(\"*\", &track);\n+\t\tstring_list_append(\"*\", &track);\n \tfor (i = 0; i < track.nr; i++) {\n-\t\tstruct path_list_item *item = track.items + i;\n+\t\tstruct string_list_item *item = track.items + i;\n \n \t\tstrbuf_reset(&buf2);\n \t\tstrbuf_addch(&buf2, '+');\n \t\tif (mirror)\n \t\t\tstrbuf_addf(&buf2, \"refs/%s:refs/%s\",\n-\t\t\t\t\titem->path, item->path);\n+\t\t\t\t\titem->string, item->string);\n \t\telse\n \t\t\tstrbuf_addf(&buf2, \"refs/heads/%s:refs/remotes/%s/%s\",\n-\t\t\t\t\titem->path, name, item->path);\n+\t\t\t\t\titem->string, name, item->string);\n \t\tif (git_config_set_multivar(buf.buf, buf2.buf, \"^$\", 0))\n \t\t\treturn 1;\n \t}\n@@ -141,23 +141,23 @@ static int add(int argc, const char **argv)\n \n \tstrbuf_release(&buf);\n \tstrbuf_release(&buf2);\n-\tpath_list_clear(&track, 0);\n+\tstring_list_clear(&track, 0);\n \n \treturn 0;\n }\n \n struct branch_info {\n \tchar *remote;\n-\tstruct path_list merge;\n+\tstruct string_list merge;\n };\n \n-static struct path_list branch_list;\n+static struct string_list branch_list;\n \n static int config_read_branches(const char *key, const char *value)\n {\n \tif (!prefixcmp(key, \"branch.\")) {\n \t\tchar *name;\n-\t\tstruct path_list_item *item;\n+\t\tstruct string_list_item *item;\n \t\tstruct branch_info *info;\n \t\tenum { REMOTE, MERGE } type;\n \n@@ -171,7 +171,7 @@ static int config_read_branches(const char *key, const char *value)\n \t\t} else\n \t\t\treturn 0;\n \n-\t\titem = path_list_insert(name, &branch_list);\n+\t\titem = string_list_insert(name, &branch_list);\n \n \t\tif (!item->util)\n \t\t\titem->util = xcalloc(sizeof(struct branch_info), 1);\n@@ -186,11 +186,11 @@ static int config_read_branches(const char *key, const char *value)\n \t\t\twhile (space) {\n \t\t\t\tchar *merge;\n \t\t\t\tmerge = xstrndup(value, space - value);\n-\t\t\t\tpath_list_append(merge, &info->merge);\n+\t\t\t\tstring_list_append(merge, &info->merge);\n \t\t\t\tvalue = skip_prefix(space + 1, \"refs/heads/\");\n \t\t\t\tspace = strchr(value, ' ');\n \t\t\t}\n-\t\t\tpath_list_append(xstrdup(value), &info->merge);\n+\t\t\tstring_list_append(xstrdup(value), &info->merge);\n \t\t}\n \t}\n \treturn 0;\n@@ -201,13 +201,13 @@ static void read_branches(void)\n \tif (branch_list.nr)\n \t\treturn;\n \tgit_config(config_read_branches);\n-\tsort_path_list(&branch_list);\n+\tsort_string_list(&branch_list);\n }\n \n struct ref_states {\n \tstruct remote *remote;\n \tstruct strbuf remote_prefix;\n-\tstruct path_list new, stale, tracked;\n+\tstruct string_list new, stale, tracked;\n };\n \n static int handle_one_branch(const char *refname,\n@@ -219,16 +219,16 @@ static int handle_one_branch(const char *refname,\n \tmemset(&refspec, 0, sizeof(refspec));\n \trefspec.dst = (char *)refname;\n \tif (!remote_find_tracking(states->remote, &refspec)) {\n-\t\tstruct path_list_item *item;\n+\t\tstruct string_list_item *item;\n \t\tconst char *name = skip_prefix(refspec.src, \"refs/heads/\");\n \t\t/* symbolic refs pointing nowhere were handled already */\n \t\tif ((flags & REF_ISSYMREF) ||\n-\t\t\t\tunsorted_path_list_has_path(&states->tracked,\n-\t\t\t\t\tname) ||\n-\t\t\t\tunsorted_path_list_has_path(&states->new,\n-\t\t\t\t\tname))\n+\t\t\t\tunsorted_string_list_has_string(\n+\t\t\t\t\t&states->tracked, name) ||\n+\t\t\t\tunsorted_string_list_has_string(\n+\t\t\t\t\t&states->new, name))\n \t\t\treturn 0;\n-\t\titem = path_list_append(name, &states->stale);\n+\t\titem = string_list_append(name, &states->stale);\n \t\titem->util = xstrdup(refname);\n \t}\n \treturn 0;\n@@ -244,9 +244,9 @@ static int get_ref_states(const struct ref *ref, struct ref_states *states)\n \t\t\tdie(\"Could not get fetch map for refspec %s\",\n \t\t\t\tstates->remote->fetch_refspec[i]);\n \n-\tstates->new.strdup_paths = states->tracked.strdup_paths = 1;\n+\tstates->new.strdup_strings = states->tracked.strdup_strings = 1;\n \tfor (ref = fetch_map; ref; ref = ref->next) {\n-\t\tstruct path_list *target = &states->tracked;\n+\t\tstruct string_list *target = &states->tracked;\n \t\tunsigned char sha1[20];\n \t\tvoid *util = NULL;\n \n@@ -257,7 +257,7 @@ static int get_ref_states(const struct ref *ref, struct ref_states *states)\n \t\t\tif (hashcmp(sha1, ref->new_sha1))\n \t\t\t\tutil = &states;\n \t\t}\n-\t\tpath_list_append(skip_prefix(ref->name, \"refs/heads/\"),\n+\t\tstring_list_append(skip_prefix(ref->name, \"refs/heads/\"),\n \t\t\t\ttarget)->util = util;\n \t}\n \tfree_refs(fetch_map);\n@@ -265,14 +265,14 @@ static int get_ref_states(const struct ref *ref, struct ref_states *states)\n \tstrbuf_addf(&states->remote_prefix,\n \t\t\"refs/remotes/%s/\", states->remote->name);\n \tfor_each_ref(handle_one_branch, states);\n-\tsort_path_list(&states->stale);\n+\tsort_string_list(&states->stale);\n \n \treturn 0;\n }\n \n struct branches_for_remote {\n \tconst char *prefix;\n-\tstruct path_list *branches;\n+\tstruct string_list *branches;\n };\n \n static int add_branch_for_removal(const char *refname,\n@@ -281,13 +281,13 @@ static int add_branch_for_removal(const char *refname,\n \tstruct branches_for_remote *branches = cb_data;\n \n \tif (!prefixcmp(refname, branches->prefix)) {\n-\t\tstruct path_list_item *item;\n+\t\tstruct string_list_item *item;\n \n \t\t/* make sure that symrefs are deleted */\n \t\tif (flags & REF_ISSYMREF)\n \t\t\treturn unlink(git_path(refname));\n \n-\t\titem = path_list_append(refname, branches->branches);\n+\t\titem = string_list_append(refname, branches->branches);\n \t\titem->util = xmalloc(20);\n \t\thashcpy(item->util, sha1);\n \t}\n@@ -295,12 +295,12 @@ static int add_branch_for_removal(const char *refname,\n \treturn 0;\n }\n \n-static int remove_branches(struct path_list *branches)\n+static int remove_branches(struct string_list *branches)\n {\n \tint i, result = 0;\n \tfor (i = 0; i < branches->nr; i++) {\n-\t\tstruct path_list_item *item = branches->items + i;\n-\t\tconst char *refname = item->path;\n+\t\tstruct string_list_item *item = branches->items + i;\n+\t\tconst char *refname = item->string;\n \t\tunsigned char *sha1 = item->util;\n \n \t\tif (delete_ref(refname, sha1))\n@@ -316,7 +316,7 @@ static int rm(int argc, const char **argv)\n \t};\n \tstruct remote *remote;\n \tstruct strbuf buf;\n-\tstruct path_list branches = { NULL, 0, 0, 1 };\n+\tstruct string_list branches = { NULL, 0, 0, 1 };\n \tstruct branches_for_remote cb_data = { NULL, &branches };\n \tint i;\n \n@@ -334,14 +334,14 @@ static int rm(int argc, const char **argv)\n \n \tread_branches();\n \tfor (i = 0; i < branch_list.nr; i++) {\n-\t\tstruct path_list_item *item = branch_list.items + i;\n+\t\tstruct string_list_item *item = branch_list.items + i;\n \t\tstruct branch_info *info = item->util;\n \t\tif (info->remote && !strcmp(info->remote, remote->name)) {\n \t\t\tconst char *keys[] = { \"remote\", \"merge\", NULL }, **k;\n \t\t\tfor (k = keys; *k; k++) {\n \t\t\t\tstrbuf_reset(&buf);\n \t\t\t\tstrbuf_addf(&buf, \"branch.%s.%s\",\n-\t\t\t\t\t\titem->path, *k);\n+\t\t\t\t\t\titem->string, *k);\n \t\t\t\tif (git_config_set(buf.buf, NULL)) {\n \t\t\t\t\tstrbuf_release(&buf);\n \t\t\t\t\treturn -1;\n@@ -363,12 +363,12 @@ static int rm(int argc, const char **argv)\n \n \tif (!i)\n \t\ti = remove_branches(&branches);\n-\tpath_list_clear(&branches, 1);\n+\tstring_list_clear(&branches, 1);\n \n \treturn i;\n }\n \n-static void show_list(const char *title, struct path_list *list)\n+static void show_list(const char *title, struct string_list *list)\n {\n \tint i;\n \n@@ -378,7 +378,7 @@ static void show_list(const char *title, struct path_list *list)\n \tprintf(title, list->nr > 1 ? \"es\" : \"\");\n \tprintf(\"\\n    \");\n \tfor (i = 0; i < list->nr; i++)\n-\t\tprintf(\"%s%s\", i ? \" \" : \"\", list->items[i].path);\n+\t\tprintf(\"%s%s\", i ? \" \" : \"\", list->items[i].string);\n \tprintf(\"\\n\");\n }\n \n@@ -438,7 +438,8 @@ static int show_or_prune(int argc, const char **argv, int prune)\n \n \t\t\tfor (i = 0; i < states.stale.nr; i++) {\n \t\t\t\tstrbuf_setlen(&buf, prefix_len);\n-\t\t\t\tstrbuf_addstr(&buf, states.stale.items[i].path);\n+\t\t\t\tstrbuf_addstr(&buf,\n+\t\t\t\t\t\tstates.stale.items[i].string);\n \t\t\t\tresult |= delete_ref(buf.buf, NULL);\n \t\t\t}\n \n@@ -451,7 +452,7 @@ static int show_or_prune(int argc, const char **argv, int prune)\n \t\t\t\tstates.remote->url[0] : \"(no URL)\");\n \n \t\tfor (i = 0; i < branch_list.nr; i++) {\n-\t\t\tstruct path_list_item *branch = branch_list.items + i;\n+\t\t\tstruct string_list_item *branch = branch_list.items + i;\n \t\t\tstruct branch_info *info = branch->util;\n \t\t\tint j;\n \n@@ -460,9 +461,9 @@ static int show_or_prune(int argc, const char **argv, int prune)\n \t\t\tprintf(\"  Remote branch%s merged with 'git pull' \"\n \t\t\t\t\"while on branch %s\\n   \",\n \t\t\t\tinfo->merge.nr > 1 ? \"es\" : \"\",\n-\t\t\t\tbranch->path);\n+\t\t\t\tbranch->string);\n \t\t\tfor (j = 0; j < info->merge.nr; j++)\n-\t\t\t\tprintf(\" %s\", info->merge.items[j].path);\n+\t\t\t\tprintf(\" %s\", info->merge.items[j].string);\n \t\t\tprintf(\"\\n\");\n \t\t}\n \n@@ -493,9 +494,9 @@ static int show_or_prune(int argc, const char **argv, int prune)\n \t\t}\n cleanup_states:\n \t\t/* NEEDSWORK: free remote */\n-\t\tpath_list_clear(&states.new, 0);\n-\t\tpath_list_clear(&states.stale, 0);\n-\t\tpath_list_clear(&states.tracked, 0);\n+\t\tstring_list_clear(&states.new, 0);\n+\t\tstring_list_clear(&states.stale, 0);\n+\t\tstring_list_clear(&states.tracked, 0);\n \t}\n \n \treturn result;\n@@ -503,15 +504,15 @@ cleanup_states:\n \n static int get_one_remote_for_update(struct remote *remote, void *priv)\n {\n-\tstruct path_list *list = priv;\n+\tstruct string_list *list = priv;\n \tif (!remote->skip_default_update)\n-\t\tpath_list_append(xstrdup(remote->name), list);\n+\t\tstring_list_append(xstrdup(remote->name), list);\n \treturn 0;\n }\n \n struct remote_group {\n \tconst char *name;\n-\tstruct path_list *list;\n+\tstruct string_list *list;\n } remote_group;\n \n static int get_remote_group(const char *key, const char *value)\n@@ -522,7 +523,7 @@ static int get_remote_group(const char *key, const char *value)\n \t\tint space = strcspn(value, \" \\t\\n\");\n \t\twhile (*value) {\n \t\t\tif (space > 1)\n-\t\t\t\tpath_list_append(xstrndup(value, space),\n+\t\t\t\tstring_list_append(xstrndup(value, space),\n \t\t\t\t\t\tremote_group.list);\n \t\t\tvalue += space + (value[space] != '\\0');\n \t\t\tspace = strcspn(value, \" \\t\\n\");\n@@ -535,7 +536,7 @@ static int get_remote_group(const char *key, const char *value)\n static int update(int argc, const char **argv)\n {\n \tint i, result = 0;\n-\tstruct path_list list = { NULL, 0, 0, 0 };\n+\tstruct string_list list = { NULL, 0, 0, 0 };\n \tstatic const char *default_argv[] = { NULL, \"default\", NULL };\n \n \tif (argc < 2) {\n@@ -553,20 +554,20 @@ static int update(int argc, const char **argv)\n \t\tresult = for_each_remote(get_one_remote_for_update, &list);\n \n \tfor (i = 0; i < list.nr; i++)\n-\t\tresult |= fetch_remote(list.items[i].path);\n+\t\tresult |= fetch_remote(list.items[i].string);\n \n \t/* all names were strdup()ed or strndup()ed */\n-\tlist.strdup_paths = 1;\n-\tpath_list_clear(&list, 0);\n+\tlist.strdup_strings = 1;\n+\tstring_list_clear(&list, 0);\n \n \treturn result;\n }\n \n static int get_one_entry(struct remote *remote, void *priv)\n {\n-\tstruct path_list *list = priv;\n+\tstruct string_list *list = priv;\n \n-\tpath_list_append(remote->name, list)->util = remote->url_nr ?\n+\tstring_list_append(remote->name, list)->util = remote->url_nr ?\n \t\t(void *)remote->url[0] : NULL;\n \tif (remote->url_nr > 1)\n \t\twarning(\"Remote %s has more than one URL\", remote->name);\n@@ -576,16 +577,16 @@ static int get_one_entry(struct remote *remote, void *priv)\n \n static int show_all(void)\n {\n-\tstruct path_list list = { NULL, 0, 0 };\n+\tstruct string_list list = { NULL, 0, 0 };\n \tint result = for_each_remote(get_one_entry, &list);\n \n \tif (!result) {\n \t\tint i;\n \n-\t\tsort_path_list(&list);\n+\t\tsort_string_list(&list);\n \t\tfor (i = 0; i < list.nr; i++) {\n-\t\t\tstruct path_list_item *item = list.items + i;\n-\t\t\tprintf(\"%s%s%s\\n\", item->path,\n+\t\t\tstruct string_list_item *item = list.items + i;\n+\t\t\tprintf(\"%s%s%s\\n\", item->string,\n \t\t\t\tverbose ? \"\\t\" : \"\",\n \t\t\t\tverbose && item->util ?\n \t\t\t\t\t(const char *)item->util : \"\");\ndiff --git a/builtin-rerere.c b/builtin-rerere.c\nindex c607aad..963b19e 100644\n--- a/builtin-rerere.c\n+++ b/builtin-rerere.c\n@@ -1,6 +1,6 @@\n #include \"builtin.h\"\n #include \"cache.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"xdiff/xdiff.h\"\n #include \"xdiff-interface.h\"\n \n@@ -23,7 +23,7 @@ static const char *rr_path(const char *name, const char *file)\n \treturn git_path(\"rr-cache/%s/%s\", name, file);\n }\n \n-static void read_rr(struct path_list *rr)\n+static void read_rr(struct string_list *rr)\n {\n \tunsigned char sha1[20];\n \tchar buf[PATH_MAX];\n@@ -43,18 +43,18 @@ static void read_rr(struct path_list *rr)\n \t\t\t; /* do nothing */\n \t\tif (i == sizeof(buf))\n \t\t\tdie(\"filename too long\");\n-\t\tpath_list_insert(buf, rr)->util = xstrdup(name);\n+\t\tstring_list_insert(buf, rr)->util = xstrdup(name);\n \t}\n \tfclose(in);\n }\n \n static struct lock_file write_lock;\n \n-static int write_rr(struct path_list *rr, int out_fd)\n+static int write_rr(struct string_list *rr, int out_fd)\n {\n \tint i;\n \tfor (i = 0; i < rr->nr; i++) {\n-\t\tconst char *path = rr->items[i].path;\n+\t\tconst char *path = rr->items[i].string;\n \t\tint length = strlen(path) + 1;\n \t\tif (write_in_full(out_fd, rr->items[i].util, 40) != 40 ||\n \t\t    write_in_full(out_fd, \"\\t\", 1) != 1 ||\n@@ -138,7 +138,7 @@ static int handle_file(const char *path,\n \treturn hunk_no;\n }\n \n-static int find_conflict(struct path_list *conflict)\n+static int find_conflict(struct string_list *conflict)\n {\n \tint i;\n \tif (read_cache() < 0)\n@@ -151,7 +151,7 @@ static int find_conflict(struct path_list *conflict)\n \t\t    ce_same_name(e2, e3) &&\n \t\t    S_ISREG(e2->ce_mode) &&\n \t\t    S_ISREG(e3->ce_mode)) {\n-\t\t\tpath_list_insert((const char *)e2->name, conflict);\n+\t\t\tstring_list_insert((const char *)e2->name, conflict);\n \t\t\ti++; /* skip over both #2 and #3 */\n \t\t}\n \t}\n@@ -198,9 +198,9 @@ static void unlink_rr_item(const char *name)\n \trmdir(git_path(\"rr-cache/%s\", name));\n }\n \n-static void garbage_collect(struct path_list *rr)\n+static void garbage_collect(struct string_list *rr)\n {\n-\tstruct path_list to_remove = { NULL, 0, 0, 1 };\n+\tstruct string_list to_remove = { NULL, 0, 0, 1 };\n \tchar buf[1024];\n \tDIR *dir;\n \tstruct dirent *e;\n@@ -226,12 +226,12 @@ static void garbage_collect(struct path_list *rr)\n \t\tcutoff = stat(buf, &st) ? cutoff_noresolve : cutoff_resolve;\n \t\tif (then < now - cutoff * 86400) {\n \t\t\tbuf[len + i] = '\\0';\n-\t\t\tpath_list_insert(xstrdup(name), &to_remove);\n+\t\t\tstring_list_insert(xstrdup(name), &to_remove);\n \t\t}\n \t}\n \tfor (i = 0; i < to_remove.nr; i++)\n-\t\tunlink_rr_item(to_remove.items[i].path);\n-\tpath_list_clear(&to_remove, 0);\n+\t\tunlink_rr_item(to_remove.items[i].string);\n+\tstring_list_clear(&to_remove, 0);\n }\n \n static int outf(void *dummy, mmbuffer_t *ptr, int nbuf)\n@@ -267,9 +267,9 @@ static int diff_two(const char *file1, const char *label1,\n \treturn 0;\n }\n \n-static int do_plain_rerere(struct path_list *rr, int fd)\n+static int do_plain_rerere(struct string_list *rr, int fd)\n {\n-\tstruct path_list conflict = { NULL, 0, 0, 1 };\n+\tstruct string_list conflict = { NULL, 0, 0, 1 };\n \tint i;\n \n \tfind_conflict(&conflict);\n@@ -282,8 +282,8 @@ static int do_plain_rerere(struct path_list *rr, int fd)\n \t */\n \n \tfor (i = 0; i < conflict.nr; i++) {\n-\t\tconst char *path = conflict.items[i].path;\n-\t\tif (!path_list_has_path(rr, path)) {\n+\t\tconst char *path = conflict.items[i].string;\n+\t\tif (!string_list_has_string(rr, path)) {\n \t\t\tunsigned char sha1[20];\n \t\t\tchar *hex;\n \t\t\tint ret;\n@@ -291,7 +291,7 @@ static int do_plain_rerere(struct path_list *rr, int fd)\n \t\t\tif (ret < 1)\n \t\t\t\tcontinue;\n \t\t\thex = xstrdup(sha1_to_hex(sha1));\n-\t\t\tpath_list_insert(path, rr)->util = hex;\n+\t\t\tstring_list_insert(path, rr)->util = hex;\n \t\t\tif (mkdir(git_path(\"rr-cache/%s\", hex), 0755))\n \t\t\t\tcontinue;;\n \t\t\thandle_file(path, NULL, rr_path(hex, \"preimage\"));\n@@ -308,7 +308,7 @@ static int do_plain_rerere(struct path_list *rr, int fd)\n \tfor (i = 0; i < rr->nr; i++) {\n \t\tstruct stat st;\n \t\tint ret;\n-\t\tconst char *path = rr->items[i].path;\n+\t\tconst char *path = rr->items[i].string;\n \t\tconst char *name = (const char *)rr->items[i].util;\n \n \t\tif (!stat(rr_path(name, \"preimage\"), &st) &&\n@@ -372,7 +372,7 @@ static int is_rerere_enabled(void)\n \treturn 1;\n }\n \n-static int setup_rerere(struct path_list *merge_rr)\n+static int setup_rerere(struct string_list *merge_rr)\n {\n \tint fd;\n \n@@ -388,7 +388,7 @@ static int setup_rerere(struct path_list *merge_rr)\n \n int rerere(void)\n {\n-\tstruct path_list merge_rr = { NULL, 0, 0, 1 };\n+\tstruct string_list merge_rr = { NULL, 0, 0, 1 };\n \tint fd;\n \n \tfd = setup_rerere(&merge_rr);\n@@ -399,7 +399,7 @@ int rerere(void)\n \n int cmd_rerere(int argc, const char **argv, const char *prefix)\n {\n-\tstruct path_list merge_rr = { NULL, 0, 0, 1 };\n+\tstruct string_list merge_rr = { NULL, 0, 0, 1 };\n \tint i, fd;\n \n \tfd = setup_rerere(&merge_rr);\n@@ -422,16 +422,16 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)\n \t\tgarbage_collect(&merge_rr);\n \telse if (!strcmp(argv[1], \"status\"))\n \t\tfor (i = 0; i < merge_rr.nr; i++)\n-\t\t\tprintf(\"%s\\n\", merge_rr.items[i].path);\n+\t\t\tprintf(\"%s\\n\", merge_rr.items[i].string);\n \telse if (!strcmp(argv[1], \"diff\"))\n \t\tfor (i = 0; i < merge_rr.nr; i++) {\n-\t\t\tconst char *path = merge_rr.items[i].path;\n+\t\t\tconst char *path = merge_rr.items[i].string;\n \t\t\tconst char *name = (const char *)merge_rr.items[i].util;\n \t\t\tdiff_two(rr_path(name, \"preimage\"), path, path, path);\n \t\t}\n \telse\n \t\tusage(git_rerere_usage);\n \n-\tpath_list_clear(&merge_rr, 1);\n+\tstring_list_clear(&merge_rr, 1);\n \treturn 0;\n }\ndiff --git a/builtin-shortlog.c b/builtin-shortlog.c\nindex e6a2865..71e6016 100644\n--- a/builtin-shortlog.c\n+++ b/builtin-shortlog.c\n@@ -2,7 +2,7 @@\n #include \"cache.h\"\n #include \"commit.h\"\n #include \"diff.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"revision.h\"\n #include \"utf8.h\"\n #include \"mailmap.h\"\n@@ -13,8 +13,8 @@ static const char shortlog_usage[] =\n \n static int compare_by_number(const void *a1, const void *a2)\n {\n-\tconst struct path_list_item *i1 = a1, *i2 = a2;\n-\tconst struct path_list *l1 = i1->util, *l2 = i2->util;\n+\tconst struct string_list_item *i1 = a1, *i2 = a2;\n+\tconst struct string_list *l1 = i1->util, *l2 = i2->util;\n \n \tif (l1->nr < l2->nr)\n \t\treturn 1;\n@@ -30,8 +30,8 @@ static void insert_one_record(struct shortlog *log,\n {\n \tconst char *dot3 = log->common_repo_prefix;\n \tchar *buffer, *p;\n-\tstruct path_list_item *item;\n-\tstruct path_list *onelines;\n+\tstruct string_list_item *item;\n+\tstruct string_list *onelines;\n \tchar namebuf[1024];\n \tsize_t len;\n \tconst char *eol;\n@@ -64,9 +64,9 @@ static void insert_one_record(struct shortlog *log,\n \t}\n \n \tbuffer = xstrdup(namebuf);\n-\titem = path_list_insert(buffer, &log->list);\n+\titem = string_list_insert(buffer, &log->list);\n \tif (item->util == NULL)\n-\t\titem->util = xcalloc(1, sizeof(struct path_list));\n+\t\titem->util = xcalloc(1, sizeof(struct string_list));\n \telse\n \t\tfree(buffer);\n \n@@ -104,11 +104,11 @@ static void insert_one_record(struct shortlog *log,\n \t\tonelines->alloc = alloc_nr(onelines->nr);\n \t\tonelines->items = xrealloc(onelines->items,\n \t\t\t\tonelines->alloc\n-\t\t\t\t* sizeof(struct path_list_item));\n+\t\t\t\t* sizeof(struct string_list_item));\n \t}\n \n \tonelines->items[onelines->nr].util = NULL;\n-\tonelines->items[onelines->nr++].path = buffer;\n+\tonelines->items[onelines->nr++].string = buffer;\n }\n \n static void read_from_stdin(struct shortlog *log)\n@@ -219,7 +219,7 @@ void shortlog_init(struct shortlog *log)\n \n \tread_mailmap(&log->mailmap, \".mailmap\", &log->common_repo_prefix);\n \n-\tlog->list.strdup_paths = 1;\n+\tlog->list.strdup_strings = 1;\n \tlog->wrap = DEFAULT_WRAPLEN;\n \tlog->in1 = DEFAULT_INDENT1;\n \tlog->in2 = DEFAULT_INDENT2;\n@@ -277,17 +277,17 @@ void shortlog_output(struct shortlog *log)\n {\n \tint i, j;\n \tif (log->sort_by_number)\n-\t\tqsort(log->list.items, log->list.nr, sizeof(struct path_list_item),\n+\t\tqsort(log->list.items, log->list.nr, sizeof(struct string_list_item),\n \t\t\tcompare_by_number);\n \tfor (i = 0; i < log->list.nr; i++) {\n-\t\tstruct path_list *onelines = log->list.items[i].util;\n+\t\tstruct string_list *onelines = log->list.items[i].util;\n \n \t\tif (log->summary) {\n-\t\t\tprintf(\"%6d\\t%s\\n\", onelines->nr, log->list.items[i].path);\n+\t\t\tprintf(\"%6d\\t%s\\n\", onelines->nr, log->list.items[i].string);\n \t\t} else {\n-\t\t\tprintf(\"%s (%d):\\n\", log->list.items[i].path, onelines->nr);\n+\t\t\tprintf(\"%s (%d):\\n\", log->list.items[i].string, onelines->nr);\n \t\t\tfor (j = onelines->nr - 1; j >= 0; j--) {\n-\t\t\t\tconst char *msg = onelines->items[j].path;\n+\t\t\t\tconst char *msg = onelines->items[j].string;\n \n \t\t\t\tif (log->wrap_lines) {\n \t\t\t\t\tint col = print_wrapped_text(msg, log->in1, log->in2, log->wrap);\n@@ -300,14 +300,14 @@ void shortlog_output(struct shortlog *log)\n \t\t\tputchar('\\n');\n \t\t}\n \n-\t\tonelines->strdup_paths = 1;\n-\t\tpath_list_clear(onelines, 1);\n+\t\tonelines->strdup_strings = 1;\n+\t\tstring_list_clear(onelines, 1);\n \t\tfree(onelines);\n \t\tlog->list.items[i].util = NULL;\n \t}\n \n-\tlog->list.strdup_paths = 1;\n-\tpath_list_clear(&log->list, 1);\n-\tlog->mailmap.strdup_paths = 1;\n-\tpath_list_clear(&log->mailmap, 1);\n+\tlog->list.strdup_strings = 1;\n+\tstring_list_clear(&log->list, 1);\n+\tlog->mailmap.strdup_strings = 1;\n+\tstring_list_clear(&log->mailmap, 1);\n }\ndiff --git a/builtin-show-ref.c b/builtin-show-ref.c\nindex a323633..add1600 100644\n--- a/builtin-show-ref.c\n+++ b/builtin-show-ref.c\n@@ -3,7 +3,7 @@\n #include \"refs.h\"\n #include \"object.h\"\n #include \"tag.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n \n static const char show_ref_usage[] = \"git show-ref [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash[=<length>]] [--abbrev[=<length>]] [--tags] [--heads] [--] [pattern*] < ref-list\";\n \n@@ -98,8 +98,8 @@ match:\n \n static int add_existing(const char *refname, const unsigned char *sha1, int flag, void *cbdata)\n {\n-\tstruct path_list *list = (struct path_list *)cbdata;\n-\tpath_list_insert(refname, list);\n+\tstruct string_list *list = (struct string_list *)cbdata;\n+\tstring_list_insert(refname, list);\n \treturn 0;\n }\n \n@@ -114,7 +114,7 @@ static int add_existing(const char *refname, const unsigned char *sha1, int flag\n  */\n static int exclude_existing(const char *match)\n {\n-\tstatic struct path_list existing_refs = { NULL, 0, 0, 0 };\n+\tstatic struct string_list existing_refs = { NULL, 0, 0, 0 };\n \tchar buf[1024];\n \tint matchlen = match ? strlen(match) : 0;\n \n@@ -143,7 +143,7 @@ static int exclude_existing(const char *match)\n \t\t\tfprintf(stderr, \"warning: ref '%s' ignored\\n\", ref);\n \t\t\tcontinue;\n \t\t}\n-\t\tif (!path_list_has_path(&existing_refs, ref)) {\n+\t\tif (!string_list_has_string(&existing_refs, ref)) {\n \t\t\tprintf(\"%s\\n\", buf);\n \t\t}\n \t}\ndiff --git a/diff-lib.c b/diff-lib.c\nindex fe2ccec..de06be0 100644\n--- a/diff-lib.c\n+++ b/diff-lib.c\n@@ -8,7 +8,7 @@\n #include \"diffcore.h\"\n #include \"revision.h\"\n #include \"cache-tree.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"unpack-trees.h\"\n #include \"refs.h\"\n \n@@ -16,7 +16,7 @@\n  * diff-files\n  */\n \n-static int read_directory(const char *path, struct path_list *list)\n+static int read_directory(const char *path, struct string_list *list)\n {\n \tDIR *dir;\n \tstruct dirent *e;\n@@ -26,7 +26,7 @@ static int read_directory(const char *path, struct path_list *list)\n \n \twhile ((e = readdir(dir)))\n \t\tif (strcmp(\".\", e->d_name) && strcmp(\"..\", e->d_name))\n-\t\t\tpath_list_insert(e->d_name, list);\n+\t\t\tstring_list_insert(e->d_name, list);\n \n \tclosedir(dir);\n \treturn 0;\n@@ -60,13 +60,13 @@ static int queue_diff(struct diff_options *o,\n \n \tif (S_ISDIR(mode1) || S_ISDIR(mode2)) {\n \t\tchar buffer1[PATH_MAX], buffer2[PATH_MAX];\n-\t\tstruct path_list p1 = {NULL, 0, 0, 1}, p2 = {NULL, 0, 0, 1};\n+\t\tstruct string_list p1 = {NULL, 0, 0, 1}, p2 = {NULL, 0, 0, 1};\n \t\tint len1 = 0, len2 = 0, i1, i2, ret = 0;\n \n \t\tif (name1 && read_directory(name1, &p1))\n \t\t\treturn -1;\n \t\tif (name2 && read_directory(name2, &p2)) {\n-\t\t\tpath_list_clear(&p1, 0);\n+\t\t\tstring_list_clear(&p1, 0);\n \t\t\treturn -1;\n \t\t}\n \n@@ -95,14 +95,14 @@ static int queue_diff(struct diff_options *o,\n \t\t\telse if (i2 == p2.nr)\n \t\t\t\tcomp = -1;\n \t\t\telse\n-\t\t\t\tcomp = strcmp(p1.items[i1].path,\n-\t\t\t\t\tp2.items[i2].path);\n+\t\t\t\tcomp = strcmp(p1.items[i1].string,\n+\t\t\t\t\tp2.items[i2].string);\n \n \t\t\tif (comp > 0)\n \t\t\t\tn1 = NULL;\n \t\t\telse {\n \t\t\t\tn1 = buffer1;\n-\t\t\t\tstrncpy(buffer1 + len1, p1.items[i1++].path,\n+\t\t\t\tstrncpy(buffer1 + len1, p1.items[i1++].string,\n \t\t\t\t\t\tPATH_MAX - len1);\n \t\t\t}\n \n@@ -110,14 +110,14 @@ static int queue_diff(struct diff_options *o,\n \t\t\t\tn2 = NULL;\n \t\t\telse {\n \t\t\t\tn2 = buffer2;\n-\t\t\t\tstrncpy(buffer2 + len2, p2.items[i2++].path,\n+\t\t\t\tstrncpy(buffer2 + len2, p2.items[i2++].string,\n \t\t\t\t\t\tPATH_MAX - len2);\n \t\t\t}\n \n \t\t\tret = queue_diff(o, n1, n2);\n \t\t}\n-\t\tpath_list_clear(&p1, 0);\n-\t\tpath_list_clear(&p2, 0);\n+\t\tstring_list_clear(&p1, 0);\n+\t\tstring_list_clear(&p2, 0);\n \n \t\treturn ret;\n \t} else {\ndiff --git a/mailmap.c b/mailmap.c\nindex f017255..88fc6f3 100644\n--- a/mailmap.c\n+++ b/mailmap.c\n@@ -1,8 +1,8 @@\n #include \"cache.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"mailmap.h\"\n \n-int read_mailmap(struct path_list *map, const char *filename, char **repo_abbrev)\n+int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev)\n {\n \tchar buffer[1024];\n \tFILE *f = fopen(filename, \"r\");\n@@ -54,16 +54,16 @@ int read_mailmap(struct path_list *map, const char *filename, char **repo_abbrev\n \t\tfor (i = 0; i < right_bracket - left_bracket - 1; i++)\n \t\t\temail[i] = tolower(left_bracket[i + 1]);\n \t\temail[right_bracket - left_bracket - 1] = '\\0';\n-\t\tpath_list_insert(email, map)->util = name;\n+\t\tstring_list_insert(email, map)->util = name;\n \t}\n \tfclose(f);\n \treturn 0;\n }\n \n-int map_email(struct path_list *map, const char *email, char *name, int maxlen)\n+int map_email(struct string_list *map, const char *email, char *name, int maxlen)\n {\n \tchar *p;\n-\tstruct path_list_item *item;\n+\tstruct string_list_item *item;\n \tchar buf[1024], *mailbuf;\n \tint i;\n \n@@ -80,7 +80,7 @@ int map_email(struct path_list *map, const char *email, char *name, int maxlen)\n \tfor (i = 0; i < p - email; i++)\n \t\tmailbuf[i] = tolower(email[i]);\n \tmailbuf[i] = 0;\n-\titem = path_list_lookup(mailbuf, map);\n+\titem = string_list_lookup(mailbuf, map);\n \tif (mailbuf != buf)\n \t\tfree(mailbuf);\n \tif (item != NULL) {\ndiff --git a/mailmap.h b/mailmap.h\nindex 3503fd2..6e48f83 100644\n--- a/mailmap.h\n+++ b/mailmap.h\n@@ -1,7 +1,7 @@\n #ifndef MAILMAP_H\n #define MAILMAP_H\n \n-int read_mailmap(struct path_list *map, const char *filename, char **repo_abbrev);\n-int map_email(struct path_list *mailmap, const char *email, char *name, int maxlen);\n+int read_mailmap(struct string_list *map, const char *filename, char **repo_abbrev);\n+int map_email(struct string_list *mailmap, const char *email, char *name, int maxlen);\n \n #endif\ndiff --git a/path-list.c b/path-list.c\ndeleted file mode 100644\nindex 92e5cf2..0000000\n--- a/path-list.c\n+++ /dev/null\n@@ -1,134 +0,0 @@\n-#include \"cache.h\"\n-#include \"path-list.h\"\n-\n-/* if there is no exact match, point to the index where the entry could be\n- * inserted */\n-static int get_entry_index(const struct path_list *list, const char *path,\n-\t\tint *exact_match)\n-{\n-\tint left = -1, right = list->nr;\n-\n-\twhile (left + 1 < right) {\n-\t\tint middle = (left + right) / 2;\n-\t\tint compare = strcmp(path, list->items[middle].path);\n-\t\tif (compare < 0)\n-\t\t\tright = middle;\n-\t\telse if (compare > 0)\n-\t\t\tleft = middle;\n-\t\telse {\n-\t\t\t*exact_match = 1;\n-\t\t\treturn middle;\n-\t\t}\n-\t}\n-\n-\t*exact_match = 0;\n-\treturn right;\n-}\n-\n-/* returns -1-index if already exists */\n-static int add_entry(struct path_list *list, const char *path)\n-{\n-\tint exact_match;\n-\tint index = get_entry_index(list, path, &exact_match);\n-\n-\tif (exact_match)\n-\t\treturn -1 - index;\n-\n-\tif (list->nr + 1 >= list->alloc) {\n-\t\tlist->alloc += 32;\n-\t\tlist->items = xrealloc(list->items, list->alloc\n-\t\t\t\t* sizeof(struct path_list_item));\n-\t}\n-\tif (index < list->nr)\n-\t\tmemmove(list->items + index + 1, list->items + index,\n-\t\t\t\t(list->nr - index)\n-\t\t\t\t* sizeof(struct path_list_item));\n-\tlist->items[index].path = list->strdup_paths ?\n-\t\txstrdup(path) : (char *)path;\n-\tlist->items[index].util = NULL;\n-\tlist->nr++;\n-\n-\treturn index;\n-}\n-\n-struct path_list_item *path_list_insert(const char *path, struct path_list *list)\n-{\n-\tint index = add_entry(list, path);\n-\n-\tif (index < 0)\n-\t\tindex = -1 - index;\n-\n-\treturn list->items + index;\n-}\n-\n-int path_list_has_path(const struct path_list *list, const char *path)\n-{\n-\tint exact_match;\n-\tget_entry_index(list, path, &exact_match);\n-\treturn exact_match;\n-}\n-\n-struct path_list_item *path_list_lookup(const char *path, struct path_list *list)\n-{\n-\tint exact_match, i = get_entry_index(list, path, &exact_match);\n-\tif (!exact_match)\n-\t\treturn NULL;\n-\treturn list->items + i;\n-}\n-\n-void path_list_clear(struct path_list *list, int free_util)\n-{\n-\tif (list->items) {\n-\t\tint i;\n-\t\tif (list->strdup_paths) {\n-\t\t\tfor (i = 0; i < list->nr; i++)\n-\t\t\t\tfree(list->items[i].path);\n-\t\t}\n-\t\tif (free_util) {\n-\t\t\tfor (i = 0; i < list->nr; i++)\n-\t\t\t\tfree(list->items[i].util);\n-\t\t}\n-\t\tfree(list->items);\n-\t}\n-\tlist->items = NULL;\n-\tlist->nr = list->alloc = 0;\n-}\n-\n-void print_path_list(const char *text, const struct path_list *p)\n-{\n-\tint i;\n-\tif ( text )\n-\t\tprintf(\"%s\\n\", text);\n-\tfor (i = 0; i < p->nr; i++)\n-\t\tprintf(\"%s:%p\\n\", p->items[i].path, p->items[i].util);\n-}\n-\n-struct path_list_item *path_list_append(const char *path, struct path_list *list)\n-{\n-\tALLOC_GROW(list->items, list->nr + 1, list->alloc);\n-\tlist->items[list->nr].path =\n-\t\tlist->strdup_paths ? xstrdup(path) : (char *)path;\n-\treturn list->items + list->nr++;\n-}\n-\n-static int cmp_items(const void *a, const void *b)\n-{\n-\tconst struct path_list_item *one = a;\n-\tconst struct path_list_item *two = b;\n-\treturn strcmp(one->path, two->path);\n-}\n-\n-void sort_path_list(struct path_list *list)\n-{\n-\tqsort(list->items, list->nr, sizeof(*list->items), cmp_items);\n-}\n-\n-int unsorted_path_list_has_path(struct path_list *list, const char *path)\n-{\n-\tint i;\n-\tfor (i = 0; i < list->nr; i++)\n-\t\tif (!strcmp(path, list->items[i].path))\n-\t\t\treturn 1;\n-\treturn 0;\n-}\n-\ndiff --git a/path-list.h b/path-list.h\ndeleted file mode 100644\nindex ca2cbba..0000000\n--- a/path-list.h\n+++ /dev/null\n@@ -1,28 +0,0 @@\n-#ifndef PATH_LIST_H\n-#define PATH_LIST_H\n-\n-struct path_list_item {\n-\tchar *path;\n-\tvoid *util;\n-};\n-struct path_list\n-{\n-\tstruct path_list_item *items;\n-\tunsigned int nr, alloc;\n-\tunsigned int strdup_paths:1;\n-};\n-\n-void print_path_list(const char *text, const struct path_list *p);\n-void path_list_clear(struct path_list *list, int free_util);\n-\n-/* Use these functions only on sorted lists: */\n-int path_list_has_path(const struct path_list *list, const char *path);\n-struct path_list_item *path_list_insert(const char *path, struct path_list *list);\n-struct path_list_item *path_list_lookup(const char *path, struct path_list *list);\n-\n-/* Use these functions only on unsorted lists: */\n-struct path_list_item *path_list_append(const char *path, struct path_list *list);\n-void sort_path_list(struct path_list *list);\n-int unsorted_path_list_has_path(struct path_list *list, const char *path);\n-\n-#endif /* PATH_LIST_H */\ndiff --git a/reflog-walk.c b/reflog-walk.c\nindex ee1456b..f751fdc 100644\n--- a/reflog-walk.c\n+++ b/reflog-walk.c\n@@ -3,7 +3,7 @@\n #include \"refs.h\"\n #include \"diff.h\"\n #include \"revision.h\"\n-#include \"path-list.h\"\n+#include \"string-list.h\"\n #include \"reflog-walk.h\"\n \n struct complete_reflogs {\n@@ -127,7 +127,7 @@ struct commit_reflog {\n \n struct reflog_walk_info {\n \tstruct commit_info_lifo reflogs;\n-\tstruct path_list complete_reflogs;\n+\tstruct string_list complete_reflogs;\n \tstruct commit_reflog *last_commit_reflog;\n };\n \n@@ -141,7 +141,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,\n {\n \tunsigned long timestamp = 0;\n \tint recno = -1;\n-\tstruct path_list_item *item;\n+\tstruct string_list_item *item;\n \tstruct complete_reflogs *reflogs;\n \tchar *branch, *at = strchr(name, '@');\n \tstruct commit_reflog *commit_reflog;\n@@ -161,7 +161,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,\n \t} else\n \t\trecno = 0;\n \n-\titem = path_list_lookup(branch, &info->complete_reflogs);\n+\titem = string_list_lookup(branch, &info->complete_reflogs);\n \tif (item)\n \t\treflogs = item->util;\n \telse {\n@@ -189,7 +189,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,\n \t\t}\n \t\tif (!reflogs || reflogs->nr == 0)\n \t\t\treturn -1;\n-\t\tpath_list_insert(branch, &info->complete_reflogs)->util\n+\t\tstring_list_insert(branch, &info->complete_reflogs)->util\n \t\t\t= reflogs;\n \t}\n \ndiff --git a/shortlog.h b/shortlog.h\nindex 31ff491..46a0991 100644\n--- a/shortlog.h\n+++ b/shortlog.h\n@@ -1,10 +1,10 @@\n #ifndef SHORTLOG_H\n #define SHORTLOG_H\n \n-#include \"path-list.h\"\n+#include \"string-list.h\"\n \n struct shortlog {\n-\tstruct path_list list;\n+\tstruct string_list list;\n \tint summary;\n \tint wrap_lines;\n \tint sort_by_number;\n@@ -14,7 +14,7 @@ struct shortlog {\n \n \tchar *common_repo_prefix;\n \tint email;\n-\tstruct path_list mailmap;\n+\tstruct string_list mailmap;\n };\n \n void shortlog_init(struct shortlog *log);\ndiff --git a/string-list.c b/string-list.c\nnew file mode 100644\nindex 0000000..86137c7\n--- /dev/null\n+++ b/string-list.c\n@@ -0,0 +1,138 @@\n+#include \"cache.h\"\n+#include \"string-list.h\"\n+\n+/* if there is no exact match, point to the index where the entry could be\n+ * inserted */\n+static int get_entry_index(const struct string_list *list, const char *string,\n+\t\tint *exact_match)\n+{\n+\tint left = -1, right = list->nr;\n+\n+\twhile (left + 1 < right) {\n+\t\tint middle = (left + right) / 2;\n+\t\tint compare = strcmp(string, list->items[middle].string);\n+\t\tif (compare < 0)\n+\t\t\tright = middle;\n+\t\telse if (compare > 0)\n+\t\t\tleft = middle;\n+\t\telse {\n+\t\t\t*exact_match = 1;\n+\t\t\treturn middle;\n+\t\t}\n+\t}\n+\n+\t*exact_match = 0;\n+\treturn right;\n+}\n+\n+/* returns -1-index if already exists */\n+static int add_entry(struct string_list *list, const char *string)\n+{\n+\tint exact_match;\n+\tint index = get_entry_index(list, string, &exact_match);\n+\n+\tif (exact_match)\n+\t\treturn -1 - index;\n+\n+\tif (list->nr + 1 >= list->alloc) {\n+\t\tlist->alloc += 32;\n+\t\tlist->items = xrealloc(list->items, list->alloc\n+\t\t\t\t* sizeof(struct string_list_item));\n+\t}\n+\tif (index < list->nr)\n+\t\tmemmove(list->items + index + 1, list->items + index,\n+\t\t\t\t(list->nr - index)\n+\t\t\t\t* sizeof(struct string_list_item));\n+\tlist->items[index].string = list->strdup_strings ?\n+\t\txstrdup(string) : (char *)string;\n+\tlist->items[index].util = NULL;\n+\tlist->nr++;\n+\n+\treturn index;\n+}\n+\n+struct string_list_item *string_list_insert(const char *string,\n+\t\tstruct string_list *list)\n+{\n+\tint index = add_entry(list, string);\n+\n+\tif (index < 0)\n+\t\tindex = -1 - index;\n+\n+\treturn list->items + index;\n+}\n+\n+int string_list_has_string(const struct string_list *list, const char *string)\n+{\n+\tint exact_match;\n+\tget_entry_index(list, string, &exact_match);\n+\treturn exact_match;\n+}\n+\n+struct string_list_item *string_list_lookup(const char *string,\n+\t\tstruct string_list *list)\n+{\n+\tint exact_match, i = get_entry_index(list, string, &exact_match);\n+\tif (!exact_match)\n+\t\treturn NULL;\n+\treturn list->items + i;\n+}\n+\n+void string_list_clear(struct string_list *list, int free_util)\n+{\n+\tif (list->items) {\n+\t\tint i;\n+\t\tif (list->strdup_strings) {\n+\t\t\tfor (i = 0; i < list->nr; i++)\n+\t\t\t\tfree(list->items[i].string);\n+\t\t}\n+\t\tif (free_util) {\n+\t\t\tfor (i = 0; i < list->nr; i++)\n+\t\t\t\tfree(list->items[i].util);\n+\t\t}\n+\t\tfree(list->items);\n+\t}\n+\tlist->items = NULL;\n+\tlist->nr = list->alloc = 0;\n+}\n+\n+void print_string_list(const char *text, const struct string_list *p)\n+{\n+\tint i;\n+\tif ( text )\n+\t\tprintf(\"%s\\n\", text);\n+\tfor (i = 0; i < p->nr; i++)\n+\t\tprintf(\"%s:%p\\n\", p->items[i].string, p->items[i].util);\n+}\n+\n+struct string_list_item *string_list_append(const char *string,\n+\t\tstruct string_list *list)\n+{\n+\tALLOC_GROW(list->items, list->nr + 1, list->alloc);\n+\tlist->items[list->nr].string =\n+\t\tlist->strdup_strings ? xstrdup(string) : (char *)string;\n+\treturn list->items + list->nr++;\n+}\n+\n+static int cmp_items(const void *a, const void *b)\n+{\n+\tconst struct string_list_item *one = a;\n+\tconst struct string_list_item *two = b;\n+\treturn strcmp(one->string, two->string);\n+}\n+\n+void sort_string_list(struct string_list *list)\n+{\n+\tqsort(list->items, list->nr, sizeof(*list->items), cmp_items);\n+}\n+\n+int unsorted_string_list_has_string(struct string_list *list,\n+\t\tconst char *string)\n+{\n+\tint i;\n+\tfor (i = 0; i < list->nr; i++)\n+\t\tif (!strcmp(string, list->items[i].string))\n+\t\t\treturn 1;\n+\treturn 0;\n+}\n+\ndiff --git a/string-list.h b/string-list.h\nnew file mode 100644\nindex 0000000..4d6a705\n--- /dev/null\n+++ b/string-list.h\n@@ -0,0 +1,28 @@\n+#ifndef PATH_LIST_H\n+#define PATH_LIST_H\n+\n+struct string_list_item {\n+\tchar *string;\n+\tvoid *util;\n+};\n+struct string_list\n+{\n+\tstruct string_list_item *items;\n+\tunsigned int nr, alloc;\n+\tunsigned int strdup_strings:1;\n+};\n+\n+void print_string_list(const char *text, const struct string_list *p);\n+void string_list_clear(struct string_list *list, int free_util);\n+\n+/* Use these functions only on sorted lists: */\n+int string_list_has_string(const struct string_list *list, const char *string);\n+struct string_list_item *string_list_insert(const char *string, struct string_list *list);\n+struct string_list_item *string_list_lookup(const char *string, struct string_list *list);\n+\n+/* Use these functions only on unsorted lists: */\n+struct string_list_item *string_list_append(const char *string, struct string_list *list);\n+void sort_string_list(struct string_list *list);\n+int unsorted_string_list_has_string(struct string_list *list, const char *string);\n+\n+#endif /* PATH_LIST_H */\n-- \n1.5.5.1.375.g1becb\n"},{"id":"76961","messageId":"alpine.DEB.1.00.0805141846370.30431@racer","threadId":"13518","inReplyTo":"alpine.DEB.1.00.0805141844580.30431@racer","subject":"[PATCH 2/2] Provide git_config with a callback-data parameter","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-05-14T17:46:53Z","receivedAt":"2008-05-14T17:46:53Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\ngit_config() only had a function parameter, but no callback data\nparameter.  This assumes that all callback functions only modify\nglobal variables.\n\nWith this patch, every callback gets a void * parameter, and it is hoped\nthat this will help the libification effort.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n alias.c                   |    5 +++--\n archive-tar.c             |    6 +++---\n builtin-add.c             |    6 +++---\n builtin-apply.c           |    6 +++---\n builtin-blame.c           |    6 +++---\n builtin-branch.c          |    6 +++---\n builtin-cat-file.c        |    2 +-\n builtin-checkout-index.c  |    2 +-\n builtin-checkout.c        |    2 +-\n builtin-clean.c           |    6 +++---\n builtin-clone.c           |    2 +-\n builtin-commit-tree.c     |    2 +-\n builtin-commit.c          |    8 ++++----\n builtin-config.c          |   26 ++++++++++++++------------\n builtin-diff-files.c      |    2 +-\n builtin-diff-index.c      |    2 +-\n builtin-diff-tree.c       |    2 +-\n builtin-diff.c            |    2 +-\n builtin-fast-export.c     |    2 +-\n builtin-fetch-pack.c      |    6 +++---\n builtin-fmt-merge-msg.c   |    4 ++--\n builtin-gc.c              |    6 +++---\n builtin-http-fetch.c      |    2 +-\n builtin-init-db.c         |    4 ++--\n builtin-log.c             |   18 +++++++++---------\n builtin-ls-files.c        |    2 +-\n builtin-ls-tree.c         |    2 +-\n builtin-mailinfo.c        |    2 +-\n builtin-merge-base.c      |    2 +-\n builtin-merge-recursive.c |    6 +++---\n builtin-mv.c              |    2 +-\n builtin-name-rev.c        |    2 +-\n builtin-pack-objects.c    |    6 +++---\n builtin-read-tree.c       |    4 +---\n builtin-reflog.c          |    6 +++---\n builtin-remote.c          |    8 ++++----\n builtin-rerere.c          |    6 +++---\n builtin-reset.c           |    2 +-\n builtin-rev-list.c        |    2 +-\n builtin-rev-parse.c       |    2 +-\n builtin-revert.c          |    2 +-\n builtin-rm.c              |    2 +-\n builtin-show-branch.c     |    6 +++---\n builtin-symbolic-ref.c    |    2 +-\n builtin-tag.c             |    6 +++---\n builtin-unpack-objects.c  |    2 +-\n builtin-update-index.c    |    2 +-\n builtin-update-ref.c      |    2 +-\n builtin-verify-pack.c     |    2 +-\n builtin-verify-tag.c      |    2 +-\n builtin-write-tree.c      |    2 +-\n cache.h                   |   10 +++++-----\n color.c                   |    4 ++--\n color.h                   |    2 +-\n config.c                  |   27 ++++++++++++++-------------\n connect.c                 |    7 ++++---\n convert.c                 |    4 ++--\n daemon.c                  |    4 ++--\n diff.c                    |    8 ++++----\n diff.h                    |    4 ++--\n fast-import.c             |    6 +++---\n hash-object.c             |    2 +-\n help.c                    |    6 +++---\n http.c                    |    6 +++---\n imap-send.c               |    4 ++--\n index-pack.c              |    6 +++---\n ll-merge.c                |    4 ++--\n pager.c                   |    2 +-\n receive-pack.c            |    6 +++---\n remote.c                  |    4 ++--\n setup.c                   |    4 ++--\n unpack-file.c             |    2 +-\n var.c                     |    8 ++++----\n wt-status.c               |    4 ++--\n wt-status.h               |    2 +-\n 75 files changed, 179 insertions(+), 176 deletions(-)\n\ndiff --git a/alias.c b/alias.c\nindex 116cac8..995f3e6 100644\n--- a/alias.c\n+++ b/alias.c\n@@ -2,7 +2,8 @@\n \n static const char *alias_key;\n static char *alias_val;\n-static int alias_lookup_cb(const char *k, const char *v)\n+\n+static int alias_lookup_cb(const char *k, const char *v, void *cb)\n {\n \tif (!prefixcmp(k, \"alias.\") && !strcmp(k+6, alias_key)) {\n \t\tif (!v)\n@@ -17,6 +18,6 @@ char *alias_lookup(const char *alias)\n {\n \talias_key = alias;\n \talias_val = NULL;\n-\tgit_config(alias_lookup_cb);\n+\tgit_config(alias_lookup_cb, NULL);\n \treturn alias_val;\n }\ndiff --git a/archive-tar.c b/archive-tar.c\nindex 4add802..d7598f9 100644\n--- a/archive-tar.c\n+++ b/archive-tar.c\n@@ -220,7 +220,7 @@ static void write_global_extended_header(const unsigned char *sha1)\n \tstrbuf_release(&ext_header);\n }\n \n-static int git_tar_config(const char *var, const char *value)\n+static int git_tar_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"tar.umask\")) {\n \t\tif (value && !strcmp(value, \"user\")) {\n@@ -231,7 +231,7 @@ static int git_tar_config(const char *var, const char *value)\n \t\t}\n \t\treturn 0;\n \t}\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static int write_tar_entry(const unsigned char *sha1,\n@@ -268,7 +268,7 @@ int write_tar_archive(struct archiver_args *args)\n {\n \tint plen = args->base ? strlen(args->base) : 0;\n \n-\tgit_config(git_tar_config);\n+\tgit_config(git_tar_config, NULL);\n \n \tarchive_time = args->time;\n \tverbose = args->verbose;\ndiff --git a/builtin-add.c b/builtin-add.c\nindex 6edb6a9..64f4787 100644\n--- a/builtin-add.c\n+++ b/builtin-add.c\n@@ -206,13 +206,13 @@ static struct option builtin_add_options[] = {\n \tOPT_END(),\n };\n \n-static int add_config(const char *var, const char *value)\n+static int add_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcasecmp(var, \"add.ignore-errors\")) {\n \t\tignore_add_errors = git_config_bool(var, value);\n \t\treturn 0;\n \t}\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n int cmd_add(int argc, const char **argv, const char *prefix)\n@@ -236,7 +236,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)\n \tif (add_interactive)\n \t\texit(interactive_add(argc, argv, prefix));\n \n-\tgit_config(add_config);\n+\tgit_config(add_config, NULL);\n \n \tnewfd = hold_locked_index(&lock_file, 1);\n \ndiff --git a/builtin-apply.c b/builtin-apply.c\nindex 1103625..bbdf08a 100644\n--- a/builtin-apply.c\n+++ b/builtin-apply.c\n@@ -2979,11 +2979,11 @@ static int apply_patch(int fd, const char *filename, int inaccurate_eof)\n \treturn 0;\n }\n \n-static int git_apply_config(const char *var, const char *value)\n+static int git_apply_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"apply.whitespace\"))\n \t\treturn git_config_string(&apply_default_whitespace, var, value);\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n \n@@ -2999,7 +2999,7 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix)\n \n \tprefix = setup_git_directory_gently(&is_not_gitdir);\n \tprefix_length = prefix ? strlen(prefix) : 0;\n-\tgit_config(git_apply_config);\n+\tgit_config(git_apply_config, NULL);\n \tif (apply_default_whitespace)\n \t\tparse_whitespace_option(apply_default_whitespace);\n \ndiff --git a/builtin-blame.c b/builtin-blame.c\nindex 258ae42..3598866 100644\n--- a/builtin-blame.c\n+++ b/builtin-blame.c\n@@ -2028,7 +2028,7 @@ static void prepare_blame_range(struct scoreboard *sb,\n \t\tusage(blame_usage);\n }\n \n-static int git_blame_config(const char *var, const char *value)\n+static int git_blame_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"blame.showroot\")) {\n \t\tshow_root = git_config_bool(var, value);\n@@ -2038,7 +2038,7 @@ static int git_blame_config(const char *var, const char *value)\n \t\tblank_boundary = git_config_bool(var, value);\n \t\treturn 0;\n \t}\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n /*\n@@ -2238,7 +2238,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)\n \n \tcmd_is_annotate = !strcmp(argv[0], \"annotate\");\n \n-\tgit_config(git_blame_config);\n+\tgit_config(git_blame_config, NULL);\n \tsave_commit_buffer = 0;\n \n \topt = 0;\ndiff --git a/builtin-branch.c b/builtin-branch.c\nindex 19c508a..d279702 100644\n--- a/builtin-branch.c\n+++ b/builtin-branch.c\n@@ -63,7 +63,7 @@ static int parse_branch_color_slot(const char *var, int ofs)\n \tdie(\"bad config variable '%s'\", var);\n }\n \n-static int git_branch_config(const char *var, const char *value)\n+static int git_branch_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"color.branch\")) {\n \t\tbranch_use_color = git_config_colorbool(var, value, -1);\n@@ -76,7 +76,7 @@ static int git_branch_config(const char *var, const char *value)\n \t\tcolor_parse(value, var, branch_colors[slot]);\n \t\treturn 0;\n \t}\n-\treturn git_color_default_config(var, value);\n+\treturn git_color_default_config(var, value, cb);\n }\n \n static const char *branch_get_color(enum color_branch ix)\n@@ -461,7 +461,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)\n \t\tOPT_END(),\n \t};\n \n-\tgit_config(git_branch_config);\n+\tgit_config(git_branch_config, NULL);\n \n \tif (branch_use_color == -1)\n \t\tbranch_use_color = git_use_color_default;\ndiff --git a/builtin-cat-file.c b/builtin-cat-file.c\nindex f132d58..b488fad 100644\n--- a/builtin-cat-file.c\n+++ b/builtin-cat-file.c\n@@ -85,7 +85,7 @@ int cmd_cat_file(int argc, const char **argv, const char *prefix)\n \tint opt;\n \tconst char *exp_type, *obj_name;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \tif (argc != 3)\n \t\tusage(\"git-cat-file [-t|-s|-e|-p|<type>] <sha1>\");\n \texp_type = argv[1];\ndiff --git a/builtin-checkout-index.c b/builtin-checkout-index.c\nindex 7e42024..eb1fc9a 100644\n--- a/builtin-checkout-index.c\n+++ b/builtin-checkout-index.c\n@@ -166,7 +166,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)\n \tint read_from_stdin = 0;\n \tint prefix_length;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \tstate.base_dir = \"\";\n \tprefix_length = prefix ? strlen(prefix) : 0;\n \ndiff --git a/builtin-checkout.c b/builtin-checkout.c\nindex 05c0642..2a7c636 100644\n--- a/builtin-checkout.c\n+++ b/builtin-checkout.c\n@@ -514,7 +514,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)\n \tmemset(&opts, 0, sizeof(opts));\n \tmemset(&new, 0, sizeof(new));\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \topts.track = git_branch_track;\n \ndiff --git a/builtin-clean.c b/builtin-clean.c\nindex 6778a03..80a7ff9 100644\n--- a/builtin-clean.c\n+++ b/builtin-clean.c\n@@ -19,11 +19,11 @@ static const char *const builtin_clean_usage[] = {\n \tNULL\n };\n \n-static int git_clean_config(const char *var, const char *value)\n+static int git_clean_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"clean.requireforce\"))\n \t\tforce = !git_config_bool(var, value);\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n int cmd_clean(int argc, const char **argv, const char *prefix)\n@@ -50,7 +50,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n \n-\tgit_config(git_clean_config);\n+\tgit_config(git_clean_config, NULL);\n \tif (force < 0)\n \t\tforce = 0;\n \telse\ndiff --git a/builtin-clone.c b/builtin-clone.c\nindex a7c075d..e51ebd6 100644\n--- a/builtin-clone.c\n+++ b/builtin-clone.c\n@@ -415,7 +415,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)\n \tif (option_reference)\n \t\tsetup_reference(git_dir);\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tif (option_bare) {\n \t\tstrcpy(branch_top, \"refs/heads/\");\ndiff --git a/builtin-commit-tree.c b/builtin-commit-tree.c\nindex 6610d18..e5e4bdb 100644\n--- a/builtin-commit-tree.c\n+++ b/builtin-commit-tree.c\n@@ -60,7 +60,7 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)\n \tstruct strbuf buffer;\n \tint encoding_is_utf8;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tif (argc < 2)\n \t\tusage(commit_tree_usage);\ndiff --git a/builtin-commit.c b/builtin-commit.c\nindex 59af472..4cc714a 100644\n--- a/builtin-commit.c\n+++ b/builtin-commit.c\n@@ -806,7 +806,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)\n \tconst char *index_file;\n \tint commitable;\n \n-\tgit_config(git_status_config);\n+\tgit_config(git_status_config, NULL);\n \n \tif (wt_status_use_color == -1)\n \t\twt_status_use_color = git_use_color_default;\n@@ -860,7 +860,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1)\n \t}\n }\n \n-int git_commit_config(const char *k, const char *v)\n+int git_commit_config(const char *k, const char *v, void *cb)\n {\n \tif (!strcmp(k, \"commit.template\")) {\n \t\tif (!v)\n@@ -869,7 +869,7 @@ int git_commit_config(const char *k, const char *v)\n \t\treturn 0;\n \t}\n \n-\treturn git_status_config(k, v);\n+\treturn git_status_config(k, v, cb);\n }\n \n static const char commit_utf8_warn[] =\n@@ -897,7 +897,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)\n \tunsigned char commit_sha1[20];\n \tstruct ref_lock *ref_lock;\n \n-\tgit_config(git_commit_config);\n+\tgit_config(git_commit_config, NULL);\n \n \targc = parse_and_validate_options(argc, argv, builtin_commit_usage);\n \ndiff --git a/builtin-config.c b/builtin-config.c\nindex 8ee01bd..3a441ef 100644\n--- a/builtin-config.c\n+++ b/builtin-config.c\n@@ -18,7 +18,7 @@ static char key_delim = ' ';\n static char term = '\\n';\n static enum { T_RAW, T_INT, T_BOOL, T_BOOL_OR_INT } type = T_RAW;\n \n-static int show_all_config(const char *key_, const char *value_)\n+static int show_all_config(const char *key_, const char *value_, void *cb)\n {\n \tif (value_)\n \t\tprintf(\"%s%c%s%c\", key_, delim, value_, term);\n@@ -27,7 +27,7 @@ static int show_all_config(const char *key_, const char *value_)\n \treturn 0;\n }\n \n-static int show_config(const char* key_, const char* value_)\n+static int show_config(const char* key_, const char* value_, void *cb)\n {\n \tchar value[256];\n \tconst char *vptr = value;\n@@ -121,14 +121,14 @@ static int get_value(const char* key_, const char* regex_)\n \t}\n \n \tif (do_all && system_wide)\n-\t\tgit_config_from_file(show_config, system_wide);\n+\t\tgit_config_from_file(show_config, system_wide, NULL);\n \tif (do_all && global)\n-\t\tgit_config_from_file(show_config, global);\n-\tgit_config_from_file(show_config, local);\n+\t\tgit_config_from_file(show_config, global, NULL);\n+\tgit_config_from_file(show_config, local, NULL);\n \tif (!do_all && !seen && global)\n-\t\tgit_config_from_file(show_config, global);\n+\t\tgit_config_from_file(show_config, global, NULL);\n \tif (!do_all && !seen && system_wide)\n-\t\tgit_config_from_file(show_config, system_wide);\n+\t\tgit_config_from_file(show_config, system_wide, NULL);\n \n \tfree(key);\n \tif (regexp) {\n@@ -182,7 +182,7 @@ static int get_color_found;\n static const char *get_color_slot;\n static char parsed_color[COLOR_MAXLEN];\n \n-static int git_get_color_config(const char *var, const char *value)\n+static int git_get_color_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, get_color_slot)) {\n \t\tif (!value)\n@@ -218,7 +218,7 @@ static int get_color(int argc, const char **argv)\n \n \tget_color_found = 0;\n \tparsed_color[0] = '\\0';\n-\tgit_config(git_get_color_config);\n+\tgit_config(git_get_color_config, NULL);\n \n \tif (!get_color_found && def_color)\n \t\tcolor_parse(def_color, \"command line\", parsed_color);\n@@ -230,7 +230,8 @@ static int get_color(int argc, const char **argv)\n static int stdout_is_tty;\n static int get_colorbool_found;\n static int get_diff_color_found;\n-static int git_get_colorbool_config(const char *var, const char *value)\n+static int git_get_colorbool_config(const char *var, const char *value,\n+\t\tvoid *cb)\n {\n \tif (!strcmp(var, get_color_slot)) {\n \t\tget_colorbool_found =\n@@ -265,7 +266,7 @@ static int get_colorbool(int argc, const char **argv)\n \tget_colorbool_found = -1;\n \tget_diff_color_found = -1;\n \tget_color_slot = argv[0];\n-\tgit_config(git_get_colorbool_config);\n+\tgit_config(git_get_colorbool_config, NULL);\n \n \tif (get_colorbool_found < 0) {\n \t\tif (!strcmp(get_color_slot, \"color.diff\"))\n@@ -298,7 +299,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)\n \t\telse if (!strcmp(argv[1], \"--list\") || !strcmp(argv[1], \"-l\")) {\n \t\t\tif (argc != 2)\n \t\t\t\tusage(git_config_set_usage);\n-\t\t\tif (git_config(show_all_config) < 0 && file && errno)\n+\t\t\tif (git_config(show_all_config, NULL) < 0 &&\n+\t\t\t\t\tfile && errno)\n \t\t\t\tdie(\"unable to read config file %s: %s\", file,\n \t\t\t\t    strerror(errno));\n \t\t\treturn 0;\ndiff --git a/builtin-diff-files.c b/builtin-diff-files.c\nindex e2306c1..907392a 100644\n--- a/builtin-diff-files.c\n+++ b/builtin-diff-files.c\n@@ -21,7 +21,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)\n \n \tprefix = setup_git_directory_gently(&nongit);\n \tinit_revisions(&rev, prefix);\n-\tgit_config(git_diff_basic_config); /* no \"diff\" UI options */\n+\tgit_config(git_diff_basic_config, NULL); /* no \"diff\" UI options */\n \trev.abbrev = 0;\n \n \tif (!setup_diff_no_index(&rev, argc, argv, nongit, prefix))\ndiff --git a/builtin-diff-index.c b/builtin-diff-index.c\nindex 2b955de..2f44ebf 100644\n--- a/builtin-diff-index.c\n+++ b/builtin-diff-index.c\n@@ -17,7 +17,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)\n \tint result;\n \n \tinit_revisions(&rev, prefix);\n-\tgit_config(git_diff_basic_config); /* no \"diff\" UI options */\n+\tgit_config(git_diff_basic_config, NULL); /* no \"diff\" UI options */\n \trev.abbrev = 0;\n \n \targc = setup_revisions(argc, argv, &rev, NULL);\ndiff --git a/builtin-diff-tree.c b/builtin-diff-tree.c\nindex 832797f..9d2a48f 100644\n--- a/builtin-diff-tree.c\n+++ b/builtin-diff-tree.c\n@@ -68,7 +68,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)\n \tint read_stdin = 0;\n \n \tinit_revisions(opt, prefix);\n-\tgit_config(git_diff_basic_config); /* no \"diff\" UI options */\n+\tgit_config(git_diff_basic_config, NULL); /* no \"diff\" UI options */\n \tnr_sha1 = 0;\n \topt->abbrev = 0;\n \topt->diff = 1;\ndiff --git a/builtin-diff.c b/builtin-diff.c\nindex 7c2a841..583291a 100644\n--- a/builtin-diff.c\n+++ b/builtin-diff.c\n@@ -234,7 +234,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)\n \t */\n \n \tprefix = setup_git_directory_gently(&nongit);\n-\tgit_config(git_diff_ui_config);\n+\tgit_config(git_diff_ui_config, NULL);\n \n \tif (diff_use_color_default == -1)\n \t\tdiff_use_color_default = git_use_color_default;\ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex a705029..2e740c2 100755\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -372,7 +372,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \t};\n \n \t/* we handle encodings */\n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tinit_revisions(&revs, prefix);\n \targc = setup_revisions(argc, argv, &revs, NULL);\ndiff --git a/builtin-fetch-pack.c b/builtin-fetch-pack.c\nindex c97a427..de1e8d1 100644\n--- a/builtin-fetch-pack.c\n+++ b/builtin-fetch-pack.c\n@@ -635,7 +635,7 @@ static int remove_duplicates(int nr_heads, char **heads)\n \treturn dst;\n }\n \n-static int fetch_pack_config(const char *var, const char *value)\n+static int fetch_pack_config(const char *var, const char *value, void *cb)\n {\n \tif (strcmp(var, \"fetch.unpacklimit\") == 0) {\n \t\tfetch_unpack_limit = git_config_int(var, value);\n@@ -647,7 +647,7 @@ static int fetch_pack_config(const char *var, const char *value)\n \t\treturn 0;\n \t}\n \n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static struct lock_file lock;\n@@ -657,7 +657,7 @@ static void fetch_pack_setup(void)\n \tstatic int did_setup;\n \tif (did_setup)\n \t\treturn;\n-\tgit_config(fetch_pack_config);\n+\tgit_config(fetch_pack_config, NULL);\n \tif (0 <= transfer_unpack_limit)\n \t\tunpack_limit = transfer_unpack_limit;\n \telse if (0 <= fetch_unpack_limit)\ndiff --git a/builtin-fmt-merge-msg.c b/builtin-fmt-merge-msg.c\nindex b72cb59..b892621 100644\n--- a/builtin-fmt-merge-msg.c\n+++ b/builtin-fmt-merge-msg.c\n@@ -10,7 +10,7 @@ static const char *fmt_merge_msg_usage =\n \n static int merge_summary;\n \n-static int fmt_merge_msg_config(const char *key, const char *value)\n+static int fmt_merge_msg_config(const char *key, const char *value, void *cb)\n {\n \tstatic int found_merge_log = 0;\n \tif (!strcmp(\"merge.log\", key)) {\n@@ -260,7 +260,7 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)\n \tunsigned char head_sha1[20];\n \tconst char *current_branch;\n \n-\tgit_config(fmt_merge_msg_config);\n+\tgit_config(fmt_merge_msg_config, NULL);\n \n \twhile (argc > 1) {\n \t\tif (!strcmp(argv[1], \"--log\") || !strcmp(argv[1], \"--summary\"))\ndiff --git a/builtin-gc.c b/builtin-gc.c\nindex 48f7d95..f5625bb 100644\n--- a/builtin-gc.c\n+++ b/builtin-gc.c\n@@ -35,7 +35,7 @@ static const char *argv_repack[MAX_ADD] = {\"repack\", \"-d\", \"-l\", NULL};\n static const char *argv_prune[] = {\"prune\", \"--expire\", NULL, NULL};\n static const char *argv_rerere[] = {\"rerere\", \"gc\", NULL};\n \n-static int gc_config(const char *var, const char *value)\n+static int gc_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"gc.packrefs\")) {\n \t\tif (value && !strcmp(value, \"notbare\"))\n@@ -67,7 +67,7 @@ static int gc_config(const char *var, const char *value)\n \t\tprune_expire = xstrdup(value);\n \t\treturn 0;\n \t}\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static void append_option(const char **cmd, const char *opt, int max_length)\n@@ -226,7 +226,7 @@ int cmd_gc(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n \n-\tgit_config(gc_config);\n+\tgit_config(gc_config, NULL);\n \n \tif (pack_refs < 0)\n \t\tpack_refs = !is_bare_repository();\ndiff --git a/builtin-http-fetch.c b/builtin-http-fetch.c\nindex b1f3389..3a06248 100644\n--- a/builtin-http-fetch.c\n+++ b/builtin-http-fetch.c\n@@ -18,7 +18,7 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)\n \tint get_verbosely = 0;\n \tint get_recover = 0;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \twhile (arg < argc && argv[arg][0] == '-') {\n \t\tif (argv[arg][1] == 't') {\ndiff --git a/builtin-init-db.c b/builtin-init-db.c\nindex 5650685..0907366 100644\n--- a/builtin-init-db.c\n+++ b/builtin-init-db.c\n@@ -144,7 +144,7 @@ static void copy_templates(const char *template_dir)\n \tstrcpy(template_path + template_len, \"config\");\n \trepository_format_version = 0;\n \tgit_config_from_file(check_repository_format_version,\n-\t\t\t     template_path);\n+\t\t\t     template_path, NULL);\n \ttemplate_path[template_len] = 0;\n \n \tif (repository_format_version &&\n@@ -198,7 +198,7 @@ static int create_default_files(const char *template_path)\n \t */\n \tcopy_templates(template_path);\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \t/*\n \t * We would have created the above under user's umask -- under\ndiff --git a/builtin-log.c b/builtin-log.c\nindex 9d046b2..3746a36 100644\n--- a/builtin-log.c\n+++ b/builtin-log.c\n@@ -222,7 +222,7 @@ static int cmd_log_walk(struct rev_info *rev)\n \treturn 0;\n }\n \n-static int git_log_config(const char *var, const char *value)\n+static int git_log_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"format.pretty\"))\n \t\treturn git_config_string(&fmt_pretty, var, value);\n@@ -236,14 +236,14 @@ static int git_log_config(const char *var, const char *value)\n \t\tdefault_show_root = git_config_bool(var, value);\n \t\treturn 0;\n \t}\n-\treturn git_diff_ui_config(var, value);\n+\treturn git_diff_ui_config(var, value, cb);\n }\n \n int cmd_whatchanged(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n \n-\tgit_config(git_log_config);\n+\tgit_config(git_log_config, NULL);\n \n \tif (diff_use_color_default == -1)\n \t\tdiff_use_color_default = git_use_color_default;\n@@ -319,7 +319,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)\n \tstruct object_array_entry *objects;\n \tint i, count, ret = 0;\n \n-\tgit_config(git_log_config);\n+\tgit_config(git_log_config, NULL);\n \n \tif (diff_use_color_default == -1)\n \t\tdiff_use_color_default = git_use_color_default;\n@@ -383,7 +383,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n \n-\tgit_config(git_log_config);\n+\tgit_config(git_log_config, NULL);\n \n \tif (diff_use_color_default == -1)\n \t\tdiff_use_color_default = git_use_color_default;\n@@ -416,7 +416,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)\n {\n \tstruct rev_info rev;\n \n-\tgit_config(git_log_config);\n+\tgit_config(git_log_config, NULL);\n \n \tif (diff_use_color_default == -1)\n \t\tdiff_use_color_default = git_use_color_default;\n@@ -471,7 +471,7 @@ static void add_header(const char *value)\n \textra_hdr[extra_hdr_nr++] = xstrndup(value, len);\n }\n \n-static int git_format_config(const char *var, const char *value)\n+static int git_format_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"format.headers\")) {\n \t\tif (!value)\n@@ -504,7 +504,7 @@ static int git_format_config(const char *var, const char *value)\n \t\treturn 0;\n \t}\n \n-\treturn git_log_config(var, value);\n+\treturn git_log_config(var, value, cb);\n }\n \n \n@@ -771,7 +771,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)\n \tchar *add_signoff = NULL;\n \tstruct strbuf buf;\n \n-\tgit_config(git_format_config);\n+\tgit_config(git_format_config, NULL);\n \tinit_revisions(&rev, prefix);\n \trev.commit_format = CMIT_FMT_EMAIL;\n \trev.verbose_header = 1;\ndiff --git a/builtin-ls-files.c b/builtin-ls-files.c\nindex dc7eab8..75ba422 100644\n--- a/builtin-ls-files.c\n+++ b/builtin-ls-files.c\n@@ -437,7 +437,7 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)\n \tmemset(&dir, 0, sizeof(dir));\n \tif (prefix)\n \t\tprefix_offset = strlen(prefix);\n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tfor (i = 1; i < argc; i++) {\n \t\tconst char *arg = argv[i];\ndiff --git a/builtin-ls-tree.c b/builtin-ls-tree.c\nindex 7abe333..f4a75dd 100644\n--- a/builtin-ls-tree.c\n+++ b/builtin-ls-tree.c\n@@ -122,7 +122,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)\n \tunsigned char sha1[20];\n \tstruct tree *tree;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \tls_tree_prefix = prefix;\n \tif (prefix && *prefix)\n \t\tchomp_prefix = strlen(prefix);\ndiff --git a/builtin-mailinfo.c b/builtin-mailinfo.c\nindex 11f154b..6e23ffd 100644\n--- a/builtin-mailinfo.c\n+++ b/builtin-mailinfo.c\n@@ -962,7 +962,7 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix)\n \t/* NEEDSWORK: might want to do the optional .git/ directory\n \t * discovery\n \t */\n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tdef_charset = (git_commit_encoding ? git_commit_encoding : \"utf-8\");\n \tmetainfo_charset = def_charset;\ndiff --git a/builtin-merge-base.c b/builtin-merge-base.c\nindex 0108e22..bcf9395 100644\n--- a/builtin-merge-base.c\n+++ b/builtin-merge-base.c\n@@ -28,7 +28,7 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix)\n \tunsigned char rev1key[20], rev2key[20];\n \tint show_all = 0;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \twhile (1 < argc && argv[1][0] == '-') {\n \t\tconst char *arg = argv[1];\ndiff --git a/builtin-merge-recursive.c b/builtin-merge-recursive.c\nindex fd4a032..25c9a90 100644\n--- a/builtin-merge-recursive.c\n+++ b/builtin-merge-recursive.c\n@@ -1340,7 +1340,7 @@ static struct commit *get_ref(const char *ref)\n \treturn (struct commit *)object;\n }\n \n-static int merge_config(const char *var, const char *value)\n+static int merge_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcasecmp(var, \"merge.verbosity\")) {\n \t\tverbosity = git_config_int(var, value);\n@@ -1354,7 +1354,7 @@ static int merge_config(const char *var, const char *value)\n \t\tmerge_rename_limit = git_config_int(var, value);\n \t\treturn 0;\n \t}\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n int cmd_merge_recursive(int argc, const char **argv, const char *prefix)\n@@ -1375,7 +1375,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix)\n \t\t\tsubtree_merge = 1;\n \t}\n \n-\tgit_config(merge_config);\n+\tgit_config(merge_config, NULL);\n \tif (getenv(\"GIT_MERGE_VERBOSITY\"))\n \t\tverbosity = strtol(getenv(\"GIT_MERGE_VERBOSITY\"), NULL, 10);\n \ndiff --git a/builtin-mv.c b/builtin-mv.c\nindex c0e31d8..09a626e 100644\n--- a/builtin-mv.c\n+++ b/builtin-mv.c\n@@ -82,7 +82,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \tstruct string_list deleted = {NULL, 0, 0, 0};\n \tstruct string_list changed = {NULL, 0, 0, 0};\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tnewfd = hold_locked_index(&lock_file, 1);\n \tif (read_cache() < 0)\ndiff --git a/builtin-name-rev.c b/builtin-name-rev.c\nindex 384da4d..cde5de5 100644\n--- a/builtin-name-rev.c\n+++ b/builtin-name-rev.c\n@@ -195,7 +195,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);\n+\tgit_config(git_default_config, NULL);\n \targc = parse_options(argc, argv, 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-pack-objects.c b/builtin-pack-objects.c\nindex f43eb67..70d2f5d 100644\n--- a/builtin-pack-objects.c\n+++ b/builtin-pack-objects.c\n@@ -1760,7 +1760,7 @@ static void prepare_pack(int window, int depth)\n \tfree(delta_list);\n }\n \n-static int git_pack_config(const char *k, const char *v)\n+static int git_pack_config(const char *k, const char *v, void *cb)\n {\n \tif(!strcmp(k, \"pack.window\")) {\n \t\twindow = git_config_int(k, v);\n@@ -1813,7 +1813,7 @@ static int git_pack_config(const char *k, const char *v)\n \t\tpack_size_limit_cfg = git_config_ulong(k, v);\n \t\treturn 0;\n \t}\n-\treturn git_default_config(k, v);\n+\treturn git_default_config(k, v, cb);\n }\n \n static void read_object_list_from_stdin(void)\n@@ -2033,7 +2033,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)\n \trp_av[1] = \"--objects\"; /* --thin will make it --objects-edge */\n \trp_ac = 2;\n \n-\tgit_config(git_pack_config);\n+\tgit_config(git_pack_config, NULL);\n \tif (!pack_compression_seen && core_compression_seen)\n \t\tpack_compression_level = core_compression_level;\n \ndiff --git a/builtin-read-tree.c b/builtin-read-tree.c\nindex 7ac3088..5a09e17 100644\n--- a/builtin-read-tree.c\n+++ b/builtin-read-tree.c\n@@ -104,12 +104,10 @@ 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);\n+\tgit_config(git_default_config, NULL);\n \n \tnewfd = hold_locked_index(&lock_file, 1);\n \n-\tgit_config(git_default_config);\n-\n \tfor (i = 1; i < argc; i++) {\n \t\tconst char *arg = argv[i];\n \ndiff --git a/builtin-reflog.c b/builtin-reflog.c\nindex 280e24e..897d1dc 100644\n--- a/builtin-reflog.c\n+++ b/builtin-reflog.c\n@@ -329,7 +329,7 @@ static int collect_reflog(const char *ref, const unsigned char *sha1, int unused\n \treturn 0;\n }\n \n-static int reflog_expire_config(const char *var, const char *value)\n+static int reflog_expire_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"gc.reflogexpire\")) {\n \t\tif (!value)\n@@ -343,7 +343,7 @@ static int reflog_expire_config(const char *var, const char *value)\n \t\tdefault_reflog_expire_unreachable = approxidate(value);\n \t\treturn 0;\n \t}\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)\n@@ -352,7 +352,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)\n \tunsigned long now = time(NULL);\n \tint i, status, do_all;\n \n-\tgit_config(reflog_expire_config);\n+\tgit_config(reflog_expire_config, NULL);\n \n \tsave_commit_buffer = 0;\n \tdo_all = status = 0;\ndiff --git a/builtin-remote.c b/builtin-remote.c\nindex 4b4b2fc..1e1a87d 100644\n--- a/builtin-remote.c\n+++ b/builtin-remote.c\n@@ -153,7 +153,7 @@ struct branch_info {\n \n static struct string_list branch_list;\n \n-static int config_read_branches(const char *key, const char *value)\n+static int config_read_branches(const char *key, const char *value, void *cb)\n {\n \tif (!prefixcmp(key, \"branch.\")) {\n \t\tchar *name;\n@@ -200,7 +200,7 @@ static void read_branches(void)\n {\n \tif (branch_list.nr)\n \t\treturn;\n-\tgit_config(config_read_branches);\n+\tgit_config(config_read_branches, NULL);\n \tsort_string_list(&branch_list);\n }\n \n@@ -515,7 +515,7 @@ struct remote_group {\n \tstruct string_list *list;\n } remote_group;\n \n-static int get_remote_group(const char *key, const char *value)\n+static int get_remote_group(const char *key, const char *value, void *cb)\n {\n \tif (!prefixcmp(key, \"remotes.\") &&\n \t\t\t!strcmp(key + 8, remote_group.name)) {\n@@ -547,7 +547,7 @@ static int update(int argc, const char **argv)\n \tremote_group.list = &list;\n \tfor (i = 1; i < argc; i++) {\n \t\tremote_group.name = argv[i];\n-\t\tresult = git_config(get_remote_group);\n+\t\tresult = git_config(get_remote_group, NULL);\n \t}\n \n \tif (!result && !list.nr  && argc == 2 && !strcmp(argv[1], \"default\"))\ndiff --git a/builtin-rerere.c b/builtin-rerere.c\nindex 963b19e..0096a42 100644\n--- a/builtin-rerere.c\n+++ b/builtin-rerere.c\n@@ -339,7 +339,7 @@ tail_optimization:\n \treturn write_rr(rr, fd);\n }\n \n-static int git_rerere_config(const char *var, const char *value)\n+static int git_rerere_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"gc.rerereresolved\"))\n \t\tcutoff_resolve = git_config_int(var, value);\n@@ -348,7 +348,7 @@ static int git_rerere_config(const char *var, const char *value)\n \telse if (!strcmp(var, \"rerere.enabled\"))\n \t\trerere_enabled = git_config_bool(var, value);\n \telse\n-\t\treturn git_default_config(var, value);\n+\t\treturn git_default_config(var, value, cb);\n \treturn 0;\n }\n \n@@ -376,7 +376,7 @@ static int setup_rerere(struct string_list *merge_rr)\n {\n \tint fd;\n \n-\tgit_config(git_rerere_config);\n+\tgit_config(git_rerere_config, NULL);\n \tif (!is_rerere_enabled())\n \t\treturn -1;\n \ndiff --git a/builtin-reset.c b/builtin-reset.c\nindex 79424bb..e32ddd9 100644\n--- a/builtin-reset.c\n+++ b/builtin-reset.c\n@@ -186,7 +186,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);\n+\tgit_config(git_default_config, NULL);\n \n \targc = parse_options(argc, argv, 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 a965294..a0f0bf2 100644\n--- a/builtin-rev-list.c\n+++ b/builtin-rev-list.c\n@@ -598,7 +598,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)\n \tint bisect_find_all = 0;\n \tint quiet = 0;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \tinit_revisions(&revs, prefix);\n \trevs.abbrev = 0;\n \trevs.commit_format = CMIT_FMT_UNSPECIFIED;\ndiff --git a/builtin-rev-parse.c b/builtin-rev-parse.c\nindex f8d8548..1d019b3 100644\n--- a/builtin-rev-parse.c\n+++ b/builtin-rev-parse.c\n@@ -381,7 +381,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)\n \t\treturn cmd_parseopt(argc - 1, argv + 1, prefix);\n \n \tprefix = setup_git_directory();\n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\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 2b57525..0270f9b 100644\n--- a/builtin-revert.c\n+++ b/builtin-revert.c\n@@ -269,7 +269,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)\n \tconst char *message, *encoding;\n \tconst char *defmsg = xstrdup(git_path(\"MERGE_MSG\"));\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \tme = action == REVERT ? \"revert\" : \"cherry-pick\";\n \tsetenv(GIT_REFLOG_ACTION, me, 0);\n \tparse_args(argc, argv);\ndiff --git a/builtin-rm.c b/builtin-rm.c\nindex c0a8bb6..22c9bd1 100644\n--- a/builtin-rm.c\n+++ b/builtin-rm.c\n@@ -144,7 +144,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)\n \tconst char **pathspec;\n \tchar *seen;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tnewfd = hold_locked_index(&lock_file, 1);\n \ndiff --git a/builtin-show-branch.c b/builtin-show-branch.c\nindex 019abd3..ee4269d 100644\n--- a/builtin-show-branch.c\n+++ b/builtin-show-branch.c\n@@ -533,7 +533,7 @@ static void append_one_rev(const char *av)\n \tdie(\"bad sha1 reference %s\", av);\n }\n \n-static int git_show_branch_config(const char *var, const char *value)\n+static int git_show_branch_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"showbranch.default\")) {\n \t\tif (!value)\n@@ -547,7 +547,7 @@ static int git_show_branch_config(const char *var, const char *value)\n \t\treturn 0;\n \t}\n \n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static int omit_in_dense(struct commit *commit, struct commit **rev, int n)\n@@ -611,7 +611,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \tint reflog = 0;\n \tconst char *reflog_base = NULL;\n \n-\tgit_config(git_show_branch_config);\n+\tgit_config(git_show_branch_config, NULL);\n \n \t/* If nothing is specified, try the default first */\n \tif (ac == 1 && default_num) {\ndiff --git a/builtin-symbolic-ref.c b/builtin-symbolic-ref.c\nindex d33982b..b49bdb6 100644\n--- a/builtin-symbolic-ref.c\n+++ b/builtin-symbolic-ref.c\n@@ -35,7 +35,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);\n+\tgit_config(git_default_config, NULL);\n \targc = parse_options(argc, argv, options, git_symbolic_ref_usage, 0);\n \tif (msg &&!*msg)\n \t\tdie(\"Refusing to perform update with empty message\");\ndiff --git a/builtin-tag.c b/builtin-tag.c\nindex 129ff57..e675206 100644\n--- a/builtin-tag.c\n+++ b/builtin-tag.c\n@@ -256,7 +256,7 @@ static void set_signingkey(const char *value)\n \t\tdie(\"signing key value too long (%.10s...)\", value);\n }\n \n-static int git_tag_config(const char *var, const char *value)\n+static int git_tag_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"user.signingkey\")) {\n \t\tif (!value)\n@@ -265,7 +265,7 @@ static int git_tag_config(const char *var, const char *value)\n \t\treturn 0;\n \t}\n \n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static void write_tag_body(int fd, const unsigned char *sha1)\n@@ -408,7 +408,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)\n \t\tOPT_END()\n \t};\n \n-\tgit_config(git_tag_config);\n+\tgit_config(git_tag_config, NULL);\n \n \targc = parse_options(argc, argv, options, git_tag_usage, 0);\n \ndiff --git a/builtin-unpack-objects.c b/builtin-unpack-objects.c\nindex fecf0be..85043d1 100644\n--- a/builtin-unpack-objects.c\n+++ b/builtin-unpack-objects.c\n@@ -493,7 +493,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)\n \tint i;\n \tunsigned char sha1[20];\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tquiet = !isatty(2);\n \ndiff --git a/builtin-update-index.c b/builtin-update-index.c\nindex a8795d3..e1ca8de 100644\n--- a/builtin-update-index.c\n+++ b/builtin-update-index.c\n@@ -567,7 +567,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)\n \tint lock_error = 0;\n \tstruct lock_file *lock_file;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\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 e90737c..93c1271 100644\n--- a/builtin-update-ref.c\n+++ b/builtin-update-ref.c\n@@ -22,7 +22,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);\n+\tgit_config(git_default_config, NULL);\n \targc = parse_options(argc, argv, options, git_update_ref_usage, 0);\n \tif (msg && !*msg)\n \t\tdie(\"Refusing to perform update with empty message.\");\ndiff --git a/builtin-verify-pack.c b/builtin-verify-pack.c\nindex 4958bbb..4c515a0 100644\n--- a/builtin-verify-pack.c\n+++ b/builtin-verify-pack.c\n@@ -55,7 +55,7 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix)\n \tint no_more_options = 0;\n \tint nothing_done = 1;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \twhile (1 < argc) {\n \t\tif (!no_more_options && argv[1][0] == '-') {\n \t\t\tif (!strcmp(\"-v\", argv[1]))\ndiff --git a/builtin-verify-tag.c b/builtin-verify-tag.c\nindex db81496..92eaa89 100644\n--- a/builtin-verify-tag.c\n+++ b/builtin-verify-tag.c\n@@ -90,7 +90,7 @@ int cmd_verify_tag(int argc, const char **argv, const char *prefix)\n {\n \tint i = 1, verbose = 0, had_error = 0;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tif (argc == 1)\n \t\tusage(builtin_verify_tag_usage);\ndiff --git a/builtin-write-tree.c b/builtin-write-tree.c\nindex e838d01..c218799 100644\n--- a/builtin-write-tree.c\n+++ b/builtin-write-tree.c\n@@ -18,7 +18,7 @@ int cmd_write_tree(int argc, const char **argv, const char *unused_prefix)\n \tunsigned char sha1[20];\n \tconst char *me = \"git-write-tree\";\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \twhile (1 < argc) {\n \t\tconst char *arg = argv[1];\n \t\tif (!strcmp(arg, \"--missing-ok\"))\ndiff --git a/cache.h b/cache.h\nindex c761915..b79df28 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -719,10 +719,10 @@ extern int matches_pack_name(struct packed_git *p, const char *name);\n /* Dumb servers support */\n extern int update_server_info(int);\n \n-typedef int (*config_fn_t)(const char *, const char *);\n-extern int git_default_config(const char *, const char *);\n-extern int git_config_from_file(config_fn_t fn, const char *);\n-extern int git_config(config_fn_t fn);\n+typedef int (*config_fn_t)(const char *, const char *, void *);\n+extern int git_default_config(const char *, const char *, void *);\n+extern int git_config_from_file(config_fn_t fn, const char *, void *);\n+extern int git_config(config_fn_t fn, void *);\n extern int git_parse_long(const char *, long *);\n extern int git_parse_ulong(const char *, unsigned long *);\n extern int git_config_int(const char *, const char *);\n@@ -734,7 +734,7 @@ extern int git_config_set(const char *, const char *);\n extern int git_config_set_multivar(const char *, const char *, const char *, int);\n extern int git_config_rename_section(const char *, const char *);\n extern const char *git_etc_gitconfig(void);\n-extern int check_repository_format_version(const char *var, const char *value);\n+extern int check_repository_format_version(const char *var, const char *value, void *cb);\n extern int git_env_bool(const char *, int);\n extern int git_config_system(void);\n extern int git_config_global(void);\ndiff --git a/color.c b/color.c\nindex 12a6453..fc0b72a 100644\n--- a/color.c\n+++ b/color.c\n@@ -145,14 +145,14 @@ int git_config_colorbool(const char *var, const char *value, int stdout_is_tty)\n \treturn 0;\n }\n \n-int git_color_default_config(const char *var, const char *value)\n+int git_color_default_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"color.ui\")) {\n \t\tgit_use_color_default = git_config_colorbool(var, value, -1);\n \t\treturn 0;\n \t}\n \n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static int color_vfprintf(FILE *fp, const char *color, const char *fmt,\ndiff --git a/color.h b/color.h\nindex ecda556..6cf5c88 100644\n--- a/color.h\n+++ b/color.h\n@@ -13,7 +13,7 @@ extern int git_use_color_default;\n /*\n  * Use this instead of git_default_config if you need the value of color.ui.\n  */\n-int git_color_default_config(const char *var, const char *value);\n+int git_color_default_config(const char *var, const char *value, void *cb);\n \n int git_config_colorbool(const char *var, const char *value, int stdout_is_tty);\n void color_parse(const char *var, const char *value, char *dst);\ndiff --git a/config.c b/config.c\nindex 5195de1..c2f2bbb 100644\n--- a/config.c\n+++ b/config.c\n@@ -111,7 +111,7 @@ static inline int iskeychar(int c)\n \treturn isalnum(c) || c == '-';\n }\n \n-static int get_value(config_fn_t fn, char *name, unsigned int len)\n+static int get_value(config_fn_t fn, void *data, char *name, unsigned int len)\n {\n \tint c;\n \tchar *value;\n@@ -139,7 +139,7 @@ static int get_value(config_fn_t fn, char *name, unsigned int len)\n \t\tif (!value)\n \t\t\treturn -1;\n \t}\n-\treturn fn(name, value);\n+\treturn fn(name, value, data);\n }\n \n static int get_extended_base_var(char *name, int baselen, int c)\n@@ -197,7 +197,7 @@ static int get_base_var(char *name)\n \t}\n }\n \n-static int git_parse_file(config_fn_t fn)\n+static int git_parse_file(config_fn_t fn, void *data)\n {\n \tint comment = 0;\n \tint baselen = 0;\n@@ -228,7 +228,7 @@ static int git_parse_file(config_fn_t fn)\n \t\tif (!isalpha(c))\n \t\t\tbreak;\n \t\tvar[baselen] = tolower(c);\n-\t\tif (get_value(fn, var, baselen+1) < 0)\n+\t\tif (get_value(fn, data, var, baselen+1) < 0)\n \t\t\tbreak;\n \t}\n \tdie(\"bad config file line %d in %s\", config_linenr, config_file_name);\n@@ -332,7 +332,7 @@ int git_config_string(const char **dest, const char *var, const char *value)\n \treturn 0;\n }\n \n-int git_default_config(const char *var, const char *value)\n+int git_default_config(const char *var, const char *value, void *dummy)\n {\n \t/* This needs a better name */\n \tif (!strcmp(var, \"core.filemode\")) {\n@@ -516,7 +516,7 @@ int git_default_config(const char *var, const char *value)\n \treturn 0;\n }\n \n-int git_config_from_file(config_fn_t fn, const char *filename)\n+int git_config_from_file(config_fn_t fn, const char *filename, void *data)\n {\n \tint ret;\n \tFILE *f = fopen(filename, \"r\");\n@@ -527,7 +527,7 @@ int git_config_from_file(config_fn_t fn, const char *filename)\n \t\tconfig_file_name = filename;\n \t\tconfig_linenr = 1;\n \t\tconfig_file_eof = 0;\n-\t\tret = git_parse_file(fn);\n+\t\tret = git_parse_file(fn, data);\n \t\tfclose(f);\n \t\tconfig_file_name = NULL;\n \t}\n@@ -565,7 +565,7 @@ int git_config_global(void)\n \treturn !git_env_bool(\"GIT_CONFIG_NOGLOBAL\", 0);\n }\n \n-int git_config(config_fn_t fn)\n+int git_config(config_fn_t fn, void *data)\n {\n \tint ret = 0;\n \tchar *repo_config = NULL;\n@@ -578,7 +578,8 @@ int git_config(config_fn_t fn)\n \tfilename = getenv(CONFIG_ENVIRONMENT);\n \tif (!filename) {\n \t\tif (git_config_system() && !access(git_etc_gitconfig(), R_OK))\n-\t\t\tret += git_config_from_file(fn, git_etc_gitconfig());\n+\t\t\tret += git_config_from_file(fn, git_etc_gitconfig(),\n+\t\t\t\tdata);\n \t\thome = getenv(\"HOME\");\n \t\tfilename = getenv(CONFIG_LOCAL_ENVIRONMENT);\n \t\tif (!filename)\n@@ -588,11 +589,11 @@ int git_config(config_fn_t fn)\n \tif (git_config_global() && home) {\n \t\tchar *user_config = xstrdup(mkpath(\"%s/.gitconfig\", home));\n \t\tif (!access(user_config, R_OK))\n-\t\t\tret = git_config_from_file(fn, user_config);\n+\t\t\tret = git_config_from_file(fn, user_config, data);\n \t\tfree(user_config);\n \t}\n \n-\tret += git_config_from_file(fn, filename);\n+\tret += git_config_from_file(fn, filename, data);\n \tfree(repo_config);\n \treturn ret;\n }\n@@ -622,7 +623,7 @@ static int matches(const char* key, const char* value)\n \t\t  !regexec(store.value_regex, value, 0, NULL, 0)));\n }\n \n-static int store_aux(const char* key, const char* value)\n+static int store_aux(const char* key, const char* value, void *cb)\n {\n \tconst char *ep;\n \tsize_t section_len;\n@@ -951,7 +952,7 @@ int git_config_set_multivar(const char* key, const char* value,\n \t\t * As a side effect, we make sure to transform only a valid\n \t\t * existing config file.\n \t\t */\n-\t\tif (git_config_from_file(store_aux, config_filename)) {\n+\t\tif (git_config_from_file(store_aux, config_filename, NULL)) {\n \t\t\terror(\"invalid config file %s\", config_filename);\n \t\t\tfree(store.key);\n \t\t\tif (store.value_regex != NULL) {\ndiff --git a/connect.c b/connect.c\nindex d12b105..e92af29 100644\n--- a/connect.c\n+++ b/connect.c\n@@ -360,7 +360,8 @@ static char *git_proxy_command;\n static const char *rhost_name;\n static int rhost_len;\n \n-static int git_proxy_command_options(const char *var, const char *value)\n+static int git_proxy_command_options(const char *var, const char *value,\n+\t\tvoid *cb)\n {\n \tif (!strcmp(var, \"core.gitproxy\")) {\n \t\tconst char *for_pos;\n@@ -404,7 +405,7 @@ static int git_proxy_command_options(const char *var, const char *value)\n \t\treturn 0;\n \t}\n \n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static int git_use_proxy(const char *host)\n@@ -412,7 +413,7 @@ static int git_use_proxy(const char *host)\n \trhost_name = host;\n \trhost_len = strlen(host);\n \tgit_proxy_command = getenv(\"GIT_PROXY_COMMAND\");\n-\tgit_config(git_proxy_command_options);\n+\tgit_config(git_proxy_command_options, NULL);\n \trhost_name = NULL;\n \treturn (git_proxy_command && *git_proxy_command);\n }\ndiff --git a/convert.c b/convert.c\nindex d8c94cb..1c66844 100644\n--- a/convert.c\n+++ b/convert.c\n@@ -323,7 +323,7 @@ static struct convert_driver {\n \tchar *clean;\n } *user_convert, **user_convert_tail;\n \n-static int read_convert_config(const char *var, const char *value)\n+static int read_convert_config(const char *var, const char *value, void *cb)\n {\n \tconst char *ep, *name;\n \tint namelen;\n@@ -385,7 +385,7 @@ static void setup_convert_check(struct git_attr_check *check)\n \t\tattr_ident = git_attr(\"ident\", 5);\n \t\tattr_filter = git_attr(\"filter\", 6);\n \t\tuser_convert_tail = &user_convert;\n-\t\tgit_config(read_convert_config);\n+\t\tgit_config(read_convert_config, NULL);\n \t}\n \tcheck[0].attr = attr_crlf;\n \tcheck[1].attr = attr_ident;\ndiff --git a/daemon.c b/daemon.c\nindex 2b4a6f1..63cd12c 100644\n--- a/daemon.c\n+++ b/daemon.c\n@@ -306,7 +306,7 @@ struct daemon_service {\n static struct daemon_service *service_looking_at;\n static int service_enabled;\n \n-static int git_daemon_config(const char *var, const char *value)\n+static int git_daemon_config(const char *var, const char *value, void *cb)\n {\n \tif (!prefixcmp(var, \"daemon.\") &&\n \t    !strcmp(var + 7, service_looking_at->config_name)) {\n@@ -356,7 +356,7 @@ static int run_service(struct interp *itable, struct daemon_service *service)\n \tif (service->overridable) {\n \t\tservice_looking_at = service;\n \t\tservice_enabled = -1;\n-\t\tgit_config(git_daemon_config);\n+\t\tgit_config(git_daemon_config, NULL);\n \t\tif (0 <= service_enabled)\n \t\t\tenabled = service_enabled;\n \t}\ndiff --git a/diff.c b/diff.c\nindex 439d474..f77edaf 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -129,7 +129,7 @@ static int parse_funcname_pattern(const char *var, const char *ep, const char *v\n  * never be affected by the setting of diff.renames\n  * the user happens to have in the configuration file.\n  */\n-int git_diff_ui_config(const char *var, const char *value)\n+int git_diff_ui_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"diff.renamelimit\")) {\n \t\tdiff_rename_limit_default = git_config_int(var, value);\n@@ -166,10 +166,10 @@ int git_diff_ui_config(const char *var, const char *value)\n \t\t\treturn parse_lldiff_command(var, ep, value);\n \t}\n \n-\treturn git_diff_basic_config(var, value);\n+\treturn git_diff_basic_config(var, value, cb);\n }\n \n-int git_diff_basic_config(const char *var, const char *value)\n+int git_diff_basic_config(const char *var, const char *value, void *cb)\n {\n \tif (!prefixcmp(var, \"diff.color.\") || !prefixcmp(var, \"color.diff.\")) {\n \t\tint slot = parse_diff_color_slot(var, 11);\n@@ -190,7 +190,7 @@ int git_diff_basic_config(const char *var, const char *value)\n \t\t}\n \t}\n \n-\treturn git_color_default_config(var, value);\n+\treturn git_color_default_config(var, value, cb);\n }\n \n static char *quote_two(const char *one, const char *two)\ndiff --git a/diff.h b/diff.h\nindex 3a02d38..f190e02 100644\n--- a/diff.h\n+++ b/diff.h\n@@ -181,8 +181,8 @@ extern void diff_unmerge(struct diff_options *,\n #define DIFF_SETUP_USE_CACHE\t\t2\n #define DIFF_SETUP_USE_SIZE_CACHE\t4\n \n-extern int git_diff_basic_config(const char *var, const char *value);\n-extern int git_diff_ui_config(const char *var, const char *value);\n+extern int git_diff_basic_config(const char *var, const char *value, void *cb);\n+extern int git_diff_ui_config(const char *var, const char *value, void *cb);\n extern int diff_use_color_default;\n extern void diff_setup(struct diff_options *);\n extern int diff_opt_parse(struct diff_options *, const char **, int);\ndiff --git a/fast-import.c b/fast-import.c\nindex 73e5439..36ec5b8 100644\n--- a/fast-import.c\n+++ b/fast-import.c\n@@ -2352,7 +2352,7 @@ static void import_marks(const char *input_file)\n \tfclose(f);\n }\n \n-static int git_pack_config(const char *k, const char *v)\n+static int git_pack_config(const char *k, const char *v, void *cb)\n {\n \tif (!strcmp(k, \"pack.depth\")) {\n \t\tmax_depth = git_config_int(k, v);\n@@ -2370,7 +2370,7 @@ static int git_pack_config(const char *k, const char *v)\n \t\tpack_compression_seen = 1;\n \t\treturn 0;\n \t}\n-\treturn git_default_config(k, v);\n+\treturn git_default_config(k, v, cb);\n }\n \n static const char fast_import_usage[] =\n@@ -2381,7 +2381,7 @@ int main(int argc, const char **argv)\n \tunsigned int i, show_stats = 1;\n \n \tsetup_git_directory();\n-\tgit_config(git_pack_config);\n+\tgit_config(git_pack_config, NULL);\n \tif (!pack_compression_seen && core_compression_seen)\n \t\tpack_compression_level = core_compression_level;\n \ndiff --git a/hash-object.c b/hash-object.c\nindex 61e7160..3d77390 100644\n--- a/hash-object.c\n+++ b/hash-object.c\n@@ -43,7 +43,7 @@ int main(int argc, char **argv)\n \tint no_more_flags = 0;\n \tint hashstdin = 0;\n \n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tfor (i = 1 ; i < argc; i++) {\n \t\tif (!no_more_flags && argv[i][0] == '-') {\ndiff --git a/help.c b/help.c\nindex af80979..d89d437 100644\n--- a/help.c\n+++ b/help.c\n@@ -252,7 +252,7 @@ static int add_man_viewer_info(const char *var, const char *value)\n \treturn 0;\n }\n \n-static int git_help_config(const char *var, const char *value)\n+static int git_help_config(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(var, \"help.format\")) {\n \t\tif (!value)\n@@ -269,7 +269,7 @@ static int git_help_config(const char *var, const char *value)\n \tif (!prefixcmp(var, \"man.\"))\n \t\treturn add_man_viewer_info(var, value);\n \n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n /* most GUI terminals set COLUMNS (although some don't export it) */\n@@ -641,7 +641,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)\n \tconst char *alias;\n \n \tsetup_git_directory_gently(&nongit);\n-\tgit_config(git_help_config);\n+\tgit_config(git_help_config, NULL);\n \n \targc = parse_options(argc, argv, builtin_help_options,\n \t\t\tbuiltin_help_usage, 0);\ndiff --git a/http.c b/http.c\nindex acf746a..2a21ccb 100644\n--- a/http.c\n+++ b/http.c\n@@ -90,7 +90,7 @@ static void process_curl_messages(void)\n }\n #endif\n \n-static int http_options(const char *var, const char *value)\n+static int http_options(const char *var, const char *value, void *cb)\n {\n \tif (!strcmp(\"http.sslverify\", var)) {\n \t\tif (curl_ssl_verify == -1) {\n@@ -169,7 +169,7 @@ static int http_options(const char *var, const char *value)\n \t}\n \n \t/* Fall back on the default ones */\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static CURL* get_curl_handle(void)\n@@ -263,7 +263,7 @@ void http_init(struct remote *remote)\n \tif (low_speed_time != NULL)\n \t\tcurl_low_speed_time = strtol(low_speed_time, NULL, 10);\n \n-\tgit_config(http_options);\n+\tgit_config(http_options, NULL);\n \n \tif (curl_ssl_verify == -1)\n \t\tcurl_ssl_verify = 1;\ndiff --git a/imap-send.c b/imap-send.c\nindex db65597..1ec1310 100644\n--- a/imap-send.c\n+++ b/imap-send.c\n@@ -1247,7 +1247,7 @@ static imap_server_conf_t server =\n static char *imap_folder;\n \n static int\n-git_imap_config(const char *key, const char *val)\n+git_imap_config(const char *key, const char *val, void *cb)\n {\n \tchar imap_key[] = \"imap.\";\n \n@@ -1296,7 +1296,7 @@ main(int argc, char **argv)\n \t/* init the random number generator */\n \tarc4_init();\n \n-\tgit_config( git_imap_config );\n+\tgit_config(git_imap_config, NULL);\n \n \tif (!imap_folder) {\n \t\tfprintf( stderr, \"no imap store specified\\n\" );\ndiff --git a/index-pack.c b/index-pack.c\nindex 9c0c278..aaba944 100644\n--- a/index-pack.c\n+++ b/index-pack.c\n@@ -765,7 +765,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name,\n \t}\n }\n \n-static int git_index_pack_config(const char *k, const char *v)\n+static int git_index_pack_config(const char *k, const char *v, void *cb)\n {\n \tif (!strcmp(k, \"pack.indexversion\")) {\n \t\tpack_idx_default_version = git_config_int(k, v);\n@@ -773,7 +773,7 @@ static int git_index_pack_config(const char *k, const char *v)\n \t\t\tdie(\"bad pack.indexversion=%d\", pack_idx_default_version);\n \t\treturn 0;\n \t}\n-\treturn git_default_config(k, v);\n+\treturn git_default_config(k, v, cb);\n }\n \n int main(int argc, char **argv)\n@@ -786,7 +786,7 @@ int main(int argc, char **argv)\n \tstruct pack_idx_entry **idx_objects;\n \tunsigned char sha1[20];\n \n-\tgit_config(git_index_pack_config);\n+\tgit_config(git_index_pack_config, NULL);\n \n \tfor (i = 1; i < argc; i++) {\n \t\tchar *arg = argv[i];\ndiff --git a/ll-merge.c b/ll-merge.c\nindex 5ae7433..9837c84 100644\n--- a/ll-merge.c\n+++ b/ll-merge.c\n@@ -225,7 +225,7 @@ static int ll_ext_merge(const struct ll_merge_driver *fn,\n static struct ll_merge_driver *ll_user_merge, **ll_user_merge_tail;\n static const char *default_ll_merge;\n \n-static int read_merge_config(const char *var, const char *value)\n+static int read_merge_config(const char *var, const char *value, void *cb)\n {\n \tstruct ll_merge_driver *fn;\n \tconst char *ep, *name;\n@@ -309,7 +309,7 @@ static void initialize_ll_merge(void)\n \tif (ll_user_merge_tail)\n \t\treturn;\n \tll_user_merge_tail = &ll_user_merge;\n-\tgit_config(read_merge_config);\n+\tgit_config(read_merge_config, NULL);\n }\n \n static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr)\ndiff --git a/pager.c b/pager.c\nindex ca002f9..dbd9414 100644\n--- a/pager.c\n+++ b/pager.c\n@@ -33,7 +33,7 @@ void setup_pager(void)\n \t\treturn;\n \tif (!pager) {\n \t\tif (!pager_program)\n-\t\t\tgit_config(git_default_config);\n+\t\t\tgit_config(git_default_config, NULL);\n \t\tpager = pager_program;\n \t}\n \tif (!pager)\ndiff --git a/receive-pack.c b/receive-pack.c\nindex e9de36c..cf45020 100644\n--- a/receive-pack.c\n+++ b/receive-pack.c\n@@ -19,7 +19,7 @@ static int report_status;\n static char capabilities[] = \" report-status delete-refs tellme-more \";\n static int capabilities_sent;\n \n-static int receive_pack_config(const char *var, const char *value)\n+static int receive_pack_config(const char *var, const char *value, void *cb)\n {\n \tif (strcmp(var, \"receive.denynonfastforwards\") == 0) {\n \t\tdeny_non_fast_forwards = git_config_bool(var, value);\n@@ -41,7 +41,7 @@ static int receive_pack_config(const char *var, const char *value)\n \t\treturn 0;\n \t}\n \n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n static int show_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)\n@@ -638,7 +638,7 @@ int main(int argc, char **argv)\n \tif (is_repository_shallow())\n \t\tdie(\"attempt to push into a shallow repository\");\n \n-\tgit_config(receive_pack_config);\n+\tgit_config(receive_pack_config, NULL);\n \n \tif (0 <= transfer_unpack_limit)\n \t\tunpack_limit = transfer_unpack_limit;\ndiff --git a/remote.c b/remote.c\nindex 05041ed..c7ba617 100644\n--- a/remote.c\n+++ b/remote.c\n@@ -297,7 +297,7 @@ static void read_branches_file(struct remote *remote)\n \tremote->fetch_tags = 1; /* always auto-follow */\n }\n \n-static int handle_config(const char *key, const char *value)\n+static int handle_config(const char *key, const char *value, void *cb)\n {\n \tconst char *name;\n \tconst char *subkey;\n@@ -419,7 +419,7 @@ static void read_config(void)\n \t\tcurrent_branch =\n \t\t\tmake_branch(head_ref + strlen(\"refs/heads/\"), 0);\n \t}\n-\tgit_config(handle_config);\n+\tgit_config(handle_config, NULL);\n \talias_all_urls();\n }\n \ndiff --git a/setup.c b/setup.c\nindex b8fd476..d630e37 100644\n--- a/setup.c\n+++ b/setup.c\n@@ -300,7 +300,7 @@ void setup_work_tree(void)\n \n static int check_repository_format_gently(int *nongit_ok)\n {\n-\tgit_config(check_repository_format_version);\n+\tgit_config(check_repository_format_version, NULL);\n \tif (GIT_REPO_VERSION < repository_format_version) {\n \t\tif (!nongit_ok)\n \t\t\tdie (\"Expected git repo version <= %d, found %d\",\n@@ -524,7 +524,7 @@ int git_config_perm(const char *var, const char *value)\n \treturn i & 0666;\n }\n \n-int check_repository_format_version(const char *var, const char *value)\n+int check_repository_format_version(const char *var, const char *value, void *cb)\n {\n \tif (strcmp(var, \"core.repositoryformatversion\") == 0)\n \t\trepository_format_version = git_config_int(var, value);\ndiff --git a/unpack-file.c b/unpack-file.c\nindex 65c66eb..bcdc8bb 100644\n--- a/unpack-file.c\n+++ b/unpack-file.c\n@@ -31,7 +31,7 @@ int main(int argc, char **argv)\n \t\tdie(\"Not a valid object name %s\", argv[1]);\n \n \tsetup_git_directory();\n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \n \tputs(create_temp_file(sha1));\n \treturn 0;\ndiff --git a/var.c b/var.c\nindex c20ac91..724ba87 100644\n--- a/var.c\n+++ b/var.c\n@@ -39,13 +39,13 @@ static const char *read_var(const char *var)\n \treturn val;\n }\n \n-static int show_config(const char *var, const char *value)\n+static int show_config(const char *var, const char *value, void *cb)\n {\n \tif (value)\n \t\tprintf(\"%s=%s\\n\", var, value);\n \telse\n \t\tprintf(\"%s\\n\", var);\n-\treturn git_default_config(var, value);\n+\treturn git_default_config(var, value, cb);\n }\n \n int main(int argc, char **argv)\n@@ -60,11 +60,11 @@ int main(int argc, char **argv)\n \tval = NULL;\n \n \tif (strcmp(argv[1], \"-l\") == 0) {\n-\t\tgit_config(show_config);\n+\t\tgit_config(show_config, NULL);\n \t\tlist_vars();\n \t\treturn 0;\n \t}\n-\tgit_config(git_default_config);\n+\tgit_config(git_default_config, NULL);\n \tval = read_var(argv[1]);\n \tif (!val)\n \t\tusage(var_usage);\ndiff --git a/wt-status.c b/wt-status.c\nindex a44c543..9bb5ea6 100644\n--- a/wt-status.c\n+++ b/wt-status.c\n@@ -362,7 +362,7 @@ void wt_status_print(struct wt_status *s)\n \t}\n }\n \n-int git_status_config(const char *k, const char *v)\n+int git_status_config(const char *k, const char *v, void *cb)\n {\n \tif (!strcmp(k, \"status.submodulesummary\")) {\n \t\tint is_bool;\n@@ -386,5 +386,5 @@ int git_status_config(const char *k, const char *v)\n \t\twt_status_relative_paths = git_config_bool(k, v);\n \t\treturn 0;\n \t}\n-\treturn git_color_default_config(k, v);\n+\treturn git_color_default_config(k, v, cb);\n }\ndiff --git a/wt-status.h b/wt-status.h\nindex 7d61410..f2c7130 100644\n--- a/wt-status.h\n+++ b/wt-status.h\n@@ -27,7 +27,7 @@ struct wt_status {\n \tconst char *prefix;\n };\n \n-int git_status_config(const char *var, const char *value);\n+int git_status_config(const char *var, const char *value, void *cb);\n extern int wt_status_use_color;\n extern int wt_status_relative_paths;\n void wt_status_prepare(struct wt_status *s);\n-- \n1.5.5.1.375.g1becb\n"},{"id":"76980","messageId":"7vk5hwn0tp.fsf@gitster.siamese.dyndns.org","threadId":"13518","inReplyTo":"alpine.DEB.1.00.0805141846370.30431@racer","subject":"Re: [PATCH 2/2] Provide git_config with a callback-data parameter","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-05-14T19:27:14Z","receivedAt":"2008-05-14T19:27:14Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n\n> git_config() only had a function parameter, but no callback data\n> parameter.  This assumes that all callback functions only modify\n> global variables.\n>\n> With this patch, every callback gets a void * parameter, and it is hoped\n> that this will help the libification effort.\n\nGreat, as this has also been a pet-peeve of mine for quite some time.\n\nExcept the patch has quite a many rejects X-<.\n"},{"id":"77004","messageId":"alpine.DEB.1.00.0805150156230.30431@racer","threadId":"13518","inReplyTo":"7vk5hwn0tp.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH 2/2] Provide git_config with a callback-data parameter","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-05-15T01:02:45Z","receivedAt":"2008-05-15T01:02:45Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Wed, 14 May 2008, Junio C Hamano wrote:\n\n> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n> \n> > git_config() only had a function parameter, but no callback data\n> > parameter.  This assumes that all callback functions only modify\n> > global variables.\n> >\n> > With this patch, every callback gets a void * parameter, and it is hoped\n> > that this will help the libification effort.\n> \n> Great, as this has also been a pet-peeve of mine for quite some time.\n> \n> Except the patch has quite a many rejects X-<.\n\nDid you try to apply it to \"next\"?  I thought I based it on \"next\"...  I \nwill prepare three patches tomorrow: for \"next\", \"master\" and \"maint\" \nrespectively (even if I think that \"maint\" should not take it; it is no \nreal fix).\n\nCiao,\nDscho\n"},{"id":"77009","messageId":"7vy76cib9k.fsf@gitster.siamese.dyndns.org","threadId":"13518","inReplyTo":"alpine.DEB.1.00.0805150156230.30431@racer","subject":"Re: [PATCH 2/2] Provide git_config with a callback-data parameter","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-05-15T01:52:55Z","receivedAt":"2008-05-15T01:52:55Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n\n>> Great, as this has also been a pet-peeve of mine for quite some time.\n>> \n>> Except the patch has quite a many rejects X-<.\n>\n> Did you try to apply it to \"next\"?\n\nThe rejects are Ok.  As long as function signature change of git_config()\nis there, any misconversion will be caught by the compiler so I can manage\nwith relatively high confidence.\n\nI need manual inspection on the other patch, as s/path.list/string.list/\ncould oversubstitute without breaking compilation.\n"}]}