about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-05-06 02:22:39 +0000
committerEric Wong <e@80x24.org>2021-05-06 16:56:43 +0000
commit473b069c61b3d4936e2c5ed46fd7d348c9f6d1b7 (patch)
tree221ef389b49059d4f82e5257fb4acf38dd397097 /lib/PublicInbox
parentaa6ad348fea8a7affb1ecf025c297983d0e061cd (diff)
downloadpublic-inbox-473b069c61b3d4936e2c5ed46fd7d348c9f6d1b7.tar.gz
We use trailing slashes internally, but should not increase
visual noise for users by exposing them in config files or
DB storage (and shell completion/listings).

This fixes a long-standing bug in $lei->rel2abs that prevented
absolute paths from being canonicalized.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/LEI.pm1
-rw-r--r--lib/PublicInbox/LeiInspect.pm2
-rw-r--r--lib/PublicInbox/LeiMailSync.pm29
-rw-r--r--lib/PublicInbox/LeiSavedSearch.pm2
4 files changed, 26 insertions, 8 deletions
diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm
index 9dbbeba9..7349c261 100644
--- a/lib/PublicInbox/LEI.pm
+++ b/lib/PublicInbox/LEI.pm
@@ -70,6 +70,7 @@ sub rel2abs {
         my ($self, $p) = @_;
         if (index($p, '/') == 0) { # already absolute
                 $p =~ tr!/!/!s; # squeeze redundant slashes
+                chop($p) if substr($p, -1, 1) eq '/';
                 return $p;
         }
         my $pwd = $self->{env}->{PWD};
diff --git a/lib/PublicInbox/LeiInspect.pm b/lib/PublicInbox/LeiInspect.pm
index 714d2526..f79ebc9a 100644
--- a/lib/PublicInbox/LeiInspect.pm
+++ b/lib/PublicInbox/LeiInspect.pm
@@ -44,7 +44,7 @@ sub inspect_sync_folder ($$) {
                         } @maybe;
                 }
         } elsif ($folder =~ m!\A(maildir|mh):(.+)!i) {
-                my $type = $1;
+                my $type = lc $1;
                 $folders[0] = "$type:".$lei->abs_path($2);
         } elsif (-d $folder) {
                 $folders[0] = 'maildir:'.$lei->abs_path($folder);
diff --git a/lib/PublicInbox/LeiMailSync.pm b/lib/PublicInbox/LeiMailSync.pm
index 2e74e433..d8242de3 100644
--- a/lib/PublicInbox/LeiMailSync.pm
+++ b/lib/PublicInbox/LeiMailSync.pm
@@ -72,15 +72,34 @@ CREATE TABLE IF NOT EXISTS blob2name (
 sub _fid_for {
         my ($self, $folder, $rw) = @_;
         my $dbh = $self->{dbh};
-        my ($row) = $dbh->selectrow_array(<<'', undef, $folder);
-SELECT fid FROM folders WHERE loc = ? LIMIT 1
+        my $sel = 'SELECT fid FROM folders WHERE loc = ? LIMIT 1';
+        my ($fid) = $dbh->selectrow_array($sel, undef, $folder);
+        return $fid if defined $fid;
 
-        return $row if defined $row;
+        if ($folder =~ s!\A((?:maildir|mh):.*?)/+\z!$1!i) {
+                warn "folder: $folder/ had trailing slash in arg\n";
+                ($fid) = $dbh->selectrow_array($sel, undef, $folder);
+                if (defined $fid) {
+                        $dbh->do(<<EOM, undef, $folder, $fid) if $rw;
+UPDATE folders SET loc = ? WHERE fid = ?
+EOM
+                        return $fid;
+                }
+        # sometimes we stored trailing slash..
+        } elsif ($folder =~ m!\A(?:maildir|mh):!i) {
+                ($fid) = $dbh->selectrow_array($sel, undef, "$folder/");
+                if (defined $fid) {
+                        $dbh->do(<<EOM, undef, $folder, $fid) if $rw;
+UPDATE folders SET loc = ? WHERE fid = ?
+EOM
+                        return $fid;
+                }
+        }
         return unless $rw;
 
-        ($row) = $dbh->selectrow_array('SELECT MAX(fid) FROM folders');
+        ($fid) = $dbh->selectrow_array('SELECT MAX(fid) FROM folders');
 
-        my $fid = ($row // 0) + 1;
+        $fid += 1;
         # in case we're reusing, clobber existing stale refs:
         $dbh->do('DELETE FROM blob2name WHERE fid = ?', undef, $fid);
         $dbh->do('DELETE FROM blob2num WHERE fid = ?', undef, $fid);
diff --git a/lib/PublicInbox/LeiSavedSearch.pm b/lib/PublicInbox/LeiSavedSearch.pm
index 92ced28b..01b987d1 100644
--- a/lib/PublicInbox/LeiSavedSearch.pm
+++ b/lib/PublicInbox/LeiSavedSearch.pm
@@ -40,8 +40,6 @@ sub lss_dir_for ($$;$) {
         } else {
                 # can't use Cwd::abs_path since dirname($$dstref) may not exist
                 $$dstref = $lei->rel2abs($$dstref);
-                # Maildirs have trailing '/' internally
-                $$dstref .= '/' if -d $$dstref;
                 $$dstref =~ tr!/!/!s;
                 @n = ($$dstref =~ m{([^/]+)/*\z}); # basename
         }