Only use GIT_CONFIG in "git config", not other programs
authorDaniel Barkalow <barkalow@iabervon.org>
Mon, 30 Jun 2008 07:37:47 +0000 (03:37 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 1 Jul 2008 09:35:49 +0000 (02:35 -0700)
For everything other than using "git config" to read or write a
git-style config file that isn't the current repo's config file,
GIT_CONFIG was actively detrimental. Rather than argue over which
programs are important enough to have work anyway, just fix all of
them at the root.

Also removes GIT_LOCAL_CONFIG, which would only be useful for programs
that do want to use global git-specific config, but not the repo's own
git-specific config, and want to use some other, presumably
git-specific config. Despite being documented, I can't find any sign that
it was ever used.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/RelNotes-1.6.0.txt
Documentation/git-config.txt
builtin-config.c
cache.h
config.c

index 03e3a59ff5ba7660e2f660d4e5194c5cc81d5c18..d37aa46a289f456f7618c156b41d17292178dc84 100644 (file)
@@ -21,6 +21,11 @@ scripts to use "git xyzzy" form, as we will stop installing
 Source changes needed for porting to MinGW environment are now all in the
 main git.git codebase.
 
+GIT_CONFIG, which was only documented as affecting "git config", but
+actually affected all git commands, now only affects "git config".
+GIT_LOCAL_CONFIG, also only documented as affecting "git config" and
+not different from GIT_CONFIG in a useful way, is removed.
+
 
 Updates since v1.5.6
 --------------------
index c90421ee7f3b6a3fe1f08c4868b5652d4d7db569..30c84322672c4747d97f27296848c4478d65b7d4 100644 (file)
@@ -191,11 +191,6 @@ variables. The '--global' and the '--system' options will limit the file used
 to the global or system-wide file respectively. The GIT_CONFIG environment
 variable has a similar effect, but you can specify any filename you want.
 
-The GIT_CONFIG_LOCAL environment variable on the other hand only changes
-the name used instead of the repository configuration file. The global and
-the system-wide configuration files will still be read. (For writing options
-this will obviously result in the same behavior as using GIT_CONFIG.)
-
 
 ENVIRONMENT
 -----------
@@ -205,10 +200,6 @@ GIT_CONFIG::
        Using the "--global" option forces this to ~/.gitconfig. Using the
        "--system" option forces this to $(prefix)/etc/gitconfig.
 
-GIT_CONFIG_LOCAL::
-       Take the configuration from the given file instead if .git/config.
-       Still read the global and the system-wide configuration files, though.
-
 See also <<FILES>>.
 
 
index 3a441ef64868b7c477ee9c49546ef1cb39e5acad..39f63d7b10f93a0a021d8b9af9fdec46ed0333f6 100644 (file)
@@ -81,12 +81,10 @@ static int get_value(const char* key_, const char* regex_)
        char *global = NULL, *repo_config = NULL;
        const char *system_wide = NULL, *local;
 
-       local = getenv(CONFIG_ENVIRONMENT);
+       local = config_exclusive_filename;
        if (!local) {
                const char *home = getenv("HOME");
-               local = getenv(CONFIG_LOCAL_ENVIRONMENT);
-               if (!local)
-                       local = repo_config = xstrdup(git_path("config"));
+               local = repo_config = xstrdup(git_path("config"));
                if (git_config_global() && home)
                        global = xstrdup(mkpath("%s/.gitconfig", home));
                if (git_config_system())
@@ -289,6 +287,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
        char* value;
        const char *file = setup_git_directory_gently(&nongit);
 
+       config_exclusive_filename = getenv(CONFIG_ENVIRONMENT);
+
        while (1 < argc) {
                if (!strcmp(argv[1], "--int"))
                        type = T_INT;
@@ -309,14 +309,13 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                        char *home = getenv("HOME");
                        if (home) {
                                char *user_config = xstrdup(mkpath("%s/.gitconfig", home));
-                               setenv(CONFIG_ENVIRONMENT, user_config, 1);
-                               free(user_config);
+                               config_exclusive_filename = user_config;
                        } else {
                                die("$HOME not set");
                        }
                }
                else if (!strcmp(argv[1], "--system"))
-                       setenv(CONFIG_ENVIRONMENT, git_etc_gitconfig(), 1);
+                       config_exclusive_filename = git_etc_gitconfig();
                else if (!strcmp(argv[1], "--file") || !strcmp(argv[1], "-f")) {
                        if (argc < 3)
                                usage(git_config_set_usage);
@@ -325,7 +324,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                                                       argv[2]);
                        else
                                file = argv[2];
-                       setenv(CONFIG_ENVIRONMENT, file, 1);
+                       config_exclusive_filename = file;
                        argc--;
                        argv++;
                }
diff --git a/cache.h b/cache.h
index 64ef86e129337fde851d701a30e70cb84b54ecb3..bab0115b6f8f7e4faa2bd19ec6ff0f8c2c4f7354 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -298,7 +298,6 @@ static inline enum object_type object_type(unsigned int mode)
 #define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE"
 #define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
 #define CONFIG_ENVIRONMENT "GIT_CONFIG"
-#define CONFIG_LOCAL_ENVIRONMENT "GIT_CONFIG_LOCAL"
 #define EXEC_PATH_ENVIRONMENT "GIT_EXEC_PATH"
 #define GITATTRIBUTES_FILE ".gitattributes"
 #define INFOATTRIBUTES_FILE "info/attributes"
@@ -743,6 +742,7 @@ extern int check_repository_format_version(const char *var, const char *value, v
 extern int git_config_system(void);
 extern int git_config_global(void);
 extern int config_error_nonbool(const char *);
+extern const char *config_exclusive_filename;
 
 #define MAX_GITNAME (1000)
 extern char git_default_email[MAX_GITNAME];
index 58749bf41627e3a18b4808f92f5317528e85599f..2862cc45cbb1752153bb6050b4e6bd53f6660724 100644 (file)
--- a/config.c
+++ b/config.c
@@ -16,6 +16,8 @@ static int config_linenr;
 static int config_file_eof;
 static int zlib_compression_seen;
 
+const char *config_exclusive_filename = NULL;
+
 static int get_next_char(void)
 {
        int c;
@@ -611,31 +613,28 @@ int git_config(config_fn_t fn, void *data)
 {
        int ret = 0;
        char *repo_config = NULL;
-       const char *home = NULL, *filename;
+       const char *home = NULL;
 
        /* $GIT_CONFIG makes git read _only_ the given config file,
         * $GIT_CONFIG_LOCAL will make it process it in addition to the
         * global config file, the same way it would the per-repository
         * config file otherwise. */
-       filename = getenv(CONFIG_ENVIRONMENT);
-       if (!filename) {
-               if (git_config_system() && !access(git_etc_gitconfig(), R_OK))
-                       ret += git_config_from_file(fn, git_etc_gitconfig(),
-                               data);
-               home = getenv("HOME");
-               filename = getenv(CONFIG_LOCAL_ENVIRONMENT);
-               if (!filename)
-                       filename = repo_config = xstrdup(git_path("config"));
-       }
+       if (config_exclusive_filename)
+               return git_config_from_file(fn, config_exclusive_filename, data);
+       if (git_config_system() && !access(git_etc_gitconfig(), R_OK))
+               ret += git_config_from_file(fn, git_etc_gitconfig(),
+                                           data);
 
+       home = getenv("HOME");
        if (git_config_global() && home) {
                char *user_config = xstrdup(mkpath("%s/.gitconfig", home));
                if (!access(user_config, R_OK))
-                       ret = git_config_from_file(fn, user_config, data);
+                       ret += git_config_from_file(fn, user_config, data);
                free(user_config);
        }
 
-       ret += git_config_from_file(fn, filename, data);
+       repo_config = xstrdup(git_path("config"));
+       ret += git_config_from_file(fn, repo_config, data);
        free(repo_config);
        return ret;
 }
@@ -873,13 +872,10 @@ int git_config_set_multivar(const char* key, const char* value,
        struct lock_file *lock = NULL;
        const char* last_dot = strrchr(key, '.');
 
-       config_filename = getenv(CONFIG_ENVIRONMENT);
-       if (!config_filename) {
-               config_filename = getenv(CONFIG_LOCAL_ENVIRONMENT);
-               if (!config_filename)
-                       config_filename  = git_path("config");
-       }
-       config_filename = xstrdup(config_filename);
+       if (config_exclusive_filename)
+               config_filename = xstrdup(config_exclusive_filename);
+       else
+               config_filename = xstrdup(git_path("config"));
 
        /*
         * Since "key" actually contains the section name and the real
@@ -1136,13 +1132,10 @@ int git_config_rename_section(const char *old_name, const char *new_name)
        int out_fd;
        char buf[1024];
 
-       config_filename = getenv(CONFIG_ENVIRONMENT);
-       if (!config_filename) {
-               config_filename = getenv(CONFIG_LOCAL_ENVIRONMENT);
-               if (!config_filename)
-                       config_filename  = git_path("config");
-       }
-       config_filename = xstrdup(config_filename);
+       if (config_exclusive_filename)
+               config_filename = xstrdup(config_exclusive_filename);
+       else
+               config_filename = xstrdup(git_path("config"));
        out_fd = hold_lock_file_for_update(lock, config_filename, 0);
        if (out_fd < 0) {
                ret = error("could not lock config file %s", config_filename);