#!/usr/bin/env perl
our
(
$mydir
,
$myname
);
BEGIN {
my
$location
= (-l $0) ? abs_path($0) : $0;
$location
=~ /(.*?)([^\/]+?)_?\z/s or
die
"?"
;
(
$mydir
,
$myname
) = ($1, $2);
}
sub
usage {
print
"usage: rootdir
Print all directories below rootdir that follow the Maildir or
";
exit
1;
}
our
$verbose
= 0;
GetOptions(
"verbose"
=> \
$verbose
,
"help"
=>
sub
{usage},) or
exit
1;
usage
unless
@ARGV
== 1;
my
(
$rootdir
) =
@ARGV
;
{
sub
xprintln(
$self
) {
print
STDERR
$self
->path,
": "
,
$self
->message,
"\n"
}
_END_
}
{
sub
xprintln(
$self
) {
print
STDOUT
$self
->path,
"\n"
or
die
$!;
}
_END_
}
my
$is_gitdir_subdirs
= list
qw(refs branches objects info)
;
sub
is_gitdir(
$path
) {
$path
=~ /\.git\z/ and
$is_gitdir_subdirs
->all(
sub
{ -d
"$path/$_[0]"
})
}
sub
is_maildir(
$path
) { (-d
"$path/cur"
and -d
"$path/new"
and -d
"$path/tmp"
) }
sub
is_maildir_plusplus_subfolder(
$path
) {
-f
"$path/maildirfolder"
and is_maildir
$path
}
sub
find_below (
$path
,
$pred
) {
my
(
$fold_path
,
$fold_dirpath
) = fixn(
fun(
$fold_path
,
$fold_dirpath
,
$path
,
$rest
)
{
my
$s
= xlstat
$path
;
if
(
$s
->is_dir) {
if
(
&$pred
(
$path
)) {
cons(find_maildirs::Success->new(
$path
),
$rest
)
}
else
{
&$fold_dirpath
(
$path
,
$rest
)
}
}
else
{
$rest
}
},
fun(
$fold_path
,
$fold_dirpath
,
$path
,
$rest
) {
if
(
my
(
$s
) = perhaps_directory_paths(
$path
)) {
stream_fold_right(
$fold_path
,
$rest
,
$s
)
}
else
{
cons(find_maildirs::Failure->new(
$path
,
"$!"
),
$rest
)
}
}
);
&$fold_dirpath
(
$path
, null)
}
my
$s
= find_below(
$rootdir
, \
&is_maildir
);
$s
->for_each(the_method
"xprintln"
);