git-svn, perl/Git.pm: extend and use Git->prompt method for querying users
git-svn reads usernames and other user queries from an interactive terminal. This cause GUIs (w/o STDIN connected) to hang waiting forever for git-svn to complete (http://code.google.com/p/tortoisegit/issues/detail?id=967). This change extends the Git::prompt helper, so that it can also be used for non password queries, and makes use of it instead of using hand-rolled prompt-response code that only works with the interactive terminal. Signed-off-by: Sven Strickroth <email@cs-ware.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									8f3cab2b4d
								
							
						
					
					
						commit
						e9263e4580
					
				
							
								
								
									
										10
									
								
								perl/Git.pm
								
								
								
								
							
							
						
						
									
										10
									
								
								perl/Git.pm
								
								
								
								
							|  | @ -511,18 +511,19 @@ C<git --html-path>). Useful mostly only internally. | |||
|  | ||||
| sub html_path { command_oneline('--html-path') } | ||||
|  | ||||
| =item prompt ( PROMPT ) | ||||
| =item prompt ( PROMPT , ISPASSWORD  ) | ||||
|  | ||||
| Query user C<PROMPT> and return answer from user. | ||||
|  | ||||
| Honours GIT_ASKPASS and SSH_ASKPASS environment variables for querying | ||||
| the user. If no *_ASKPASS variable is set or an error occoured, | ||||
| the terminal is tried as a fallback. | ||||
| If C<ISPASSWORD> is set and true, the terminal disables echo. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub prompt { | ||||
| 	my ($prompt) = @_; | ||||
| 	my ($prompt, $isPassword) = @_; | ||||
| 	my $ret; | ||||
| 	if (exists $ENV{'GIT_ASKPASS'}) { | ||||
| 		$ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt); | ||||
|  | @ -533,6 +534,7 @@ sub prompt { | |||
| 	if (!defined $ret) { | ||||
| 		print STDERR $prompt; | ||||
| 		STDERR->flush; | ||||
| 		if (defined $isPassword && $isPassword) { | ||||
| 			require Term::ReadKey; | ||||
| 			Term::ReadKey::ReadMode('noecho'); | ||||
| 			$ret = ''; | ||||
|  | @ -543,6 +545,9 @@ sub prompt { | |||
| 			Term::ReadKey::ReadMode('restore'); | ||||
| 			print STDERR "\n"; | ||||
| 			STDERR->flush; | ||||
| 		} else { | ||||
| 			chomp($ret = <STDIN>); | ||||
| 		} | ||||
| 	} | ||||
| 	return $ret; | ||||
| } | ||||
|  | @ -550,6 +555,7 @@ sub prompt { | |||
| sub _prompt { | ||||
| 	my ($askpass, $prompt) = @_; | ||||
| 	return unless length $askpass; | ||||
| 	$prompt =~ s/\n/ /g; | ||||
| 	my $ret; | ||||
| 	open my $fh, "-|", $askpass, $prompt or return; | ||||
| 	$ret = <$fh>; | ||||
|  |  | |||
|  | @ -62,16 +62,16 @@ sub ssl_server_trust { | |||
| 	                               issuer_dname fingerprint); | ||||
| 	my $choice; | ||||
| prompt: | ||||
| 	print STDERR $may_save ? | ||||
| 	my $options = $may_save ? | ||||
| 	      "(R)eject, accept (t)emporarily or accept (p)ermanently? " : | ||||
| 	      "(R)eject or accept (t)emporarily? "; | ||||
| 	STDERR->flush; | ||||
| 	$choice = lc(substr(<STDIN> || 'R', 0, 1)); | ||||
| 	if ($choice =~ /^t$/i) { | ||||
| 	$choice = lc(substr(Git::prompt("Certificate problem.\n" . $options) || 'R', 0, 1)); | ||||
| 	if ($choice eq 't') { | ||||
| 		$cred->may_save(undef); | ||||
| 	} elsif ($choice =~ /^r$/i) { | ||||
| 	} elsif ($choice eq 'r') { | ||||
| 		return -1; | ||||
| 	} elsif ($may_save && $choice =~ /^p$/i) { | ||||
| 	} elsif ($may_save && $choice eq 'p') { | ||||
| 		$cred->may_save($may_save); | ||||
| 	} else { | ||||
| 		goto prompt; | ||||
|  | @ -109,9 +109,7 @@ sub username { | |||
| 	if (defined $_username) { | ||||
| 		$username = $_username; | ||||
| 	} else { | ||||
| 		print STDERR "Username: "; | ||||
| 		STDERR->flush; | ||||
| 		chomp($username = <STDIN>); | ||||
| 		$username = Git::prompt("Username: "); | ||||
| 	} | ||||
| 	$cred->username($username); | ||||
| 	$cred->may_save($may_save); | ||||
|  | @ -120,7 +118,7 @@ sub username { | |||
|  | ||||
| sub _read_password { | ||||
| 	my ($prompt, $realm) = @_; | ||||
| 	my $password = Git::prompt($prompt); | ||||
| 	my $password = Git::prompt($prompt, 1); | ||||
| 	$password; | ||||
| } | ||||
|  | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Sven Strickroth
						Sven Strickroth