=meta link_base /~richardc/talks/siesta

# 100 while writing, 1 when released

=meta consider_old 100

=head1 Mariachi, the not really Siesta bit

=head2 Start

=over

L<image:el mariachi|el-mariachi.jpeg>

=item

=back

=head2 It's like

=over

=item

pipermail

=item

L<mhonarc|http://www.mhonarc.org/>

=item

L<hypermail|http://www.hypermail.org/>

=back

=head2 Apart from

=over

=item

it's in perl

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

=item

it does Template Toolkit

=item

it's name is Jose

(or lists have to come in threes)

=back

=head2 It's a Siesta project

=over

=item

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',
    );

=item

L<CPANPLUS> is still your friend

=back

=head2 Usage

=over

=item

 % cpanp --prereqs i Mariachi

time passes

=item

 % 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

=item

You'll have a london.pm folder, not unlike L<this one|london.pm/>

=back

=head2 the steps

=over

=item 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.

=item dedupe

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

=item thread

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

=item 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.

=item order

Sort the threads datewise

=item lurker output

 Traditional        Lurker
 a                  a--+
 |- b               |  b--+
 |  |- c            e  |  |
 |  `- d               c  |
 `- e                     d

 Date order: a b e c d


=item strand

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

=item deep threads split up

Folds over-deep thread cascades

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

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

=item generate

Output generation.

=back

=head2 TODO

=over

=item

Speedups.

In adding features we've been consistently getting slower.

=item

comparative benchmarks

=item

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

=back

=head1 Footer

Mariachi, the not really Siesta bit.  E<copy> 2003, Richard Clamp
