Code

Support for extracting configuration from different files
[git.git] / config.c
index 2ae6153e5ee29ca88f52241d1ece79069d8c5875..d46eb6d8293766c2c188a1f89891329e4db06d93 100644 (file)
--- a/config.c
+++ b/config.c
@@ -280,17 +280,17 @@ int git_default_config(const char *var, const char *value)
        }
 
        if (!strcmp(var, "user.name")) {
-               strncpy(git_default_name, value, sizeof(git_default_name));
+               safe_strncpy(git_default_name, value, sizeof(git_default_name));
                return 0;
        }
 
        if (!strcmp(var, "user.email")) {
-               strncpy(git_default_email, value, sizeof(git_default_email));
+               safe_strncpy(git_default_email, value, sizeof(git_default_email));
                return 0;
        }
 
        if (!strcmp(var, "i18n.commitencoding")) {
-               strncpy(git_commit_encoding, value, sizeof(git_commit_encoding));
+               safe_strncpy(git_commit_encoding, value, sizeof(git_commit_encoding));
                return 0;
        }
 
@@ -317,7 +317,17 @@ int git_config_from_file(config_fn_t fn, const char *filename)
 
 int git_config(config_fn_t fn)
 {
-       return git_config_from_file(fn, git_path("config"));
+       const char *filename = git_path("config");
+       /* Forward-compatibility cue: $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. */
+       if (getenv("GIT_CONFIG")) {
+               filename = getenv("GIT_CONFIG");
+       } else if (getenv("GIT_CONFIG_LOCAL")) {
+               filename = getenv("GIT_CONFIG_LOCAL");
+       }
+       return git_config_from_file(fn, filename);
 }
 
 /*
@@ -536,7 +546,7 @@ int git_config_set_multivar(const char* key, const char* value,
         * contents of .git/config will be written into it.
         */
        fd = open(lock_file, O_WRONLY | O_CREAT | O_EXCL, 0666);
-       if (fd < 0) {
+       if (fd < 0 || adjust_shared_perm(lock_file)) {
                fprintf(stderr, "could not lock config file\n");
                free(store.key);
                ret = -1;