use Digest::SHA qw(sha256_hex);
our $LIVE; # pid => callback
-my $update_ref_stdin = $ENV{GIT_CAN_UPDATE_REF_STDIN} // 1;
sub _wq_done_wait { # dwaitpid callback (via wq_eof)
my ($arg, $pid) = @_;
@cmd;
}
-sub fgrp_update_old ($) { # for git <1.8.5
- my ($fgrp) = @_;
- my $cmd = [ @{$fgrp->{-torsocks}}, 'git', "--git-dir=$fgrp->{cur_dst}",
- fetch_args($fgrp->{lei}, my $opt = {}) ];
- $fgrp->{lei}->qerr("# @$cmd");
- do_reap($fgrp);
- $LIVE->{spawn($cmd, undef, $opt)} = [ \&reap_cmd, $fgrp, $cmd ];
-}
-
sub upr { # feed `git update-ref --stdin -z' verbosely
- my ($fgrp, $w, $op, $ref, $oid) = @_;
- $fgrp->{lei}->qerr("# $op $ref $oid");
+ my ($lei, $w, $op, $ref, $oid) = @_;
+ $lei->qerr("# $op $ref $oid") if $lei->{opt}->{verbose};
print $w "$op $ref\0$oid\0" or die "print(w): $!";
}
pipe(my ($r, $w)) or die "pipe: $!";
my $cmd = [ 'git', "--git-dir=$fgrp->{cur_dst}",
qw(update-ref --stdin -z) ];
- $fgrp->{lei}->qerr("# @$cmd");
- my $opt = { 0 => $r, 1 => $fgrp->{lei}->{1}, 2 => $fgrp->{lei}->{2} };
+ my $lei = $fgrp->{lei};
+ $lei->qerr("# @$cmd");
+ my $opt = { 0 => $r, 1 => $lei->{1}, 2 => $lei->{2} };
my $pid = spawn($cmd, undef, $opt);
close $r or die "close(r): $!";
for my $ref (keys %dst) {
my $new = delete $src{$ref};
my $old = $dst{$ref};
if (defined $new) {
- upr($fgrp, $w, 'update', $ref, $new) if $new ne $old;
+ upr($lei, $w, 'update', $ref, $new) if $new ne $old;
} else {
- upr($fgrp, $w, 'delete', $ref, $old);
+ upr($lei, $w, 'delete', $ref, $old);
}
}
while (my ($ref, $oid) = each %src) {
- upr($fgrp, $w, 'create', $ref, $oid);
- }
- if (close($w)) { # git >= 1.8.5
- $LIVE->{$pid} = [ \&reap_cmd, $fgrp, $cmd ];
- do_reap($fgrp);
- } else { # git <1.8.5 w/o update-ref --stdin
- warn "E: close(update-ref --stdin): $!\n";
- $update_ref_stdin = 0;
- waitpid($pid, 0) // die "waitpid(update-ref --stdin): $!";
- fgrp_update_old($fgrp);
+ upr($lei, $w, 'create', $ref, $oid);
}
+ close($w) or warn "E: close(update-ref --stdin): $! (need git 1.8.5+)\n";
+ $LIVE->{$pid} = [ \&reap_cmd, $fgrp, $cmd ];
+ do_reap($fgrp);
}
sub pack_refs {
my %opt = map { $_ => $fgrp->{lei}->{$_} } (0..2);
pack_refs($fgrp, $fgrp->{-osdir}); # objstore refs always packed
- $update_ref_stdin or return fgrp_update_old($fgrp);
-
my $update_ref = PublicInbox::OnDestroy->new($$, \&fgrp_update, $fgrp);
my $src = [ 'git', "--git-dir=$fgrp->{-osdir}", 'for-each-ref',
say $fh $l or die "say($f): $!";
}
close $fh or die "close($f): $!";
- @cmd = ('git', "--git-dir=$self->{cur_dst}",
- qw(remote add --mirror=fetch origin), "$uri");
- my $pid = spawn(\@cmd, undef, $opt);
- waitpid($pid, 0) // die "waitpid(@cmd): $!";
- die "E: @cmd: \$?=$?" if ($? && ($? >> 8) != 3);
+ $f = "$self->{cur_dst}/config";
+ open $fh, '+>>', $f or die "open:($f): $!";
+ print $fh <<EOM or die "print($f): $!";
+; rely on the "$rn" remote in the
+; $fg fork group for fetches
+; only uncomment the following iff you detach from fork groups
+; [remote "origin"]
+; url = $uri
+; fetch = +refs/*:refs/*
+; mirror = true
+EOM
+ close $fh or die "close($f): $!";
}
bless { %$self, -osdir => $dir, -remote => $rn }, __PACKAGE__;
}