cherry: don't set ignored rev_info options
[gitweb.git] / builtin / config.c
index ccbb13add2b80e39ef806d352850d85e1f73f819..8cd08da99122bc79025d2a78204d316f1b7ba478 100644 (file)
@@ -25,6 +25,7 @@ static const char *given_config_file;
 static int actions, types;
 static const char *get_color_slot, *get_colorbool_slot;
 static int end_null;
+static int respect_includes = -1;
 
 #define ACTION_GET (1<<0)
 #define ACTION_GET_ALL (1<<1)
@@ -74,6 +75,7 @@ static struct option builtin_config_options[] = {
        OPT_BIT(0, "path", &types, "value is a path (file or directory name)", TYPE_PATH),
        OPT_GROUP("Other"),
        OPT_BOOLEAN('z', "null", &end_null, "terminate values with NUL byte"),
+       OPT_BOOL(0, "includes", &respect_includes, "respect include directives on lookup"),
        OPT_END(),
 };
 
@@ -159,17 +161,18 @@ static int show_config(const char *key_, const char *value_, void *cb)
 static int get_value(const char *key_, const char *regex_)
 {
        int ret = -1;
-       char *global = NULL, *repo_config = NULL;
+       char *global = NULL, *xdg = NULL, *repo_config = NULL;
        const char *system_wide = NULL, *local;
+       struct config_include_data inc = CONFIG_INCLUDE_INIT;
+       config_fn_t fn;
+       void *data;
 
        local = given_config_file;
        if (!local) {
-               const char *home = getenv("HOME");
                local = repo_config = git_pathdup("config");
-               if (home)
-                       global = xstrdup(mkpath("%s/.gitconfig", home));
                if (git_config_system())
                        system_wide = git_etc_gitconfig();
+               home_config_paths(&global, &xdg, "config");
        }
 
        if (use_key_regexp) {
@@ -213,19 +216,32 @@ static int get_value(const char *key_, const char *regex_)
                }
        }
 
+       fn = show_config;
+       data = NULL;
+       if (respect_includes) {
+               inc.fn = fn;
+               inc.data = data;
+               fn = git_config_include;
+               data = &inc;
+       }
+
        if (do_all && system_wide)
-               git_config_from_file(show_config, system_wide, NULL);
+               git_config_from_file(fn, system_wide, data);
+       if (do_all && xdg)
+               git_config_from_file(fn, xdg, data);
        if (do_all && global)
-               git_config_from_file(show_config, global, NULL);
+               git_config_from_file(fn, global, data);
        if (do_all)
-               git_config_from_file(show_config, local, NULL);
-       git_config_from_parameters(show_config, NULL);
+               git_config_from_file(fn, local, data);
+       git_config_from_parameters(fn, data);
        if (!do_all && !seen)
-               git_config_from_file(show_config, local, NULL);
+               git_config_from_file(fn, local, data);
        if (!do_all && !seen && global)
-               git_config_from_file(show_config, global, NULL);
+               git_config_from_file(fn, global, data);
+       if (!do_all && !seen && xdg)
+               git_config_from_file(fn, xdg, data);
        if (!do_all && !seen && system_wide)
-               git_config_from_file(show_config, system_wide, NULL);
+               git_config_from_file(fn, system_wide, data);
 
        free(key);
        if (regexp) {
@@ -241,6 +257,7 @@ static int get_value(const char *key_, const char *regex_)
 free_strings:
        free(repo_config);
        free(global);
+       free(xdg);
        return ret;
 }
 
@@ -302,7 +319,7 @@ static void get_color(const char *def_color)
        get_color_found = 0;
        parsed_color[0] = '\0';
        git_config_with_options(git_get_color_config, NULL,
-                               given_config_file);
+                               given_config_file, respect_includes);
 
        if (!get_color_found && def_color)
                color_parse(def_color, "command line", parsed_color);
@@ -330,7 +347,7 @@ static int get_colorbool(int print)
        get_colorbool_found = -1;
        get_diff_color_found = -1;
        git_config_with_options(git_get_colorbool_config, NULL,
-                               given_config_file);
+                               given_config_file, respect_includes);
 
        if (get_colorbool_found < 0) {
                if (!strcmp(get_colorbool_slot, "color.diff"))
@@ -365,13 +382,25 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        }
 
        if (use_global_config) {
-               char *home = getenv("HOME");
-               if (home) {
-                       char *user_config = xstrdup(mkpath("%s/.gitconfig", home));
-                       given_config_file = user_config;
-               } else {
+               char *user_config = NULL;
+               char *xdg_config = NULL;
+
+               home_config_paths(&user_config, &xdg_config, "config");
+
+               if (!user_config)
+                       /*
+                        * It is unknown if HOME/.gitconfig exists, so
+                        * we do not know if we should write to XDG
+                        * location; error out even if XDG_CONFIG_HOME
+                        * is set and points at a sane location.
+                        */
                        die("$HOME not set");
-               }
+
+               if (access(user_config, R_OK) &&
+                   xdg_config && !access(xdg_config, R_OK))
+                       given_config_file = xdg_config;
+               else
+                       given_config_file = user_config;
        }
        else if (use_system_config)
                given_config_file = git_etc_gitconfig();
@@ -383,10 +412,11 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                                xstrdup(prefix_filename(prefix,
                                                        strlen(prefix),
                                                        given_config_file));
-               else
-                       given_config_file = given_config_file;
        }
 
+       if (respect_includes == -1)
+               respect_includes = !given_config_file;
+
        if (end_null) {
                term = '\0';
                delim = '\n';
@@ -424,7 +454,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        if (actions == ACTION_LIST) {
                check_argc(argc, 0, 0);
                if (git_config_with_options(show_all_config, NULL,
-                                           given_config_file) < 0) {
+                                           given_config_file,
+                                           respect_includes) < 0) {
                        if (given_config_file)
                                die_errno("unable to read config file '%s'",
                                          given_config_file);