#!/bin/sh
exec perl -x -S $0 ${1+"$@"} # -*-perl-*-
#!perl -w
# script to upgrade sievedir from imapd 1.6.13
# make sure you run it as the cyrus user
#!/usr/bin/perl
# $Id: upgradesieve,v 1.2 1999/10/12 03:17:17 leg Exp $

if ($] !~ /^5\..*/) {
  # uh-oh. this isn't perl 5.
  foreach (split(/:/, $ENV{PATH})) { # try to find "perl5".
    exec("$_/perl5", "-x", "-S", $0, @ARGV) if (-x "$_/perl5");
  }
  # we failed. bail.
  die "Your perl is too old; I need perl 5.\n";
}

# load the real script. this is isolated in an 'eval' so perl4 won't
# choke on the perl5-isms.
eval join("\n", <DATA>);
if ($@) { die "$@"; }

__END__
require 5;

$| = 1;

if ("-f" eq $ARGV[0]) {
    $force = 1;
    shift @ARGV;
}
if ("-h" eq $ARGV[0] || $#ARGV > 0) {
    print "usage: upgradesieve [-f] [imapd.conf]\n";
    print "       -f keep going on errors\n";
    exit;
}

sub ouch {
    my $msg = shift;

    if ($force) {
	print "error: $msg\n";
    } else {
	print "fatal error: $msg\n";
	exit 1;
    }
}

$imapdconf = shift || "/etc/imapd.conf";

$sievedir = "/usr/sieve";

open CONF, $imapdconf or die "can't open $imapdconf";
while (<CONF>) {
    if (/^sievedir:\s(.*)$/) {
	$sievedir = $1;
	print "you are using $sievedir as your sieve directory.\n";
    }
}
close CONF;

print "upgrading sievedir $sievedir...";
chdir $sievedir or die "couldn't change to $sievedir";
foreach $i ("a".."z") {
    print "$i ";
    if (chdir $i) {
	ouch "couldn't move to $i";
	next;
    }
    opendir (D, ".");
    while ($f = readdir D) {
	if ($f =~ /^\./s) { next; }

	rename($f, ".$f")
	    or ouch "couldn't move $f to .$f";

	mkdir ($f, 0755)
	    or ouch "couldn't mkdir $f";

	rename(".$f", "$f/$f.script")
	    or ouch "couldn't move .$f to $f/$f.script";

	link("$f/$f.script", "$f/default")
	    or ouch "couldn't link $f.script to default";
    }
    closedir D;

    chdir "..";
}

print "done\n";
