X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FGitCredential.pm;h=b18bba1ec32454b29a03339a54c2ed53b17c008c;hb=23af251dd607c4e75ab1e68063f2c885c48cc035;hp=c6da6a090caad0b415c425e3e5e694c63963f60d;hpb=6968c91707d51f6a60d476cc2f5d65a660146813;p=public-inbox.git diff --git a/lib/PublicInbox/GitCredential.pm b/lib/PublicInbox/GitCredential.pm index c6da6a09..b18bba1e 100644 --- a/lib/PublicInbox/GitCredential.pm +++ b/lib/PublicInbox/GitCredential.pm @@ -1,14 +1,20 @@ -# Copyright (C) 2020 all contributors +# Copyright (C) 2020-2021 all contributors # License: AGPL-3.0+ 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 = ''; @@ -25,8 +31,12 @@ sub run ($$) { close $out_r or die "`git credential $op' failed: \$!=$! \$?=$?\n"; } -sub check_netrc ($) { - my ($self) = @_; +sub check_netrc { + my ($self, $lei) = @_; + + # n.b. lei doesn't load ~/.netrc by default, public-inbox-watch does, + # which may've been a mistake, but we have to live with it. + return if ($lei && !$lei->{opt}->{netrc}); # part of the standard library, but distributions may split it out eval { require Net::Netrc }; @@ -41,8 +51,8 @@ sub check_netrc ($) { } sub fill { - my ($self) = @_; - my $out_r = run($self, 'fill'); + my ($self, $lei) = @_; + my $out_r = run($self, 'fill', $lei); while (<$out_r>) { chomp; return if $_ eq ''; @@ -50,6 +60,7 @@ sub fill { $self->{$1} = $2; } close $out_r or die "git credential fill failed: \$!=$! \$?=$?\n"; + $self->{filled} = 1; } 1;