about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2020-11-23 23:32:29 +0000
committerEric Wong <e@80x24.org>2020-11-24 16:16:26 +0000
commit95cb3e48fc5c4e847cdc111c2c8c9f0b70bdea56 (patch)
tree1e478ff3e78e602736dfcd95b58ef62b0d85907b /lib
parent46cbc5a7a4ba917bd7154be3b6e6898420ff85d3 (diff)
downloadpublic-inbox-95cb3e48fc5c4e847cdc111c2c8c9f0b70bdea56.tar.gz
This allows us to filter out duplicate alternates entries in case
there's symlinks or bind mounts in play, as I (and perhaps some
other users) tend to use symlinks and/or bind mounts heavily.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/ExtSearchIdx.pm20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/PublicInbox/ExtSearchIdx.pm b/lib/PublicInbox/ExtSearchIdx.pm
index 2cdc31cb..7ab0c4af 100644
--- a/lib/PublicInbox/ExtSearchIdx.pm
+++ b/lib/PublicInbox/ExtSearchIdx.pm
@@ -396,18 +396,28 @@ sub idx_init { # similar to V2Writable
         my $info_dir = "$ALL/objects/info";
         my $alt = "$info_dir/alternates";
         my $mode = 0644;
-        my (%old, @old, %new, @new);
+        my (@old, @new, %seen); # seen: st_dev + st_ino
         if (-e $alt) {
                 open(my $fh, '<', $alt) or die "open $alt: $!";
                 $mode = (stat($fh))[2] & 07777;
-                while (<$fh>) {
-                        push @old, $_ if !$old{$_}++;
+                while (my $line = <$fh>) {
+                        chomp(my $d = $line);
+                        if (my @st = stat($d)) {
+                                next if $seen{"$st[0]\0$st[1]"}++;
+                        } else {
+                                warn "W: stat($d) failed (from $alt): $!\n";
+                        }
+                        push @old, $line;
                 }
         }
         for my $ibx (@{$self->{ibx_list}}) {
                 my $line = $ibx->git->{git_dir} . "/objects\n";
-                next if $old{$line};
-                $new{$line} = 1;
+                chomp(my $d = $line);
+                if (my @st = stat($d)) {
+                        next if $seen{"$st[0]\0$st[1]"}++;
+                } else {
+                        warn "W: stat($d) failed (from $ibx->{inboxdir}): $!\n";
+                }
                 push @new, $line;
         }
         if (scalar @new) {