refactor git_getpass into generic prompt function
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 <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		
				
					committed by
					
						
						Junio C Hamano
					
				
			
			
				
	
			
			
			
						parent
						
							d3c58b83ae
						
					
				
				
					commit
					1cb0134f34
				
			
							
								
								
									
										46
									
								
								prompt.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								prompt.c
									
									
									
									
									
								
							@ -3,26 +3,13 @@
 | 
				
			|||||||
#include "strbuf.h"
 | 
					#include "strbuf.h"
 | 
				
			||||||
#include "prompt.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;
 | 
						struct child_process pass;
 | 
				
			||||||
	const char *args[3];
 | 
						const char *args[3];
 | 
				
			||||||
	static struct strbuf buffer = STRBUF_INIT;
 | 
						static struct strbuf buffer = STRBUF_INIT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	askpass = getenv("GIT_ASKPASS");
 | 
						args[0] = cmd;
 | 
				
			||||||
	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[1]	= prompt;
 | 
						args[1]	= prompt;
 | 
				
			||||||
	args[2] = NULL;
 | 
						args[2] = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -35,7 +22,7 @@ char *git_getpass(const char *prompt)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	strbuf_reset(&buffer);
 | 
						strbuf_reset(&buffer);
 | 
				
			||||||
	if (strbuf_read(&buffer, pass.out, 20) < 0)
 | 
						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);
 | 
						close(pass.out);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -46,3 +33,30 @@ char *git_getpass(const char *prompt)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return buffer.buf;
 | 
						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
									
								
								prompt.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								prompt.h
									
									
									
									
									
								
							@ -1,6 +1,9 @@
 | 
				
			|||||||
#ifndef PROMPT_H
 | 
					#ifndef PROMPT_H
 | 
				
			||||||
#define PROMPT_H
 | 
					#define PROMPT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PROMPT_ASKPASS (1<<0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char *git_prompt(const char *prompt, int flags);
 | 
				
			||||||
char *git_getpass(const char *prompt);
 | 
					char *git_getpass(const char *prompt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* PROMPT_H */
 | 
					#endif /* PROMPT_H */
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user