<%ARGS> $rev <%init> unless ( $rev =~ /^(\d+)$/ ) { $m->out("Numeric revision needed"); $m->abort(); } my $REPO = $RT::SvnRepository || "svn://localhost/"; my $LOOK = $RT::PathToSvn; my $CHANGE_URI = $REPO . "@" . $rev; unless (-f $LOOK && -x $LOOK ) { die "Couldn't find your svn binary ('$LOOK')"; } open( SVNLOOK, "$LOOK log $REPO -r $rev|" ) || die $@; my $dashes = ; my $data = ; my ( $revision, $actor, $foo ); if ( $data =~ /^r(\d+)\s*\|\s*(.*?)\s*\|/ ) { $revision = $1; $actor = $2; } unless ( $rev == $revision ) { die "$LOOK log $REPO -r $rev\n$rev is not $revision\n$data" ; } my @msg = ; $dashes = pop(@msg); close(SVNLOOK); my $user = RT::CurrentUser->new($actor); unless ( $user->id ) { $user->LoadByCols( Gecos => $actor ); } unless ( $user->id ) { die "Unknown user"; } my $ticket; my $update_msg = ''; my $update_type = 'comment'; my $update_status = ''; my $update_owner = ''; my %set; foreach my $line (@msg) { if ( $line =~ /^\s*RT-Ticket:\s*(\w*?)(?:\#?)(\d*)/ ) { next if ($1 && $1 !~ /^$RT::rtname$/i); $ticket = RT::Ticket->new($user); $ticket->Load($2); } elsif ( $line =~ /^\s*RT-Status:\s*(\w+)/i ) { $update_status = lc($1); } elsif ( $line =~ /^\s*RT-(?:Update|Action):\s*(comment|correspond)/i ) { $update_type = lc($1); } elsif ( $line =~ /^\s*RT-Owner:\s*(\w+)/i ) { $update_owner = $1; } elsif ( $line =~ /^\s*RT-(\w+):\s*(\w+)/i ) { $set{$1} = $2; } else { $update_msg .= $line; } } if ( $ticket && $ticket->id ) { my $refers_to = $ticket->RefersTo; while ( my $refer = $refers_to->Next ) { if ( $refer->TargetURI->URI eq $CHANGE_URI ) { $RT::Logger->error( "Attempt to apply $CHANGE_URI which was already applied"); $m->out("Attempt to apply $CHANGE_URI which was already applied"); $m->abort(); return (); } } $ticket->AddLink( Type => 'RefersTo', Target => $CHANGE_URI ); $m->out( "Added link to $CHANGE_URI\n" ); $update_msg = "Subversion update $REPO\@$rev \n" . $update_msg; $update_type = ucfirst($update_type); $ticket->$update_type( Content => $update_msg ); $m->out( "Added commit text as $update_type\n" ); if ($update_owner) { my ($status, $msg) = $ticket->SetOwner($update_owner); $m->out( "Set owner to $update_owner\n" ); $m->out( "Failed: $msg\n" ) unless $status; } if ($update_status && $ticket->QueueObj->IsValidStatus($update_status)) { $ticket->SetStatus($update_status); $m->out( "Set status to $update_status\n" ); } if (keys %set) { for my $k (keys %set) { my $meth = "Set$k"; $ticket->$meth($set{$k}); $m->out( "Set $k to $set{$k}\n" ); } } } $m->abort();