Browse Source

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>
maint
Johannes Schindelin 19 years ago committed by Junio C Hamano
parent
commit
9c3796fc04
  1. 15
      config.c
  2. 2
      t/Makefile
  3. 24
      t/t1300-repo-config.sh

15
config.c

@ -500,10 +500,19 @@ int git_config_set_multivar(const char* key, const char* value, @@ -500,10 +500,19 @@ int git_config_set_multivar(const char* key, const char* value,
int i, dot;
int fd = -1, in_fd;
int ret;
char* config_filename = strdup(git_path("config"));
char* lock_file = strdup(git_path("config.lock"));
char* config_filename;
char* lock_file;
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
* 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, @@ -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
* existing config file.
*/
if (git_config(store_aux)) {
if (git_config_from_file(store_aux, config_filename)) {
fprintf(stderr, "invalid config file\n");
free(store.key);
if (store.value_regex != NULL) {

2
t/Makefile

@ -19,7 +19,7 @@ endif @@ -19,7 +19,7 @@ endif
all: $(T) clean

$(T):
@echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
@echo "*** $@ ***"; GIT_CONFIG=.git/config '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)

clean:
rm -fr trash

24
t/t1300-repo-config.sh

@ -309,5 +309,29 @@ EOF @@ -309,5 +309,29 @@ EOF

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


Loading…
Cancel
Save