-# Copyright (C) 2020 all contributors <meta@public-inbox.org>
+# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
package PublicInbox::GitCredential;
use strict;
use PublicInbox::Spawn qw(popen_rd);
-sub run ($$) {
- my ($self, $op) = @_;
- my ($in_r, $in_w);
+sub run ($$;$) {
+ my ($self, $op, $lei) = @_;
+ my ($in_r, $in_w, $out_r);
+ my $cmd = [ qw(git credential), $op ];
pipe($in_r, $in_w) or die "pipe: $!";
- my $out_r = popen_rd([qw(git credential), $op], undef, { 0 => $in_r });
+ if ($lei) { # we'll die if disconnected:
+ pipe($out_r, my $out_w) or die "pipe: $!";
+ $lei->send_exec_cmd([ $in_r, $out_w ], $cmd, {});
+ } else {
+ $out_r = popen_rd($cmd, undef, { 0 => $in_r });
+ }
close $in_r or die "close in_r: $!";
my $out = '';
close $out_r or die "`git credential $op' failed: \$!=$! \$?=$?\n";
}
-sub fill {
+sub check_netrc ($) {
my ($self) = @_;
- my $out_r = run($self, 'fill');
+
+ # part of the standard library, but distributions may split it out
+ eval { require Net::Netrc };
+ if ($@) {
+ warn "W: Net::Netrc missing: $@\n";
+ return;
+ }
+ if (my $x = Net::Netrc->lookup($self->{host}, $self->{username})) {
+ $self->{username} //= $x->login;
+ $self->{password} = $x->password;
+ }
+}
+
+sub fill {
+ my ($self, $lei) = @_;
+ my $out_r = run($self, 'fill', $lei);
while (<$out_r>) {
chomp;
return if $_ eq '';