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') } | sub html_path { command_oneline('--html-path') } | ||||||
|  |  | ||||||
| =item prompt ( PROMPT ) | =item prompt ( PROMPT , ISPASSWORD  ) | ||||||
|  |  | ||||||
| Query user C<PROMPT> and return answer from user. | Query user C<PROMPT> and return answer from user. | ||||||
|  |  | ||||||
| Honours GIT_ASKPASS and SSH_ASKPASS environment variables for querying | Honours GIT_ASKPASS and SSH_ASKPASS environment variables for querying | ||||||
| the user. If no *_ASKPASS variable is set or an error occoured, | the user. If no *_ASKPASS variable is set or an error occoured, | ||||||
| the terminal is tried as a fallback. | the terminal is tried as a fallback. | ||||||
|  | If C<ISPASSWORD> is set and true, the terminal disables echo. | ||||||
|  |  | ||||||
| =cut | =cut | ||||||
|  |  | ||||||
| sub prompt { | sub prompt { | ||||||
| 	my ($prompt) = @_; | 	my ($prompt, $isPassword) = @_; | ||||||
| 	my $ret; | 	my $ret; | ||||||
| 	if (exists $ENV{'GIT_ASKPASS'}) { | 	if (exists $ENV{'GIT_ASKPASS'}) { | ||||||
| 		$ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt); | 		$ret = _prompt($ENV{'GIT_ASKPASS'}, $prompt); | ||||||
|  | @ -533,6 +534,7 @@ sub prompt { | ||||||
| 	if (!defined $ret) { | 	if (!defined $ret) { | ||||||
| 		print STDERR $prompt; | 		print STDERR $prompt; | ||||||
| 		STDERR->flush; | 		STDERR->flush; | ||||||
|  | 		if (defined $isPassword && $isPassword) { | ||||||
| 			require Term::ReadKey; | 			require Term::ReadKey; | ||||||
| 			Term::ReadKey::ReadMode('noecho'); | 			Term::ReadKey::ReadMode('noecho'); | ||||||
| 			$ret = ''; | 			$ret = ''; | ||||||
|  | @ -543,6 +545,9 @@ sub prompt { | ||||||
| 			Term::ReadKey::ReadMode('restore'); | 			Term::ReadKey::ReadMode('restore'); | ||||||
| 			print STDERR "\n"; | 			print STDERR "\n"; | ||||||
| 			STDERR->flush; | 			STDERR->flush; | ||||||
|  | 		} else { | ||||||
|  | 			chomp($ret = <STDIN>); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	return $ret; | 	return $ret; | ||||||
| } | } | ||||||
|  | @ -550,6 +555,7 @@ sub prompt { | ||||||
| sub _prompt { | sub _prompt { | ||||||
| 	my ($askpass, $prompt) = @_; | 	my ($askpass, $prompt) = @_; | ||||||
| 	return unless length $askpass; | 	return unless length $askpass; | ||||||
|  | 	$prompt =~ s/\n/ /g; | ||||||
| 	my $ret; | 	my $ret; | ||||||
| 	open my $fh, "-|", $askpass, $prompt or return; | 	open my $fh, "-|", $askpass, $prompt or return; | ||||||
| 	$ret = <$fh>; | 	$ret = <$fh>; | ||||||
|  |  | ||||||
|  | @ -62,16 +62,16 @@ sub ssl_server_trust { | ||||||
| 	                               issuer_dname fingerprint); | 	                               issuer_dname fingerprint); | ||||||
| 	my $choice; | 	my $choice; | ||||||
| prompt: | prompt: | ||||||
| 	print STDERR $may_save ? | 	my $options = $may_save ? | ||||||
| 	      "(R)eject, accept (t)emporarily or accept (p)ermanently? " : | 	      "(R)eject, accept (t)emporarily or accept (p)ermanently? " : | ||||||
| 	      "(R)eject or accept (t)emporarily? "; | 	      "(R)eject or accept (t)emporarily? "; | ||||||
| 	STDERR->flush; | 	STDERR->flush; | ||||||
| 	$choice = lc(substr(<STDIN> || 'R', 0, 1)); | 	$choice = lc(substr(Git::prompt("Certificate problem.\n" . $options) || 'R', 0, 1)); | ||||||
| 	if ($choice =~ /^t$/i) { | 	if ($choice eq 't') { | ||||||
| 		$cred->may_save(undef); | 		$cred->may_save(undef); | ||||||
| 	} elsif ($choice =~ /^r$/i) { | 	} elsif ($choice eq 'r') { | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} elsif ($may_save && $choice =~ /^p$/i) { | 	} elsif ($may_save && $choice eq 'p') { | ||||||
| 		$cred->may_save($may_save); | 		$cred->may_save($may_save); | ||||||
| 	} else { | 	} else { | ||||||
| 		goto prompt; | 		goto prompt; | ||||||
|  | @ -109,9 +109,7 @@ sub username { | ||||||
| 	if (defined $_username) { | 	if (defined $_username) { | ||||||
| 		$username = $_username; | 		$username = $_username; | ||||||
| 	} else { | 	} else { | ||||||
| 		print STDERR "Username: "; | 		$username = Git::prompt("Username: "); | ||||||
| 		STDERR->flush; |  | ||||||
| 		chomp($username = <STDIN>); |  | ||||||
| 	} | 	} | ||||||
| 	$cred->username($username); | 	$cred->username($username); | ||||||
| 	$cred->may_save($may_save); | 	$cred->may_save($may_save); | ||||||
|  | @ -120,7 +118,7 @@ sub username { | ||||||
|  |  | ||||||
| sub _read_password { | sub _read_password { | ||||||
| 	my ($prompt, $realm) = @_; | 	my ($prompt, $realm) = @_; | ||||||
| 	my $password = Git::prompt($prompt); | 	my $password = Git::prompt($prompt, 1); | ||||||
| 	$password; | 	$password; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Sven Strickroth
						Sven Strickroth