]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiMirror.pm
lei_mirror: set {head} from manifest
[public-inbox.git] / lib / PublicInbox / LeiMirror.pm
index 79861d64207170693600a1f4223b3e5c9098e5db..fc5bc88d86acba0edff1f3c68c13ed9caf93a0a6 100644 (file)
@@ -678,6 +678,23 @@ sub update_ent {
                my $done = PublicInbox::OnDestroy->new($$, \&up_fp_done, $self);
                start_cmd($self, $cmd, $opt, $done);
        }
+
+       $new = $self->{-ent}->{head};
+       $cur = $self->{-local_manifest}->{$key}->{head} // "\0";
+       if (defined($new) && $new ne $cur) {
+               # n.b. grokmirror writes raw contents to $dst/HEAD w/o locking
+               my $cmd = [ 'git', "--git-dir=$dst" ];
+               if ($new =~ s/\Aref: //) {
+                       push @$cmd, qw(symbolic-ref HEAD), $new;
+               } elsif ($new =~ /\A[a-f0-9]{40,}\z/) {
+                       push @$cmd, qw(update-ref --no-deref HEAD), $new;
+               } else {
+                       undef $cmd;
+                       warn "W: $key: {head} => `$new' not understood\n";
+               }
+               start_cmd($self, $cmd, { 2 => $self->{lei}->{2} }) if $cmd;
+       }
+
        $new = $self->{-ent}->{owner} // return;
        $cur = $self->{-local_manifest}->{$key}->{owner} // "\0";
        return if $cur eq $new;
@@ -881,18 +898,20 @@ sub multi_inbox ($$$) {
 sub clone_all {
        my ($self, $m) = @_;
        my $todo = delete $self->{todo};
-       my $nodep = delete $todo->{''};
-
-       # do not download unwanted deps
-       my $any_want = delete $self->{any_want};
-       my @unwanted = grep { !$any_want->{$_} } keys %$todo;
-       my @nodep = delete(@$todo{@unwanted});
-       push(@$nodep, @$_) for @nodep;
-
-       # handle no-dependency repos, first
-       for (@$nodep) {
-               clone_v1($_, 1);
-               return if !keep_going($self);
+       {
+               my $nodep = delete $todo->{''};
+
+               # do not download unwanted deps
+               my $any_want = delete $self->{any_want};
+               my @unwanted = grep { !$any_want->{$_} } keys %$todo;
+               my @nodep = delete(@$todo{@unwanted});
+               push(@$nodep, @$_) for @nodep;
+
+               # handle no-dependency repos, first
+               for (@$nodep) {
+                       clone_v1($_, 1);
+                       return if !keep_going($self);
+               }
        }
        # resolve references, deepest, first:
        while (scalar keys %$todo) {