git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH 0/4] Make git-send-email git-credential
@ 2013-02-06 20:47 Michal Nazarewicz
  2013-02-06 20:47 ` [PATCH 1/4] Git.pm: Allow command_close_bidi_pipe() to be called as method Michal Nazarewicz
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Michal Nazarewicz @ 2013-02-06 20:47 UTC (permalink / raw
  To: Junio C Hamano, Ted Zlatanov, Jeff King, Matthieu Moy; +Cc: git

From: Michal Nazarewicz <mina86@mina86.com>

As discussed on the list, adding git-credential interface to Git.pm
(sort of copied from git-remote-mediawiki) and making git-send-email
use it.

I see git-remote-mediawiki does not have “use Git” so I did not touch
it.  On top of that I'd have no way to tests the changes anyway.

Michal Nazarewicz (4):
  Git.pm: Allow command_close_bidi_pipe() to be called as method
  Git.pm: Allow pipes to be closed prior to calling
    command_close_bidi_pipe
  Git.pm: Add interface for git credential command.
  git-send-email: Use git credential to obtain password.

 Documentation/git-send-email.txt |   4 +-
 git-send-email.perl              |  59 +++++++++++---------
 perl/Git.pm                      | 116 ++++++++++++++++++++++++++++++++++++++-
 3 files changed, 149 insertions(+), 30 deletions(-)

-- 
1.8.1.2.549.g4fa355e

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] Git.pm: Allow command_close_bidi_pipe() to be called as method
  2013-02-06 20:47 [PATCH 0/4] Make git-send-email git-credential Michal Nazarewicz
@ 2013-02-06 20:47 ` Michal Nazarewicz
  2013-02-06 20:47 ` [PATCH 2/4] Git.pm: Allow pipes to be closed prior to calling command_close_bidi_pipe Michal Nazarewicz
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 11+ messages in thread
From: Michal Nazarewicz @ 2013-02-06 20:47 UTC (permalink / raw
  To: Junio C Hamano, Ted Zlatanov, Jeff King, Matthieu Moy; +Cc: git

From: Michal Nazarewicz <mina86@mina86.com>

The documentation of command_close_bidi_pipe() claims that it can
be called as a method, but it does not check whether the first
argument is $self or not assuming the latter.  Using _maybe_self()
fixes this.

Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
---
 perl/Git.pm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/perl/Git.pm b/perl/Git.pm
index 931047c..bbb753a 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -430,7 +430,7 @@ have more complicated structure.
 
 sub command_close_bidi_pipe {
 	local $?;
-	my ($pid, $in, $out, $ctx) = @_;
+	my ($self, $pid, $in, $out, $ctx) = _maybe_self(@_);
 	foreach my $fh ($in, $out) {
 		unless (close $fh) {
 			if ($!) {
-- 
1.8.1.2.549.g4fa355e

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] Git.pm: Allow pipes to be closed prior to calling command_close_bidi_pipe
  2013-02-06 20:47 [PATCH 0/4] Make git-send-email git-credential Michal Nazarewicz
  2013-02-06 20:47 ` [PATCH 1/4] Git.pm: Allow command_close_bidi_pipe() to be called as method Michal Nazarewicz
@ 2013-02-06 20:47 ` Michal Nazarewicz
  2013-02-06 23:04   ` Jeff King
  2013-02-06 20:47 ` [PATCH 3/4] Git.pm: Add interface for git credential command Michal Nazarewicz
  2013-02-06 20:47 ` [PATCH 4/4] git-send-email: Use git credential to obtain password Michal Nazarewicz
  3 siblings, 1 reply; 11+ messages in thread
From: Michal Nazarewicz @ 2013-02-06 20:47 UTC (permalink / raw
  To: Junio C Hamano, Ted Zlatanov, Jeff King, Matthieu Moy; +Cc: git

From: Michal Nazarewicz <mina86@mina86.com>

The command_close_bidi_pipe() function will insist on closing both
input and output pipes returned by command_bidi_pipe().  With this
change it is possible to close one of the pipes in advance and
pass undef as an argument.

This allows for something like:

  my ($pid, $in, $out, $ctx) = command_bidi_pipe(...);
  print $out "write data";
  close $out;
  # ... do stuff with $in
  command_close_bidi_pipe($pid, $in, undef, $ctx);

Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
---
 perl/Git.pm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/perl/Git.pm b/perl/Git.pm
index bbb753a..6a2d52d 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -432,7 +432,7 @@ sub command_close_bidi_pipe {
 	local $?;
 	my ($self, $pid, $in, $out, $ctx) = _maybe_self(@_);
 	foreach my $fh ($in, $out) {
-		unless (close $fh) {
+		if (defined $fh && !close $fh) {
 			if ($!) {
 				carp "error closing pipe: $!";
 			} elsif ($? >> 8) {
-- 
1.8.1.2.549.g4fa355e

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] Git.pm: Add interface for git credential command.
  2013-02-06 20:47 [PATCH 0/4] Make git-send-email git-credential Michal Nazarewicz
  2013-02-06 20:47 ` [PATCH 1/4] Git.pm: Allow command_close_bidi_pipe() to be called as method Michal Nazarewicz
  2013-02-06 20:47 ` [PATCH 2/4] Git.pm: Allow pipes to be closed prior to calling command_close_bidi_pipe Michal Nazarewicz
@ 2013-02-06 20:47 ` Michal Nazarewicz
  2013-02-06 23:16   ` Jeff King
                     ` (2 more replies)
  2013-02-06 20:47 ` [PATCH 4/4] git-send-email: Use git credential to obtain password Michal Nazarewicz
  3 siblings, 3 replies; 11+ messages in thread
From: Michal Nazarewicz @ 2013-02-06 20:47 UTC (permalink / raw
  To: Junio C Hamano, Ted Zlatanov, Jeff King, Matthieu Moy; +Cc: git

From: Michal Nazarewicz <mina86@mina86.com>

Add a credential() function which is an interface to the
git credential command.

Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
---
 perl/Git.pm | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 111 insertions(+), 1 deletion(-)

diff --git a/perl/Git.pm b/perl/Git.pm
index 6a2d52d..5a18921 100644
--- a/perl/Git.pm
+++ b/perl/Git.pm
@@ -59,7 +59,8 @@ require Exporter;
                 command_bidi_pipe command_close_bidi_pipe
                 version exec_path html_path hash_object git_cmd_try
                 remote_refs prompt
-                temp_acquire temp_release temp_reset temp_path);
+                temp_acquire temp_release temp_reset temp_path
+                credential);
 
 
 =head1 DESCRIPTION
@@ -1000,6 +1001,115 @@ sub _close_cat_blob {
 }
 
 
+sub _credential_read {
+	my %credential;
+	my ($reader, $op) = (@_);
+	while (<$reader>) {
+		chomp;
+		my ($key, $value) = /([^=]*)=(.*)/;
+		if (not defined $key) {
+			throw Error::Simple("unable to parse git credential $op response:\n$_\n");
+		}
+		$credential{$key} = $value;
+	}
+	return %credential;
+}
+
+sub _credential_write {
+	my ($credential, $writer) = @_;
+
+	for my $key (sort {
+		# url overwrites other fields, so it must come first
+		return -1 if $a eq 'url';
+		return  1 if $b eq 'url';
+		return $a cmp $b;
+	} keys %$credential) {
+		if (defined $credential->{$key} && length $credential->{$key}) {
+			print $writer $key, '=', $credential->{$key}, "\n";
+		}
+	}
+	print $writer "\n";
+}
+
+sub _credential_run {
+	my ($self, $credential, $op) = _maybe_self(@_);
+
+	my ($pid, $reader, $writer, $ctx) = command_bidi_pipe('credential', $op);
+
+	_credential_write $credential, $writer;
+	close $writer;
+
+	if ($op eq "fill") {
+		%$credential = _credential_read $reader, $op;
+	} elsif (<$reader>) {
+		throw Error::Simple("unexpected output from git credential $op response:\n$_\n");
+	}
+
+	command_close_bidi_pipe($pid, $reader, undef, $ctx);
+}
+
+=item credential( CREDENTIAL_HASH [, OPERATION ] )
+
+=item credential( CREDENTIAL_HASH, CODE )
+
+Executes C<git credential> for a given set of credentials and
+specified operation.  In both form C<CREDENTIAL_HASH> needs to be
+a reference to a hash which stores credentials.  Under certain
+conditions the hash can change.
+
+In the first form, C<OPERATION> can be C<'fill'> (or omitted),
+C<'approve'> or C<'reject'>, and function will execute corresponding
+C<git credential> sub-command.  In case of C<'fill'> the values stored
+in C<CREDENTIAL_HASH> will be changed to the ones returned by the
+C<git credential> command.  The usual usage would look something like:
+
+	my %cred = (
+		'protocol' => 'https',
+		'host' => 'example.com',
+		'username' => 'bob'
+	);
+	Git::credential \%cred;
+	if (try_to_authenticate($cred{'username'}, $cred{'password'})) {
+		Git::credential \%cred, 'approve';
+		... do more stuff ...
+	} else {
+		Git::credential \%cred, 'reject';
+	}
+
+In the second form, C<CODE> needs to be a reference to a subroutine.
+The function will execute C<git credential fill> to fill provided
+credential hash, than call C<CODE> with C<CREDENTIAL> as the sole
+argument, and finally depending on C<CODE>'s return value execute
+C<git credential approve> (if return value yields true) or C<git
+credential reject> (otherwise).  The return value is the same as what
+C<CODE> returned.  With this form, the usage might look as follows:
+
+	if (Git::credential {
+		'protocol' => 'https',
+		'host' => 'example.com',
+		'username' => 'bob'
+	}, sub {
+		my $cred = shift;
+		return try_to_authenticate($cred->{'username'}, $cred->{'password'});
+	}) {
+		... do more stuff ...
+	}
+
+=cut
+
+sub credential {
+	my ($self, $credential, $op_or_code) = (_maybe_self(@_), 'fill');
+
+	if ('CODE' eq ref $op_or_code) {
+		_credential_run $credential, 'fill';
+		my $ret = $op_or_code->($credential);
+		_credential_run $credential, $ret ? 'approve' : 'reject';
+		return $ret;
+	} else {
+		_credential_run $credential, $op_or_code;
+	}
+}
+
 { # %TEMP_* Lexical Context
 
 my (%TEMP_FILEMAP, %TEMP_FILES);
-- 
1.8.1.2.549.g4fa355e

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] git-send-email: Use git credential to obtain password.
  2013-02-06 20:47 [PATCH 0/4] Make git-send-email git-credential Michal Nazarewicz
                   ` (2 preceding siblings ...)
  2013-02-06 20:47 ` [PATCH 3/4] Git.pm: Add interface for git credential command Michal Nazarewicz
@ 2013-02-06 20:47 ` Michal Nazarewicz
  2013-02-06 23:19   ` Jeff King
  3 siblings, 1 reply; 11+ messages in thread
From: Michal Nazarewicz @ 2013-02-06 20:47 UTC (permalink / raw
  To: Junio C Hamano, Ted Zlatanov, Jeff King, Matthieu Moy; +Cc: git

From: Michal Nazarewicz <mina86@mina86.com>

If smtp_user is provided but smtp_pass is not, instead of prompting
for password, make git-send-email use git credential command
instead.

Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
---
 Documentation/git-send-email.txt |  4 +--
 git-send-email.perl              | 59 +++++++++++++++++++++++-----------------
 2 files changed, 36 insertions(+), 27 deletions(-)

diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index 44a1f7c..0cffef8 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -164,8 +164,8 @@ Sending
 Furthermore, passwords need not be specified in configuration files
 or on the command line. If a username has been specified (with
 '--smtp-user' or a 'sendemail.smtpuser'), but no password has been
-specified (with '--smtp-pass' or 'sendemail.smtppass'), then the
-user is prompted for a password while the input is masked for privacy.
+specified (with '--smtp-pass' or 'sendemail.smtppass'), then
+a password is obtained using 'git-credential'.
 
 --smtp-server=<host>::
 	If set, specifies the outgoing SMTP server to use (e.g.
diff --git a/git-send-email.perl b/git-send-email.perl
index be809e5..76bbfc3 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -1045,6 +1045,39 @@ sub maildomain {
 	return maildomain_net() || maildomain_mta() || 'localhost.localdomain';
 }
 
+# Returns 1 if authentication succeeded or was not necessary
+# (smtp_user was not specified), and 0 otherwise.
+
+sub smtp_auth_maybe {
+	if (!defined $smtp_authuser || $auth) {
+		return 1;
+	}
+
+	# Workaround AUTH PLAIN/LOGIN interaction defect
+	# with Authen::SASL::Cyrus
+	eval {
+		require Authen::SASL;
+		Authen::SASL->import(qw(Perl));
+	};
+
+	# TODO: Authentication may fail not because credentials were
+	# invalid but due to other reasons, in which we should not
+	# reject credentials.
+	$auth = Git::credential({
+		'protocol' => 'smtp',
+		'host' => join(':', $smtp_server, $smtp_server_port),
+		'username' => $smtp_authuser,
+		# if there's no password, "git credential fill" will
+		# give us one, otherwise it'll just pass this one.
+		'password' => $smtp_authpass
+	}, sub {
+		my $cred = shift;
+		return !!$smtp->auth($cred->{'username'}, $cred->{'password'});
+	});
+
+	return $auth;
+}
+
 # Returns 1 if the message was sent, and 0 otherwise.
 # In actuality, the whole program dies when there
 # is an error sending a message.
@@ -1185,31 +1218,7 @@ X-Mailer: git-send-email $gitversion
 			    defined $smtp_server_port ? " port=$smtp_server_port" : "";
 		}
 
-		if (defined $smtp_authuser) {
-			# Workaround AUTH PLAIN/LOGIN interaction defect
-			# with Authen::SASL::Cyrus
-			eval {
-				require Authen::SASL;
-				Authen::SASL->import(qw(Perl));
-			};
-
-			if (!defined $smtp_authpass) {
-
-				system "stty -echo";
-
-				do {
-					print "Password: ";
-					$_ = <STDIN>;
-					print "\n";
-				} while (!defined $_);
-
-				chomp($smtp_authpass = $_);
-
-				system "stty echo";
-			}
-
-			$auth ||= $smtp->auth( $smtp_authuser, $smtp_authpass ) or die $smtp->message;
-		}
+		smtp_auth_maybe or die $smtp->message;
 
 		$smtp->mail( $raw_from ) or die $smtp->message;
 		$smtp->to( @recipients ) or die $smtp->message;
-- 
1.8.1.2.549.g4fa355e

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/4] Git.pm: Allow pipes to be closed prior to calling command_close_bidi_pipe
  2013-02-06 20:47 ` [PATCH 2/4] Git.pm: Allow pipes to be closed prior to calling command_close_bidi_pipe Michal Nazarewicz
@ 2013-02-06 23:04   ` Jeff King
  2013-02-07  0:14     ` Junio C Hamano
  0 siblings, 1 reply; 11+ messages in thread
From: Jeff King @ 2013-02-06 23:04 UTC (permalink / raw
  To: Michal Nazarewicz; +Cc: Junio C Hamano, Ted Zlatanov, Matthieu Moy, git

On Wed, Feb 06, 2013 at 09:47:04PM +0100, Michal Nazarewicz wrote:

> From: Michal Nazarewicz <mina86@mina86.com>
> 
> The command_close_bidi_pipe() function will insist on closing both
> input and output pipes returned by command_bidi_pipe().  With this
> change it is possible to close one of the pipes in advance and
> pass undef as an argument.
> 
> This allows for something like:
> 
>   my ($pid, $in, $out, $ctx) = command_bidi_pipe(...);
>   print $out "write data";
>   close $out;
>   # ... do stuff with $in
>   command_close_bidi_pipe($pid, $in, undef, $ctx);

Should this part go into the documentation for command_close_bidi_pipe
in Git.pm?

-Peff

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] Git.pm: Add interface for git credential command.
  2013-02-06 20:47 ` [PATCH 3/4] Git.pm: Add interface for git credential command Michal Nazarewicz
@ 2013-02-06 23:16   ` Jeff King
  2013-02-07  7:19   ` Matthieu Moy
  2013-02-07  7:22   ` Matthieu Moy
  2 siblings, 0 replies; 11+ messages in thread
From: Jeff King @ 2013-02-06 23:16 UTC (permalink / raw
  To: Michal Nazarewicz; +Cc: Junio C Hamano, Ted Zlatanov, Matthieu Moy, git

On Wed, Feb 06, 2013 at 09:47:05PM +0100, Michal Nazarewicz wrote:

> +sub _credential_read {
> +	my %credential;
> +	my ($reader, $op) = (@_);
> +	while (<$reader>) {
> +		chomp;
> +		my ($key, $value) = /([^=]*)=(.*)/;

Empty keys are not valid. Can we make this:

  /^([^=]+)=(.*)/

to fail the regex? Otherwise, I think this check:

> +		if (not defined $key) {
> +			throw Error::Simple("unable to parse git credential $op response:\n$_\n");
> +		}

would not pass because $key would be the empty string.

> +sub _credential_write {
> +	my ($credential, $writer) = @_;
> +
> +	for my $key (sort {
> +		# url overwrites other fields, so it must come first
> +		return -1 if $a eq 'url';
> +		return  1 if $b eq 'url';
> +		return $a cmp $b;
> +	} keys %$credential) {
> +		if (defined $credential->{$key} && length $credential->{$key}) {
> +			print $writer $key, '=', $credential->{$key}, "\n";
> +		}
> +	}

There are a few disallowed characters, like "\n" in key or value, and
"=" in a key. They should never happen unless the caller is buggy, but
should we check and catch them here?

> +In the second form, C<CODE> needs to be a reference to a subroutine.
> +The function will execute C<git credential fill> to fill provided
> +credential hash, than call C<CODE> with C<CREDENTIAL> as the sole
> +argument, and finally depending on C<CODE>'s return value execute
> +C<git credential approve> (if return value yields true) or C<git
> +credential reject> (otherwise).  The return value is the same as what
> +C<CODE> returned.  With this form, the usage might look as follows:

This is a nice touch. It makes the normal calling code a lot simpler.

-Peff

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] git-send-email: Use git credential to obtain password.
  2013-02-06 20:47 ` [PATCH 4/4] git-send-email: Use git credential to obtain password Michal Nazarewicz
@ 2013-02-06 23:19   ` Jeff King
  0 siblings, 0 replies; 11+ messages in thread
From: Jeff King @ 2013-02-06 23:19 UTC (permalink / raw
  To: Michal Nazarewicz; +Cc: Junio C Hamano, Ted Zlatanov, Matthieu Moy, git

On Wed, Feb 06, 2013 at 09:47:06PM +0100, Michal Nazarewicz wrote:

> From: Michal Nazarewicz <mina86@mina86.com>
> 
> If smtp_user is provided but smtp_pass is not, instead of prompting
> for password, make git-send-email use git credential command
> instead.
> 
> Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
> ---
>  Documentation/git-send-email.txt |  4 +--
>  git-send-email.perl              | 59 +++++++++++++++++++++++-----------------
>  2 files changed, 36 insertions(+), 27 deletions(-)

Nice. I don't see anything obviously wrong with the code, but I didn't
try it myself. I wonder how hard it would be to have some tests in
t9001. It looks like we don't test the smtp code paths at all, since we
would have to implement a fake smtp server. Which probably means the
answer is is "pretty hard", unless there is an easy-to-use CPAN smtp
server module we can plug in.

-Peff

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/4] Git.pm: Allow pipes to be closed prior to calling command_close_bidi_pipe
  2013-02-06 23:04   ` Jeff King
@ 2013-02-07  0:14     ` Junio C Hamano
  0 siblings, 0 replies; 11+ messages in thread
From: Junio C Hamano @ 2013-02-07  0:14 UTC (permalink / raw
  To: Jeff King; +Cc: Michal Nazarewicz, Ted Zlatanov, Matthieu Moy, git

Jeff King <peff@peff.net> writes:

> On Wed, Feb 06, 2013 at 09:47:04PM +0100, Michal Nazarewicz wrote:
>
>> From: Michal Nazarewicz <mina86@mina86.com>
>> 
>> The command_close_bidi_pipe() function will insist on closing both
>> input and output pipes returned by command_bidi_pipe().  With this
>> change it is possible to close one of the pipes in advance and
>> pass undef as an argument.
>> 
>> This allows for something like:
>> 
>>   my ($pid, $in, $out, $ctx) = command_bidi_pipe(...);
>>   print $out "write data";
>>   close $out;
>>   # ... do stuff with $in
>>   command_close_bidi_pipe($pid, $in, undef, $ctx);
>
> Should this part go into the documentation for command_close_bidi_pipe
> in Git.pm?

Yeah, it probably should.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] Git.pm: Add interface for git credential command.
  2013-02-06 20:47 ` [PATCH 3/4] Git.pm: Add interface for git credential command Michal Nazarewicz
  2013-02-06 23:16   ` Jeff King
@ 2013-02-07  7:19   ` Matthieu Moy
  2013-02-07  7:22   ` Matthieu Moy
  2 siblings, 0 replies; 11+ messages in thread
From: Matthieu Moy @ 2013-02-07  7:19 UTC (permalink / raw
  To: Michal Nazarewicz; +Cc: Junio C Hamano, Ted Zlatanov, Jeff King, git

Michal Nazarewicz <mpn@google.com> writes:

> From: Michal Nazarewicz <mina86@mina86.com>
>
> Add a credential() function which is an interface to the
> git credential command.

Nice.

I think you should credit git-remote-mediawiki for the code in the
commit message. Perhaps have a first "copy/paste" commit, and then an
"adaptation" commit to add sort, ^ anchor in regexp, doc and your
callback mechanism, but I won't insist on that.

Other than that, it all looks good, thanks. I'll take care of deleting
the old code in git-remote-mediawiki and use Git.pm instead.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] Git.pm: Add interface for git credential command.
  2013-02-06 20:47 ` [PATCH 3/4] Git.pm: Add interface for git credential command Michal Nazarewicz
  2013-02-06 23:16   ` Jeff King
  2013-02-07  7:19   ` Matthieu Moy
@ 2013-02-07  7:22   ` Matthieu Moy
  2 siblings, 0 replies; 11+ messages in thread
From: Matthieu Moy @ 2013-02-07  7:22 UTC (permalink / raw
  To: Michal Nazarewicz; +Cc: git

Michal Nazarewicz <mpn@google.com> writes:

> Subject: [PATCH 3/4] Git.pm: Add interface for git credential command.

Ah, just a nitpick: usually we write the message without capital after
":" and without the final ".".

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2013-02-07  7:24 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-02-06 20:47 [PATCH 0/4] Make git-send-email git-credential Michal Nazarewicz
2013-02-06 20:47 ` [PATCH 1/4] Git.pm: Allow command_close_bidi_pipe() to be called as method Michal Nazarewicz
2013-02-06 20:47 ` [PATCH 2/4] Git.pm: Allow pipes to be closed prior to calling command_close_bidi_pipe Michal Nazarewicz
2013-02-06 23:04   ` Jeff King
2013-02-07  0:14     ` Junio C Hamano
2013-02-06 20:47 ` [PATCH 3/4] Git.pm: Add interface for git credential command Michal Nazarewicz
2013-02-06 23:16   ` Jeff King
2013-02-07  7:19   ` Matthieu Moy
2013-02-07  7:22   ` Matthieu Moy
2013-02-06 20:47 ` [PATCH 4/4] git-send-email: Use git credential to obtain password Michal Nazarewicz
2013-02-06 23:19   ` Jeff King

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).