#!/usr/bin/perl -w

# Script to generate a single list of files below a specific directory
# Used for Mutt's mailboxes options
# e.g. mailboxes `mailboxes.pl ~/Mail outbox`
# Parameters are 
# 1. Directory to recurse from e.g. ~/Mail
# 2. Filenames to ignore (comma separated list) e.g. outbox,oldmail

# Written by Darren Greaves <darren@krapplets.org>
# http://krapplets.org/linux/


use strict;

my $dir = $ARGV[0];
my $ignore = $ARGV[1];
my $entry = "";
my $list = "";
my @filter = ();

if (!defined($dir))
{
        print STDERR "Usage: mailboxes.pl <directory to recurse from>";
        print STDERR " [comma separated list of files to ignore]\n";
        exit;
}

if (defined($ignore))
{
    @filter = split (/,/, $ignore);
}

&checkDir(\$dir, \$list, \@filter);

print "$list\n";

sub checkDir ($dir, $list, @filter)
{
    my ($dir, $list, $filter) = @_;
    my @files = ();

    opendir(DIR, $$dir) || die ("Unable to open $dir as a directory $!");

    # As this function is recursive and the DIR variable is global
    # The recursive reading of directories breaks
    # So, read it into a local array for each recursive call
    while (defined($entry = readdir(DIR)))
    {
        push (@files, $entry);
    }

    close (DIR);

    foreach $entry (@files)
    {
        if (! -d "$$dir/$entry")
        {
            if (&filter(\$entry, \@$filter) == 1)
            {
                $$list .= " " . "$$dir/$entry";
            }
        }
        else
        {
            if ($entry !~ /^\.{1,2}$/)
            {
                if (&filter(\$entry, \@$filter) == 1)
                {
                    my $newdir = "$$dir/$entry";
                    &checkDir (\$newdir, \$$list, \@filter)
                }
            }
        }
    }

}

sub filter ($entry, @filter)
{
    my $allow = 1;
    my ($entry, $filter) = @_;

    foreach $_ (@$filter)
    {
        if ($$entry eq $_)
        {
            $allow = 0;
        }
    }

    return $allow;
}
