Fix setting config variables with an alternative GIT_CONFIG
When setting a config variable, git_config_set() ignored the variables GIT_CONFIG and GIT_CONFIG_LOCAL. Now, when GIT_CONFIG_LOCAL is set, it will write to that file. If not, GIT_CONFIG is checked, and only as a fallback, the change is written to $GIT_DIR/config. Add a test for it, and also future-proof the test for the upcoming $HOME/.gitconfig support. Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
7f29f7a95c
commit
9c3796fc04
15
config.c
15
config.c
@ -500,10 +500,19 @@ int git_config_set_multivar(const char* key, const char* value,
|
|||||||
int i, dot;
|
int i, dot;
|
||||||
int fd = -1, in_fd;
|
int fd = -1, in_fd;
|
||||||
int ret;
|
int ret;
|
||||||
char* config_filename = strdup(git_path("config"));
|
char* config_filename;
|
||||||
char* lock_file = strdup(git_path("config.lock"));
|
char* lock_file;
|
||||||
const char* last_dot = strrchr(key, '.');
|
const char* last_dot = strrchr(key, '.');
|
||||||
|
|
||||||
|
config_filename = getenv("GIT_CONFIG");
|
||||||
|
if (!config_filename) {
|
||||||
|
config_filename = getenv("GIT_CONFIG_LOCAL");
|
||||||
|
if (!config_filename)
|
||||||
|
config_filename = git_path("config");
|
||||||
|
}
|
||||||
|
config_filename = strdup(config_filename);
|
||||||
|
lock_file = strdup(mkpath("%s.lock", config_filename));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since "key" actually contains the section name and the real
|
* Since "key" actually contains the section name and the real
|
||||||
* key name separated by a dot, we have to know where the dot is.
|
* key name separated by a dot, we have to know where the dot is.
|
||||||
@ -610,7 +619,7 @@ int git_config_set_multivar(const char* key, const char* value,
|
|||||||
* As a side effect, we make sure to transform only a valid
|
* As a side effect, we make sure to transform only a valid
|
||||||
* existing config file.
|
* existing config file.
|
||||||
*/
|
*/
|
||||||
if (git_config(store_aux)) {
|
if (git_config_from_file(store_aux, config_filename)) {
|
||||||
fprintf(stderr, "invalid config file\n");
|
fprintf(stderr, "invalid config file\n");
|
||||||
free(store.key);
|
free(store.key);
|
||||||
if (store.value_regex != NULL) {
|
if (store.value_regex != NULL) {
|
||||||
|
@ -19,7 +19,7 @@ endif
|
|||||||
all: $(T) clean
|
all: $(T) clean
|
||||||
|
|
||||||
$(T):
|
$(T):
|
||||||
@echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
|
@echo "*** $@ ***"; GIT_CONFIG=.git/config '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -fr trash
|
rm -fr trash
|
||||||
|
@ -309,5 +309,29 @@ EOF
|
|||||||
|
|
||||||
test_expect_success 'new variable inserts into proper section' 'cmp .git/config expect'
|
test_expect_success 'new variable inserts into proper section' 'cmp .git/config expect'
|
||||||
|
|
||||||
|
cat > other-config << EOF
|
||||||
|
[ein]
|
||||||
|
bahn = strasse
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > expect << EOF
|
||||||
|
ein.bahn=strasse
|
||||||
|
EOF
|
||||||
|
|
||||||
|
GIT_CONFIG=other-config git-repo-config -l > output
|
||||||
|
|
||||||
|
test_expect_success 'alternative GIT_CONFIG' 'cmp output expect'
|
||||||
|
|
||||||
|
GIT_CONFIG=other-config git-repo-config anwohner.park ausweis
|
||||||
|
|
||||||
|
cat > expect << EOF
|
||||||
|
[ein]
|
||||||
|
bahn = strasse
|
||||||
|
[anwohner]
|
||||||
|
park = ausweis
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success '--set in alternative GIT_CONFIG' 'cmp other-config expect'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user