Skip to content

Commit

Permalink
git credential fill: output the whole 'struct credential'
Browse files Browse the repository at this point in the history
Instead of outputing only the username and password, print all the
attributes, even those that already appeared in the input.

This is closer to what the C API does, and allows one to take the exact
output of "git credential fill" as input to "git credential approve" or
"git credential reject".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Matthieu Moy authored and Junio C Hamano committed Jun 25, 2012
1 parent e30b2fe commit 2d6dc18
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 9 deletions.
16 changes: 12 additions & 4 deletions Documentation/git-credential.txt
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,20 @@ infomation it has):

2. Ask git-credential to give us a username and password for this
description. This is done by running `git credential fill`,
feeding the description from step (1) to its standard input. The
credential will be produced on standard output, like:
feeding the description from step (1) to its standard input. The complete
credential description (including the credential per se, i.e. the
login and password) will be produced on standard output, like:

protocol=https
host=example.com
username=bob
password=secr3t
+
In most cases, this means the attributes given in the input will be
repeated in the output, but git may also modify the credential
description, for example by removing the `path` attribute when the
protocol is HTTP(s) and `credential.useHttpPath` is false.
+
If the `git credential` knew about the password, this step may
not have involved the user actually typing this password (the
user may have typed a password to unlock the keychain instead,
Expand All @@ -86,8 +94,8 @@ unlocked) before it returned `password=secr3t`.
was rejected during the operation, use the "reject" action so
that `git credential` will ask for a new password in its next
invocation. In either case, `git credential` should be fed with
the credential description obtained from step (2) together with
the ones already provided in step (1).
the credential description obtained from step (2) (which also
contain the ones provided in step (1)).

[[IOFMT]]
INPUT/OUTPUT FORMAT
Expand Down
5 changes: 1 addition & 4 deletions builtin/credential.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@ int cmd_credential(int argc, const char **argv, const char *prefix)

if (!strcmp(op, "fill")) {
credential_fill(&c);
if (c.username)
printf("username=%s\n", c.username);
if (c.password)
printf("password=%s\n", c.password);
credential_write(&c, stdout);
} else if (!strcmp(op, "approve")) {
credential_approve(&c);
} else if (!strcmp(op, "reject")) {
Expand Down
2 changes: 1 addition & 1 deletion credential.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ static void credential_write_item(FILE *fp, const char *key, const char *value)
fprintf(fp, "%s=%s\n", key, value);
}

static void credential_write(const struct credential *c, FILE *fp)
void credential_write(const struct credential *c, FILE *fp)
{
credential_write_item(fp, "protocol", c->protocol);
credential_write_item(fp, "host", c->host);
Expand Down
1 change: 1 addition & 0 deletions credential.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ void credential_approve(struct credential *);
void credential_reject(struct credential *);

int credential_read(struct credential *, FILE *);
void credential_write(const struct credential *, FILE *);
void credential_from_url(struct credential *, const char *url);
int credential_match(const struct credential *have,
const struct credential *want);
Expand Down
25 changes: 25 additions & 0 deletions t/lib-credential.sh
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ helper_test() {
protocol=https
host=example.com
--
protocol=https
host=example.com
username=askpass-username
password=askpass-password
--
Expand All @@ -84,6 +86,8 @@ helper_test() {
protocol=https
host=example.com
--
protocol=https
host=example.com
username=store-user
password=store-pass
--
Expand All @@ -95,6 +99,8 @@ helper_test() {
protocol=http
host=example.com
--
protocol=http
host=example.com
username=askpass-username
password=askpass-password
--
Expand All @@ -108,6 +114,8 @@ helper_test() {
protocol=https
host=other.tld
--
protocol=https
host=other.tld
username=askpass-username
password=askpass-password
--
Expand All @@ -122,6 +130,8 @@ helper_test() {
host=example.com
username=other
--
protocol=https
host=example.com
username=other
password=askpass-password
--
Expand All @@ -143,6 +153,9 @@ helper_test() {
host=path.tld
path=bar.git
--
protocol=http
host=path.tld
path=bar.git
username=askpass-username
password=askpass-password
--
Expand All @@ -160,6 +173,8 @@ helper_test() {
protocol=https
host=example.com
--
protocol=https
host=example.com
username=askpass-username
password=askpass-password
--
Expand All @@ -186,6 +201,8 @@ helper_test() {
host=example.com
username=user1
--
protocol=https
host=example.com
username=user1
password=pass1
EOF
Expand All @@ -194,6 +211,8 @@ helper_test() {
host=example.com
username=user2
--
protocol=https
host=example.com
username=user2
password=pass2
EOF
Expand All @@ -210,6 +229,8 @@ helper_test() {
host=example.com
username=user1
--
protocol=https
host=example.com
username=user1
password=askpass-password
--
Expand All @@ -223,6 +244,8 @@ helper_test() {
host=example.com
username=user2
--
protocol=https
host=example.com
username=user2
password=pass2
EOF
Expand All @@ -244,6 +267,8 @@ helper_test_timeout() {
protocol=https
host=timeout.tld
--
protocol=https
host=timeout.tld
username=askpass-username
password=askpass-password
--
Expand Down
14 changes: 14 additions & 0 deletions t/t0300-credentials.sh
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ test_expect_success 'credential_fill passes along metadata' '
host=example.com
path=foo.git
--
protocol=ftp
host=example.com
path=foo.git
username=one
password=two
--
Expand Down Expand Up @@ -213,6 +216,8 @@ test_expect_success 'match configured credential' '
host=example.com
path=repo.git
--
protocol=https
host=example.com
username=foo
password=bar
--
Expand All @@ -225,6 +230,8 @@ test_expect_success 'do not match configured credential' '
protocol=https
host=bar
--
protocol=https
host=bar
username=askpass-username
password=askpass-password
--
Expand All @@ -239,6 +246,8 @@ test_expect_success 'pull username from config' '
protocol=https
host=example.com
--
protocol=https
host=example.com
username=foo
password=askpass-password
--
Expand All @@ -252,6 +261,8 @@ test_expect_success 'http paths can be part of context' '
host=example.com
path=foo.git
--
protocol=https
host=example.com
username=foo
password=bar
--
Expand All @@ -265,6 +276,9 @@ test_expect_success 'http paths can be part of context' '
host=example.com
path=foo.git
--
protocol=https
host=example.com
path=foo.git
username=foo
password=bar
--
Expand Down

0 comments on commit 2d6dc18

Please sign in to comment.