#!/usr/bin/perl -w

use strict;

use vars qw(@dirs $prefix
$repos $rev $author
$email $anoncopy
	    $rt
);

$email = "";
$anoncopy = "";
$rt = 0;

### Subroutines
# get the result of a command; fail if it does.
sub cmdres($) {
  my ($cmd) = @_;
  my $result = `$cmd`;
  die "$0: $cmd failed with wait status $?\n" if $?;
  $result;
}

###main program


use Getopt::Long;
unless (GetOptions (
		    "repos=s" =>\$repos,
		    "email=s" => \$email,
		    "rt" => \$rt,
		    "anoncopy=s" => \$anoncopy,
		    "rev=i" => \$rev)) {
  die "Getopt failed, stopped ";
}

$author = cmdres("svnlook author -r $rev $repos");
chomp $author;

@dirs = split("\n", cmdres("svnlook dirs-changed -r $rev $repos"));

if (0) {
open(ZWRITE, "|/usr/athena/bin/zwrite -n -d -q tlyu");
print ZWRITE <<EOF;
repos: $repos
email: $email
rt: $rt
anoncopy: $anoncopy
rev: $rev
author: $author
dirs: @dirs
env: @{[%ENV]}
id: @{[`/usr/bin/id -a`]}
attach: @{[`/bin/athena/attach`]}
klist: @{[`/usr/athena/bin/klist`]}
EOF
close(ZWRITE);
}

$prefix = $dirs[0];
foreach my $dir (@dirs) {
  
  my $lc;
  inner: for ($lc = 0;
       ($lc < length($dir)) && ($lc < length($prefix));
       $lc++) {
    if (substr($prefix, $lc,1) ne substr($dir, $lc, 1)) {
      last inner;
    }
  }
  $prefix = substr($prefix, 0, $lc);
  # It is OK for the prefix to be a complete directory
# or to be some component that in a full directory prefix
  next if $prefix eq $dir;
  if ($prefix =~ m:(.*)/.*$:) {
    $prefix = $1."/";
  } else {
    $prefix = "";
    }
}

foreach my $dir (@dirs) {
substr($dir, 0, length($prefix)) = "";
$dir =~ s:^/::;
}

# we do not wish to send out email on commits to user directories
# by the author of that directory.
if ($prefix =~ m:users/$author/:) {
  $email = 0;
}

if ($email) {
  my $dirs = join(" ", $prefix, @dirs);
  if (length($dirs) >= 60) {
  substr($dirs, 60) =~ s: .*$: ...:;
}
  open(EMAIL, "|/usr/lib/sendmail -t")
    or die "Failed to open /usr/lib/sendmail: $!, stopped ";
  print EMAIL <<eof;
To: $email
Subject: svn rev #$rev: $dirs

eof
  print EMAIL "Commit By: " . $author."\n";
  print EMAIL "Log Message: \n";
print EMAIL cmdres("svnlook log -r $rev $repos");
  print EMAIL "\n\nChanged Files:\n";
  print EMAIL cmdres("svnlook changed  -r $rev $repos");
  close EMAIL;
}

if ($rt) {
    my $user =     cmdres("svnlook author -r $rev $repos");
    chomp $user;
mkdir "/tmp/ssh-drool-$user";
$ENV{HOME} = "/tmp/ssh-drool-$user";
  system("/usr/bin/cp", "/cvs/krbdev/CVSROOT/krbsnap_key", "$ENV{HOME}/identity");
  system("/usr/bin/chmod", "600", "$ENV{HOME}/identity");
  open (RT, "|/usr/athena/bin/ssh -v -v -1 -oStrictHostKeyChecking=no -i $ENV{HOME}/identity -l rtcvs "
."-F /dev/null "
."-o KerberosTgtPassing=no "
."-o UserKnownHostsFile=/tmp/ssh-known-hosts-$user  "
."krbdev.mit.edu /var/rt2/bin/rt-cvsgate $user 2>/tmp/commit-spew-$$") or system("/usr/athena/bin/zwrite", "-n", "-d", "-q", "tlyu", "-m", "ssh pipe open failed status $?");

print RT cmdres("svnlook log -r $rev $repos");
  print RT "Commit By: " . cmdres("svnlook author -r $rev $repos")."\n";
print RT "\n\nRevision: $rev\n";
  print RT "Changed Files:\n";
print RT   cmdres("svnlook changed  -r $rev $repos");
close RT;
# system("/usr/athena/bin/zwrite", "-n", "-d", "-q", "tlyu", "-m", "ssh exit status $?");
}


if ($anoncopy) {
  my $lockfile = $anoncopy."/anonymous-lock";
  if (mkdir ($lockfile)) {
    $@ = "";
    eval {
      my $anon_youngest = cmdres("svnlook youngest $anoncopy");
      my $youngest = cmdres("svnlook youngest $repos");
      chomp $youngest;
      chomp $anon_youngest;
      if ($youngest > $anon_youngest) {
$anon_youngest++; # dumping from n to no includes one revision in svn
	cmdres("svnadmin dump -q --incremental --deltas -r$anon_youngest:$youngest $repos |svnadmin load -q $anoncopy");
      }
      };

    rmdir $lockfile;
    die $@ if $@;
	}
}



1;
