@rem = '-*- Perl -*-'; @rem = ' @if "%overbose%" == "" echo off setlocal for %%i in (oenvtest.bat) do @call %%~$PATH:i set ARGS= %* call perl%OPERLOPT% -w %~dpnx0 %ARGS:/?=-?% goto :eof '; # # REVIEWD - Source Depot review daemon # # See sub Usage for details. # # Author: smueller # # # External dependencies # BEGIN { if (exists $ENV{OTOOLS}) { # set library path for OTOOLS environment my $l="$ENV{OTOOLS}\\lib\\perl"; @INC=($l,"$l\\$ENV{PROCESSOR_ARCHITECTURE}") }} BEGIN { if (exists $ENV{'sdxroot'}) { require $ENV{'sdxroot'} . '\TOOLS\sendmsg.pl'; }} require 5; use strict; use Getopt::Long; use Office::SD 0.78; use vars qw($fDebug @ports %counters $counter $sleep @describe); # # Utilities # # # Usage - Display detailed usage information and exit. # sub Usage { print < $port); # highest numbered change seen, for updating the counter each iteration my $nclMax = 0; # retrieve new changes #Debug("COMMAND: sd -p $port review -t $counter\n"); my $rchanges = SDReview(\"-t $counter"); next if ! defined $rchanges; # no new submitted changes foreach my $rc (@$rchanges) { # for each newly submitted change list Debug("CHANGE=$rc->{Change}; USER=$rc->{User}; EMAIL=$rc->{Email}; FULLNAME=$rc->{FullName}\n"); warn "reviewd: processing port $port, change $rc->{Change}...\n"; # retrieve users interested in change #Debug("COMMAND: sd -p $port reviews -c $rc->{Change}\n"); my $rusers = SDReviews(\"-c $rc->{Change}"); next if ! defined $rusers; # no interested users my @reviewers; foreach my $ru (@$rusers) { # for each user interested in this change Debug("USER=$ru->{User}; RAWEMAIL=$ru->{Email}; FULLNAME=$ru->{FullName}\n"); my ($email) = $ru->{Email} =~ /^.*\\(\S*)\@.*$/; $email = $ru->{Email} if ! defined $email || $email eq ''; Debug("USER=$ru->{User}; EMAIL=$email; FULLNAME=$ru->{FullName}\n"); push @reviewers, $email; } # send submitter and describe output to any interested parties if (@reviewers) { # collect raw describe output using Collect callback my $rconfigSav = ConfigSD(echo => echoText | echoInfo, echofunc => \&Collect); @describe = (); my $rchange = SDDescribe(\'-s', $rc->{Change}); ConfigSD($rconfigSav); # format header fields my $description1 = $rchange->{Description}; $description1 =~ s/\n.*//; # get first line only my $subject = "$rchange->{User}: #$rc->{Change}: $description1"; my $body = join '', @describe; my $sender = 'NtSourceDepotReview'; # Send mail to the reviewers Debug("COMMAND: sendmsg -e -m $sender, $subject, $body, @reviewers\n"); if (exists $ENV{'sdxroot'}) { my $ret = sendmsg('-v', '-m', $sender, $subject, $body, @reviewers); } else { print "From: $sender\nTo: @reviewers\nSubject: $subject\n\n$body\n"; } } $nclMax = $rc->{Change}; Debug("TOPCHANGE: $nclMax\n"); } # # Update review marker to reflect changes reviewed. # #Debug("COMMAND: sd -p $port counter $counter $nclMax\n") if $nclMax; SDSetCounter($counter, $nclMax) if $nclMax; } } # # Daemon - Loop, work, wait # sub Daemon { my($counter, $sleep) = @_; Debug("COUNTER: $counter\n"); Debug("SLEEP: $sleep\n"); for (;;) { ReviewChanges($counter); Debug("SLEEPING $sleep SECONDS...\n"); sleep($sleep); } } # # main # Usage if ! GetOptions('h|?', \&Usage, 'd', \$fDebug, 'p=s@', \@ports) || @ARGV != 2; # enable debug output if appropriate ConfigSD(verbose => 1) if $fDebug; # validate ports if (@ports == 0) { my $rset = SDSet(); if (exists $rset->{SDPORT}) { @ports = ($rset->{SDPORT}); warn "reviewd: no ports specified; defaulting to $ports[0]\n"; } } foreach my $port (@ports) { ConfigSD(port => $port); if (! defined SDInfo()) { warn "reviewd: port $port appears bogus, skipping\n"; $port = 'BOGUS:0000'; } } @ports = grep $_ ne 'BOGUS:0000', @ports; if (@ports == 0) { die "reviewd: no valid ports specified\n"; } # validate counter -- assume if first depot has it, all do ConfigSD(port => $ports[0]); $counter = $ARGV[0]; %counters = SDCounters(); die SDError() if SDError(); die "No such counter '$counter'.\n" if ! exists $counters{uc $counter}; $sleep = $ARGV[1]; $sleep = 1 if $sleep == 0; $sleep *= 60; # convert to seconds Daemon($counter, $sleep); exit 0; # never get here