diff --git a/credential.c b/credential.c index f33c66f126..907b90bad1 100644 --- a/credential.c +++ b/credential.c @@ -4,6 +4,43 @@ #include "string-list.h" #include "run-command.h" +static int credential_config_callback(const char *var, const char *value, + void *data) +{ + struct credential *c = data; + + if (!value) + return 0; + + var = skip_prefix(var, "credential."); + if (!var) + return 0; + + var = skip_prefix(var, c->unique); + if (!var) + return 0; + + if (*var != '.') + return 0; + var++; + + if (!strcmp(var, "username")) { + if (!c->username) + c->username = xstrdup(value); + } + else if (!strcmp(var, "password")) { + free(c->password); + c->password = xstrdup(value); + } + return 0; +} + +void credential_from_config(struct credential *c) +{ + if (c->unique) + git_config(credential_config_callback, c); +} + static char *credential_ask_one(const char *what, const char *desc) { struct strbuf prompt = STRBUF_INIT; @@ -26,6 +63,7 @@ static char *credential_ask_one(const char *what, const char *desc) int credential_getpass(struct credential *c) { + credential_from_config(c); if (!c->username) c->username = credential_ask_one("Username", c->description); diff --git a/credential.h b/credential.h index 383b720bb5..30a0156c0f 100644 --- a/credential.h +++ b/credential.h @@ -11,6 +11,7 @@ struct credential { struct string_list; int credential_getpass(struct credential *); +void credential_from_config(struct credential *); int credential_fill_gently(struct credential *, const struct string_list *methods); void credential_fill(struct credential *, const struct string_list *methods); diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh index 447e98339e..68d838c26d 100755 --- a/t/t0300-credentials.sh +++ b/t/t0300-credentials.sh @@ -172,4 +172,14 @@ test_expect_success 'internal getpass does not ask for known username' ' EOF ' +test_expect_success 'internal getpass can pull from config' ' + git config credential.foo.username configured-username + check --unique=foo <<-\EOF + username=configured-username + password=askpass-result + -- + askpass: Password: + EOF +' + test_done diff --git a/t/t5550-http-fetch.sh b/t/t5550-http-fetch.sh index af3bc6bad4..c78baaf345 100755 --- a/t/t5550-http-fetch.sh +++ b/t/t5550-http-fetch.sh @@ -85,6 +85,14 @@ test_expect_success 'http auth can request both user and pass' ' test_cmp askpass-expect-both askpass-query ' +test_expect_success 'http auth can pull user from config' ' + >askpass-query && + echo user@host >askpass-response && + git config --global credential.$HTTPD_PROTO:$HTTPD_DEST.username user@host && + git clone "$HTTPD_URL/auth/repo.git" clone-auth-config && + test_cmp askpass-expect-pass askpass-query +' + test_expect_success 'fetch changes via http' ' echo content >>file && git commit -a -m two &&