+sub maybeinstallprospective () {
+ return if $destrepo eq $realdestrepo;
+
+ my $child = open SR, "-|";
+ defined $child or die $!;
+ if (!$child) {
+ chdir $destrepo or die $!;
+ exec qw(git show-ref);
+ die $!;
+ }
+ my %got = qw(tag 0 head 0);
+ while (<SR>) {
+ chomp or die;
+ s/^\S*[1-9a-f]\S* (\S+)$/$1/ or die;
+ my $wh =
+ m{^refs/tags/} ? 'tag' :
+ m{^refs/dgit/} ? 'head' :
+ die;
+ die if $got{$wh}++;
+ }
+ die if grep { !$_ } values %got;
+ $!=0; $?=0; close SR or die "$? $!";
+
+ rename $destrepo, $realdestrepo or die $!;
+ remove "$destrepo.lock" or die $!;
+}
+
+sub main__git_receive_pack () {
+ makeworkingclone();
+ setupstunthook();
+ runcmd qw(git receive-pack), $destdir;
+ maybeinstallprospective();
+}
+