#!/usr/bin/perl

#
#  Nicolas Rachinsky <nr-0@rachinsky.de> 
#
#   BSD-style copyright and standard disclaimer applies.
#
#
#   first param is a directory containing mailboxes
#   the script recurses all directories and in all Maildir mailboxes
#   all old/unread messages are made new messages
#
#   if a second parameter is given and equals "flag" then are also all
#   flagged messages made new (the flag is preserved)
#
#   works ONLY for Maildirs
#   minimal errorchecking



$flag=0;
$flag=1 if($ARGV[1] eq "flag");

hangel($ARGV[0]);

sub hangel
{
	my ($dir)=@_;
	my (@dir);
	
	opendir DIR,$dir or die $dir;
	@dir=grep {!/^\.\.?$/} readdir DIR;
	closedir DIR;

	$cur=$new=$tmp=0;
	for($i=0;$i<@dir && @dir==3;$i++)
	{
		last if(!-d $dir.$dir[$i]);
		$cur++ if($dir[$i] eq "cur");
		$new++ if($dir[$i] eq "new");
		$tmp++ if($dir[$i] eq "tmp");
	}
	
	if($cur==1 && $new==1 && $tmp==1)
	{
		do_dir($dir);
	}
	else
	{
		for(@dir)
		{
			hangel($dir.$_."/") if(-d $dir.$_);
		}
	}
}

sub do_dir
{
	my ($dir)=@_;

	opendir DIR,$dir."cur" or die $dir."cur";
	@dir=grep {!/^\./} readdir DIR;
	closedir DIR;
	
	for(@dir)
	{
		if(!/:2,.*S.*$/ || ($flag && /:2,.*F.*$/))
		{
			$t=$_;
			$t=~s/:2,(.*)S(.*)$/:2,\1\2/ if $flag;
			die "${dir}new/$t" if(-e "${dir}new/$t");
			rename ("${dir}cur/$_","${dir}new/$t") unless (-e "${dir}new/$t");
		}
	}
}
