Tanay Abhra <tanay...@gmail.com> writes:

> I am searching for a more elegant solution to this problem.

The "efficient" (not sure about elegant) solution would be to keep one
configset per file, and re-parse only the files needed.

I find the solution I posted in the other thread relatively "elegant":
invalidate the config cache when things change.

The last test failure seems more tricky. This (dirty) patch fixes the
failure:

--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -255,6 +255,8 @@ static int builtin_diff_files(struct rev_info *revs, int 
argc, const char **argv
        return run_diff_files(revs, options);
 }
 
+int git_config_raw(config_fn_t fn, void *data);
+
 int cmd_diff(int argc, const char **argv, const char *prefix)
 {
        int i;
@@ -317,7 +319,7 @@ int cmd_diff(int argc, const char **argv, const char 
*prefix)
 
        if (!no_index)
                gitmodules_config();
-       git_config(git_diff_ui_config, NULL);
+       git_config_raw(git_diff_ui_config, NULL);
 
        init_revisions(&rev, prefix);
 

But this one does not:

diff --git a/builtin/diff.c b/builtin/diff.c
index 0f247d2..2012e81 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -317,7 +317,9 @@ int cmd_diff(int argc, const char **argv, const char 
*prefix)
 
        if (!no_index)
                gitmodules_config();
+       git_config_clear();
        git_config(git_diff_ui_config, NULL);
+       git_config_clear();
 
        init_revisions(&rev, prefix);
 

So it's not just a matter of invalid cache not cleared, it's a real
difference between git_config() and git_config_raw(). The guilty part is
probably userdiff_config(const char *k, const char *v) in userdiff.c,
that parses the xfuncname config option.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
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