Sorry, this patch is damaged. I'm moving to `git send-email` now. -Kyle On Fri, Sep 28, 2018 at 11:10 AM Kyle Hubert <khubert@xxxxxxxxx> wrote: > > When calling the Git Credential Helper that is set in the git config, > the get command can return a credential. Git immediately turns around > and calls the store command, even though that credential was just > retrieved by the Helper. This creates two side effects. First of all, > if the Helper requires a passphrase, the user has to type it in > twice. Secondly, if the user has a number of helpers, this retrieves > the credential from one service and writes it to all services. > > This commit introduces a new field in the credential struct that > detects when the credential was retrieved using the Helper, and early > exits when called to store the credential. > --- > credential.c | 8 +++++++- > credential.h | 3 ++- > 2 files changed, 9 insertions(+), 2 deletions(-) > > diff --git a/credential.c b/credential.c > index 62be651b0..79bf62d49 100644 > --- a/credential.c > +++ b/credential.c > @@ -280,8 +280,10 @@ void credential_fill(struct credential *c) > > for (i = 0; i < c->helpers.nr; i++) { > credential_do(c, c->helpers.items[i].string, "get"); > - if (c->username && c->password) > + if (c->username && c->password) { > + c->retrieved = 1; > return; > + } > if (c->quit) > die("credential helper '%s' told us to quit", > c->helpers.items[i].string); > @@ -300,6 +302,10 @@ void credential_approve(struct credential *c) > return; > if (!c->username || !c->password) > return; > + if (c->retrieved) { > + c->approved = 1; > + return; > + } > > credential_apply_config(c); > > diff --git a/credential.h b/credential.h > index 6b0cd16be..d99df2f52 100644 > --- a/credential.h > +++ b/credential.h > @@ -8,7 +8,8 @@ struct credential { > unsigned approved:1, > configured:1, > quit:1, > - use_http_path:1; > + use_http_path:1, > + retrieved:1; > > char *username; > char *password;