From 473b069c61b3d4936e2c5ed46fd7d348c9f6d1b7 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 6 May 2021 02:22:39 +0000 Subject: lei_mail_sync: Maildir canonicalization omits trailing slash 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. --- lib/PublicInbox/LEI.pm | 1 + lib/PublicInbox/LeiInspect.pm | 2 +- lib/PublicInbox/LeiMailSync.pm | 29 ++++++++++++++++++++++++----- lib/PublicInbox/LeiSavedSearch.pm | 2 -- 4 files changed, 26 insertions(+), 8 deletions(-) (limited to 'lib/PublicInbox') 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(<selectrow_array($sel, undef, "$folder/"); + if (defined $fid) { + $dbh->do(<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 } -- cgit v1.2.3-24-ge0c7