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};
} @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);
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);
} 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
}
}
symlink(abs_path('t/data/0001.patch'), "$md/cur/x:2,S") or
BAIL_OUT "symlink $md $!";
- lei_ok(qw(import), $md, \'import Maildir');
+ lei_ok(qw(import), "$md/", \'import Maildir');
my $imp_err = $lei_err;
my %i;
lei_ok('inspect', $md); $i{no_type} = $lei_out;
+ lei_ok('inspect', "$md/"); $i{no_type_tslash} = $lei_out;
lei_ok('inspect', "maildir:$md"), $i{with_type} = $lei_out;
+ lei_ok('inspect', "maildir:$md/"), $i{with_type_tslash} = $lei_out;
+ lei_ok('inspect', "MAILDIR:$md"), $i{ALLCAPS} = $lei_out;
lei_ok(['inspect', $md], undef, { -C => $ENV{HOME}, %$lei_opt });
$i{rel_no_type} = $lei_out;
lei_ok(['inspect', "maildir:$md"], undef,
my $home = $ENV{HOME};
my $in = $doc1->as_string;
lei_ok [qw(import -q -F eml -)], undef, { 0 => \$in, %$lei_opt };
- lei_ok qw(q -q --save z:0.. d:last.week..), '-o', "$home/md/";
+ lei_ok qw(q -q --save z:0.. d:last.week..), '-o', "MAILDIR:$home/md/";
my %before = map { $_ => 1 } glob("$home/md/cur/*");
is_deeply(eml_load((keys %before)[0]), $doc1, 'doc1 matches');
+ lei_ok qw(ls-mail-sync);
+ is($lei_out, "maildir:$home/md\n", 'canonicalized mail sync name');
my @s = glob("$home/.local/share/lei/saved-searches/md-*");
is(scalar(@s), 1, 'got one saved search');
my $cfg = PublicInbox::Config->new("$s[0]/lei.saved-search");
+ is($cfg->{'lei.q.output'}, "maildir:$home/md", 'canonicalized output');
is_deeply($cfg->{'lei.q'}, ['z:0..', 'd:last.week..'],
'store relative time, not parsed (absolute) timestamp');
lei_ok qw(ls-search); my @d = split(/\n/, $lei_out);
lei_ok qw(ls-search -z); my @z = split(/\0/, $lei_out);
is_deeply(\@d, \@z, '-z output matches non-z');
- is_deeply(\@d, [ "$home/mbcl2", "$home/md/" ],
+ is_deeply(\@d, [ "$home/mbcl2", "$home/md" ],
'ls-search output alphabetically sorted');
lei_ok qw(ls-search -l);
my $json = PublicInbox::Config->json->decode($lei_out);
ok($json && $json->[0]->{output}, 'JSON has output');
lei_ok qw(_complete lei up);
like($lei_out, qr!^\Q$home/mbcl2\E$!sm, 'complete got mbcl2 output');
- like($lei_out, qr!^\Q$home/md/\E$!sm, 'complete got maildir output');
+ like($lei_out, qr!^\Q$home/md\E$!sm, 'complete got maildir output');
unlink("$home/mbcl2") or xbail "unlink $!";
lei_ok qw(_complete lei up);
{ $imap => [ 1 ], $maildir => [ $fname ] },
'locations_for w/ maildir + imap');
+if ('mess things up pretend old bug') {
+ $lms->lms_begin;
+ $lms->{dbh}->do('UPDATE folders SET loc = ? WHERE loc = ?', undef,
+ "$maildir/", $maildir);
+ ok(delete $lms->{fmap}, 'clear folder map');
+ $lms->lms_commit;
+
+ $lms->lms_begin;
+ ok($lms->set_src('deadbeef', $maildir, \$fname), 'set Maildir once');
+ $lms->lms_commit;
+};
+
is_deeply([sort($ro->folders)], [$imap, $maildir], 'both folders shown');
my @res;
$ro->each_src($maildir, sub {