Skip to content

Commit

Permalink
refactor git_getpass into generic prompt function
Browse files Browse the repository at this point in the history
This will allow callers to specify more options (e.g.,
leaving echo on). The original git_getpass becomes a slim
wrapper around the new function.

Signed-off-by: Jeff King <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
peff authored and gitster committed Dec 13, 2011
1 parent d3c58b8 commit 1cb0134
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 16 deletions.
46 changes: 30 additions & 16 deletions prompt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,13 @@
#include "strbuf.h"
#include "prompt.h"

char *git_getpass(const char *prompt)
static char *do_askpass(const char *cmd, const char *prompt)
{
const char *askpass;
struct child_process pass;
const char *args[3];
static struct strbuf buffer = STRBUF_INIT;

askpass = getenv("GIT_ASKPASS");
if (!askpass)
askpass = askpass_program;
if (!askpass)
askpass = getenv("SSH_ASKPASS");
if (!askpass || !(*askpass)) {
char *result = getpass(prompt);
if (!result)
die_errno("Could not read password");
return result;
}

args[0] = askpass;
args[0] = cmd;
args[1] = prompt;
args[2] = NULL;

Expand All @@ -35,7 +22,7 @@ char *git_getpass(const char *prompt)

strbuf_reset(&buffer);
if (strbuf_read(&buffer, pass.out, 20) < 0)
die("failed to read password from %s\n", askpass);
die("failed to get '%s' from %s\n", prompt, cmd);

close(pass.out);

Expand All @@ -46,3 +33,30 @@ char *git_getpass(const char *prompt)

return buffer.buf;
}

char *git_prompt(const char *prompt, int flags)
{
char *r;

if (flags & PROMPT_ASKPASS) {
const char *askpass;

askpass = getenv("GIT_ASKPASS");
if (!askpass)
askpass = askpass_program;
if (!askpass)
askpass = getenv("SSH_ASKPASS");
if (askpass && *askpass)
return do_askpass(askpass, prompt);
}

r = getpass(prompt);
if (!r)
die_errno("could not read '%s'", prompt);
return r;
}

char *git_getpass(const char *prompt)
{
return git_prompt(prompt, PROMPT_ASKPASS);
}
3 changes: 3 additions & 0 deletions prompt.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#ifndef PROMPT_H
#define PROMPT_H

#define PROMPT_ASKPASS (1<<0)

char *git_prompt(const char *prompt, int flags);
char *git_getpass(const char *prompt);

#endif /* PROMPT_H */

0 comments on commit 1cb0134

Please sign in to comment.