On Sun, Jun 24, 2012 at 3:35 PM, Erik Faye-Lund <kusmabite@xxxxxxxxx> wrote: > Without /dev/tty support, git_terminal_prompt simply ignores the > 'echo'-parameter. On Windows we can do better by clevering up our > getpass-implementation a bit so it can conditionally echo. > > While we're at it, plug a small memory-leak by returning a pointer > to a static strbuf instead of detaching it. This is the same thing > the /dev/tty-version of git_terminal_prompt does, and the callee > doesn't expect to have to free it's memory. > > Signed-off-by: Erik Faye-Lund <kusmabite@xxxxxxxxx> > --- > compat/mingw.c | 15 --------------- > compat/mingw.h | 2 -- > compat/terminal.c | 20 ++++++++++++++++++++ > 3 files changed, 20 insertions(+), 17 deletions(-) > > diff --git a/compat/mingw.c b/compat/mingw.c > index afc892d..56ab74c 100644 > --- a/compat/mingw.c > +++ b/compat/mingw.c > @@ -1699,21 +1699,6 @@ int link(const char *oldpath, const char *newpath) > return 0; > } > > -char *getpass(const char *prompt) > -{ > - struct strbuf buf = STRBUF_INIT; > - > - fputs(prompt, stderr); > - for (;;) { > - char c = _getch(); > - if (c == '\r' || c == '\n') > - break; > - strbuf_addch(&buf, c); > - } > - fputs("\n", stderr); > - return strbuf_detach(&buf, NULL); > -} > - > pid_t waitpid(pid_t pid, int *status, int options) > { > HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION, > diff --git a/compat/mingw.h b/compat/mingw.h > index 61a6521..5e64a98 100644 > --- a/compat/mingw.h > +++ b/compat/mingw.h > @@ -55,8 +55,6 @@ struct passwd { > char *pw_dir; > }; > > -extern char *getpass(const char *prompt); > - > typedef void (__cdecl *sig_handler_t)(int); > struct sigaction { > sig_handler_t sa_handler; > diff --git a/compat/terminal.c b/compat/terminal.c > index 6d16c8f..53c5166 100644 > --- a/compat/terminal.c > +++ b/compat/terminal.c > @@ -71,6 +71,26 @@ char *git_terminal_prompt(const char *prompt, int echo) > return buf.buf; > } > > +#elif defined(WIN32) > + > +char *git_terminal_prompt(const char *prompt, int echo) > +{ > + static struct strbuf buf = STRBUF_INIT; > + > + fputs(prompt, stderr); > + strbuf_reset(&buf); > + for (;;) { > + int c = _getch(); > + if (c == '\n' || c == '\r') > + break; > + if (echo) > + putc(c, stderr); > + strbuf_addch(&buf, c); > + } > + putc('\n', stderr); > + return buf.buf; > +} > + > #else > > char *git_terminal_prompt(const char *prompt, int echo) > -- > 1.7.11.1.27.gdae0dbb > Turns out, this patch is incorrect; _getch is defined in conio.h, which is only included in compat/mingw.c and compat/msvc.c. This patch on top fixes it: diff --git a/compat/mingw.c b/compat/mingw.c index 56ab74c..d7d4aea 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -1,6 +1,5 @@ #include "../git-compat-util.h" #include "win32.h" -#include <conio.h> #include "../strbuf.h" #include "../run-command.h" diff --git a/compat/msvc.c b/compat/msvc.c index 71843d7..a3a4e0e 100644 --- a/compat/msvc.c +++ b/compat/msvc.c @@ -1,6 +1,5 @@ #include "../git-compat-util.h" #include "win32.h" -#include <conio.h> #include "../strbuf.h" #include "mingw.c" diff --git a/git-compat-util.h b/git-compat-util.h index 5bd9ad7..fa3e1a9 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -88,6 +88,7 @@ #define WIN32_LEAN_AND_MEAN /* stops windows.h including winsock.h */ #include <winsock2.h> #include <windows.h> +#include <conio.h> #endif #include <unistd.h> -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html