t4018-diff-funcname.sh fails for the new `git_config()` which uses the
configuration files caching layer internally.
The test introduced in commit d64d6cdc checks that whether `xfuncname` takes
precedence over `funcname` variable which was not guaranteed by config API
previously and worked only because values were parsed and fed in order. The
new  `git_config()` only guarantees precedence order for variables with the
same name.

Also `funcname` variable is deprecated and not documented properly.
`xfuncname` is mentioned in the docs and takes precedence over `funcname`.
Instead of removing `funcname` variable, enforce `xfuncname` precedence over
`funcname` when the variables have the same subsection. Remove dependency
that required values to be fed to userdiff_config() in parsing order for the
test to succeed.

Signed-off-by: Tanay Abhra <tanay...@gmail.com>
Note: this the only test that failed for the new git_config() rewrite.

 userdiff.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/userdiff.c b/userdiff.c
index fad52d6..a51bc89 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -2,6 +2,7 @@
 #include "userdiff.h"
 #include "cache.h"
 #include "attr.h"
+#include "string-list.h"
 static struct userdiff_driver *drivers;
 static int ndrivers;
@@ -211,9 +212,12 @@ int userdiff_config(const char *k, const char *v)
        struct userdiff_driver *drv;
        const char *name, *type;
        int namelen;
+       char *subsection = NULL;
+       static struct string_list xflag = STRING_LIST_INIT_DUP;
        if (parse_config_key(k, "diff", &name, &namelen, &type) || !name)
                return 0;
+       subsection = xstrndup(name, namelen);
        drv = userdiff_find_by_namelen(name, namelen);
        if (!drv) {
@@ -224,10 +228,16 @@ int userdiff_config(const char *k, const char *v)
                drv->binary = -1;
-       if (!strcmp(type, "funcname"))
+       if (!strcmp(type, "funcname") && 
!unsorted_string_list_has_string(&xflag, subsection)) {
+               free (subsection);
                return parse_funcname(&drv->funcname, k, v, 0);
-       if (!strcmp(type, "xfuncname"))
+       }
+       if (!strcmp(type, "xfuncname")) {
+               string_list_append(&xflag, subsection);
+               free (subsection);
                return parse_funcname(&drv->funcname, k, v, REG_EXTENDED);
+       }
+       free(subsection);
        if (!strcmp(type, "binary"))
                return parse_tristate(&drv->binary, k, v);
        if (!strcmp(type, "command"))

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to