Mariachi, the not really Siesta bit

Start

el mariachi

It's like

pipermail

mhonarc

hypermail

Apart from

it's in perl

(no, mhonarc doesn't count - the guts are funky)

it does Template Toolkit

it's name is Jose

(or lists have to come in threes)

It's a Siesta project

It too has a stack of dependencies

 my $build = Siesta::Build->new(
     module_name  => "Mariachi",
     dynamic_config => 1,
     license      => 'perl',
     script_files => [ 'mariachi' ],
     requires     => {
         'AppConfig'       => '1.55',
         'Email::Folder'   => '0.5',
         'Module::Build'   => '0.18',
         'Mail::Thread'    => '2.2',
         'Mail::Thread::Chronological' => '1.22',
         'Email::Thread'   => 0,
         'Template'        => 0,
         'Template::Plugin::Page' => 0,
         'Date::Parse'     => 0,
         'Class::Accessor' => 0,
         'Email::Find'     => 0,
         'Memoize'         => 0,
         'URI::Find::Schemeless::Stricter' => 0,
         'Test::More'      => 0,
         'Storable'        => 0,
         'Time::HiRes'     => 0,
         'File::Find::Rule' => 0,
         'File::Path'      => 0,
         'File::Copy'      => 0,
         'File::Basename'  => 0,
     },
     sign => 1,
     create_makefile_pl => 'passthrough',
    );

CPANPLUS is still your friend

Usage

 % cpanp --prereqs i Mariachi

time passes

 % time mariachi -i threadtest -o london.pm --name london.pm
 reticulating splines                               0.000 elapsed 0.000 total
 load 37                                            0.434 elapsed 0.434 total
 dropped 0 duplicate messages
 dedupe                                             0.007 elapsed 0.441 total
 thread                                             0.042 elapsed 0.483 total
 sanity                                             0.010 elapsed 0.493 total
 order                                              0.010 elapsed 0.503 total
 sanity                                             0.008 elapsed 0.511 total
 copy files                                         0.110 elapsed 0.621 total
 tt init                                            0.078 elapsed 0.699 total
 lurker output                                      0.998 elapsed 1.697 total
 strand                                             0.009 elapsed 1.705 total
 splicing threads in 1 places
 deep threads split up                              0.010 elapsed 1.716 total
 sanity                                             0.008 elapsed 1.724 total
 order                                              0.011 elapsed 1.734 total
 regular thread indexes                             0.270 elapsed 2.004 total
 date indexes                                       0.263 elapsed 2.267 total
 messages                                           1.928 elapsed 4.195 total

You'll have a london.pm folder, not unlike this one

the steps

load

Pulls all the messages from the source folder.

Email::Folder buys us some flexibility here - we didn't have to do any special handling for mboxes as opposed to maildirs.

dedupe

Drop things with duplicate message-ids. This is because some mboxes are dirty (and Mail::Thread will choke else)

thread

Call out to Mail::Thread, which implements jwz's message threading algorithm.

sanity

Check every message that we had after discarding is reachable via the thread tree. We do that a few times just to be sure.

order

Sort the threads datewise

lurker output

 Traditional        Lurker
 a                  a--+
 |- b               |  b--+
 |  |- c            e  |  |
 |  `- d               c  |
 `- e                     d
 Date order: a b e c d

strand

Wander the tree setting up the prev and next relations of the messages.

deep threads split up

Folds over-deep thread cascades

 a               *
 `-b             |-a
   `-c           | `-b
     `-d         |   `-c
       `-e       `-d
                   `-e

If we declare point d to be too deep we transform the tree.

generate

Output generation.

TODO

Speedups.

In adding features we've been consistently getting slower.

comparative benchmarks

Write some documentation on how to install with your existing mailman system