about summary refs log tree commit homepage
path: root/lib/PublicInbox/V2Writable.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2018-07-04 10:50:25 +0000
committerEric Wong <e@80x24.org>2018-07-04 19:53:30 +0000
commit9c9170688649c975d866b5326b12623dc8f4604b (patch)
tree9d793a50bbf642354ab7ea6b349ff3c39944eb8e /lib/PublicInbox/V2Writable.pm
parent4cf7804c2b263e4a92447315f534f76416d4ffad (diff)
downloadpublic-inbox-9c9170688649c975d866b5326b12623dc8f4604b.tar.gz
For v2 repositories with multiple epochs, we must not forget
about earlier epochs in clones.  Ensure we update the alternates
file with all known epochs up to the current one.

Reported-by: Eric W. Biederman <ebiederm@xmission.com>
  https://public-inbox.org/meta/871scj2vzi.fsf@xmission.com/
Diffstat (limited to 'lib/PublicInbox/V2Writable.pm')
-rw-r--r--lib/PublicInbox/V2Writable.pm12
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index d8d75ec2..412eb6a9 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -495,15 +495,21 @@ sub git_init {
         PublicInbox::Import::run_die(\@cmd);
 
         my $alt = "$all/objects/info/alternates";
-        my $new_obj_dir = "../../git/$epoch.git/objects";
         my %alts;
+        my @add;
         if (-e $alt) {
                 open(my $fh, '<', $alt) or die "open < $alt: $!\n";
                 %alts = map { chomp; $_ => 1 } (<$fh>);
         }
-        return $git_dir if $alts{$new_obj_dir};
+        foreach my $i (0..$epoch) {
+                my $dir = "../../git/$i.git/objects";
+                push @add, $dir if !$alts{$dir} && -d "$pfx/$i.git";
+        }
+        return $git_dir unless @add;
         open my $fh, '>>', $alt or die "open >> $alt: $!\n";
-        print $fh "$new_obj_dir\n" or die "print >> $alt: $!\n";
+        foreach my $dir (@add) {
+                print $fh "$dir\n" or die "print >> $alt: $!\n";
+        }
         close $fh or die "close $alt: $!\n";
         $git_dir
 }