#!/usr/bin/perl use strict; use warnings; use DateTime; use File::Copy; use Data::Dumper; my $bin_dir; my $dist_dir; BEGIN { use Cwd; use File::Basename; $bin_dir = dirname(__FILE__); $bin_dir = Cwd::abs_path($bin_dir); ($dist_dir = $bin_dir) =~ s/bin\/?$//; } use lib ($dist_dir, $bin_dir); use GOBO::FileCompareExtras; use GOBO::Logger; my $logger; $logger = GOBO::Logger::get_logger(); #$logger->error("\@inc: " . join(", ", @INC)); #exit(0); ## read in our config my $defaults = GOBO::FileCompareExtras::get_config( $dist_dir ); if (! $defaults) { $logger = GOBO::Logger::get_logger(); $logger->logdie("No default settings found. Dying!"); } my %vars = ( %$defaults ); ## specific settings to substitute in if using the "gwg" settings my %gwg_vars = ( temp_dir => $ENV{HOME} . '/temp/', cvs_cmd => 'cvs -q -d :ext:aji@ext.geneontology.org:/share/go/cvs', ); my $d1; my $cmd; my $status; my $d_like; if (@ARGV) { my @args = @ARGV; if (grep { $_ eq 'gwg' } @args) { foreach (keys %gwg_vars) { $vars{$_} = $gwg_vars{$_}; } } ## emulate only; no cvs checkouts or commits if (grep { $_ eq '-e' } @args) { $vars{emulate} = 1; } ## no cvs commits but allow checkouts if (grep { $_ eq '-n' } @args) { $vars{no_cvs} = 1; } ## only do the Saturday reports if (grep { $_ eq '-s' } @args) { $vars{sat_only} = 1; } ## verbose if (grep { $_ eq '-v' } @args) { GOBO::Logger::init_with_config( 'verbose' ); $logger = GOBO::Logger::get_logger(); } else { GOBO::Logger::init_with_config( 'standard' ); $logger = GOBO::Logger::get_logger(); } my ($day, $mon, $year); ## parse incoming dates while (@args) { my $d_arg = shift @args; if ($d_arg =~ /^(\d\d*)[\/-](\d\d*)[\/-](\d{4})$/) { ($day, $mon, $year) = ($1, $2, $3); $d_like++; } elsif ($d_arg =~ /^(\d{4})[\-\/](\d\d*)[\-\/](\d\d*)$/) { ($day, $mon, $year) = ($3, $2, $1); $d_like++; } } ## date-like input but not enough date info if ($d_like) { if (! $day || ! $mon || ! $year ) { $logger->logdie("Insufficient data to proceed! " . ($day || "DD" ) ."-".($mon||"MM")."-".($year||"YYYY")); } $d1 = DateTime->new( year => $year, month => $mon, day => $day ); $logger->info("date: " . $d1->ymd); } } if (! $logger) { $logger = GOBO::Logger::get_logger(); } ## no d1; assume that the date is today. if (! $d1) { ## get today's date and then find out if we have the files we need. $d1 = DateTime->now(); # $logger->info("now: " . $d1->ymd); } ## d2 is yesterday my $d2 = $d1->clone->subtract( days => 1 ); #$logger->info("yesterday: " . $d2->ymd); ## d3 is one week ago my $d3; if ($d1->day_abbr eq 'Sat') { # we're on a Saturday so need to save the file # also need the previous week's file to do the report $d3 = $d1->clone->subtract( days => 7 ); # $logger->info("one week ago: " . $d3->ymd); } chdir $vars{cvs_repo}; $logger->info("moving to $vars{cvs_repo}"); my $fh; my @test_list = ($d1, $d2); my $today = $d1->day_abbr; if ($today eq 'Sat') { push @test_list, $d3; } if ($vars{sat_only} && $today ne 'Sat') { $logger->logdie("Saturday reporting only mode; today is not Saturday. Dying") } my @get_list; foreach my $d (@test_list) { $fh->{ $d->ymd } = $vars{temp_dir} . "go-".$d->ymd.".obo"; if (-e $vars{temp_dir} . "go-".$d->ymd.".obo" && ! -z $vars{temp_dir} . "go-".$d->ymd.".obo" ) { ## ok, we have it $logger->info("Found " . $vars{temp_dir} . "go-".$d->ymd.".obo"); } else { push @get_list, $d->ymd; } } if (scalar @get_list > 0) { foreach (@get_list) { $cmd = $vars{cvs_cmd} . ' checkout -D '. $_ .' go/ontology/editors/gene_ontology_write.obo'; $logger->info("cmd: $cmd"); $status = `$cmd 2>&1` unless $vars{emulate}; $logger->info("status: " . ($status || "none")); if ($status && $status =~ /\w/) { $logger->info("status: $status"); if ($status !~ /[UA] .*?gene_ontology_write.obo/) { $logger->logdie( "Problem with CVS: $status" ); } } move($vars{cvs_repo}."/go/ontology/editors/gene_ontology_write.obo", $vars{temp_dir} . "go-" . $_ . ".obo") unless $vars{emulate}; $logger->info("moving go/ontology/editors/gene_ontology_write.obo to " . $vars{temp_dir} . "go-" . $_ . ".obo"); } } chdir $dist_dir; $logger->info("moving to $dist_dir"); ## if it is a weekday, just generate the rss feeds ## comp_files_scr if (! $vars{sat_only}) { $cmd = "perl bin/compare-obo-files.pl -f1 " . $fh->{$d2->ymd} . " -f2 " . $fh->{$d1->ymd} . " -m rss email"; if ($vars{verbose}) { $cmd .= " -v"; $logger->info("cmd: $cmd"); } $status = `$cmd 2>&1` unless $vars{emulate}; $logger->info("status: " . ($status || "none")); ## run the def differ report $cmd = "perl bin/compare-defs.pl -c -f1 " . $fh->{$d2->ymd} . " -f2 " . $fh->{$d1->ymd} . " -m rss email"; if ($vars{verbose}) { $cmd .= " -v"; $logger->info("cmd: $cmd"); } $status = `$cmd 2>&1` unless $vars{emulate}; $logger->info("status: " . ($status || "none")); ## commit the rss files chdir $vars{cvs_repo}; $logger->info("moving to $vars{cvs_repo}"); $cmd = $vars{cvs_cmd} . ' ci -m "Automated RSS updates" go/www/rss/*'; $logger->info("cmd: $cmd"); $status = `$cmd 2>&1` unless ($vars{emulate} || $vars{no_cvs}); $logger->info("status: " . ($status || "none")); } if ($today ne 'Sat') { if ($today ne 'Sun') { ## delete the $d2 file unlink $fh->{ $d2->ymd } || warn "Could not remove " . $fh->{ $d2->ymd } . ": $!"; } exit(0); } ## Weekly ## run the reports and the def differ ## create a directory for the reports if (! -e $vars{cvs_repo}.'/'.$vars{report_dir}) { mkdir $vars{cvs_repo}.'/'.$vars{report_dir}; } else { $logger->info("Directory $vars{cvs_repo}/$vars{report_dir} already exists!"); } if (! -e $vars{cvs_repo} .'/'. $vars{report_dir} . $d1->ymd) { $logger->info("Running mkdir $vars{report_dir}". $d1->ymd . ""); mkdir $vars{cvs_repo}.'/'.$vars{report_dir} . $d1->ymd; } else { $logger->info("Directory $vars{cvs_repo}/$vars{report_dir}" . $d1->ymd . " already exists!"); } chdir $dist_dir; $logger->info("moving to $dist_dir"); ## comp_files_scr $cmd = "perl bin/compare-obo-files.pl -f1 " . $fh->{$d3->ymd} . " -f2 " . $fh->{$d1->ymd} . " -m text html -o "; ## run the weekly ontology reports foreach my $c ( $vars{cvs_repo}.'/'.$vars{report_dir} . $d1->ymd . "/weekly-" . $d1->ymd . " -l l", $vars{cvs_repo}.'/'.$vars{report_dir} . $d1->ymd . "/weekly-med-" . $d1->ymd ) { if ($vars{verbose}) { $c .= " -v"; $logger->info("cmd: $cmd$c"); } $status = `$cmd$c 2>&1` unless $vars{emulate}; $logger->info("status: " . ($status || "none")); if ($status) { ## oh crap, something went wrong... } } ## run the def differ report $cmd = "perl bin/compare-defs.pl -f1 " . $fh->{$d3->ymd} . " -f2 " . $fh->{$d1->ymd} . " -c -o " . $vars{cvs_repo}.'/'.$vars{report_dir} . $d1->ymd . "/weekly-defs-" . $d1->ymd . ".html"; if ($vars{verbose}) { $cmd .= " -v"; $logger->info("cmd: $cmd"); } $status = `$cmd 2>&1` unless $vars{emulate}; $logger->info("status: " . ($status || "none")); if ($status) { ## oh crap, something went wrong... if ($status =~ /The two files specified appear to be identical!/) { } } chdir $vars{cvs_repo}; $logger->info("moving to $vars{cvs_repo}"); ## add the files to cvs and then commit them $cmd = $vars{cvs_cmd} . ' add '. $vars{report_dir} . $d1->ymd . ' ; ' . $vars{cvs_cmd} . ' add '. $vars{report_dir} . $d1->ymd . '/weekly* ; ' . $vars{cvs_cmd} . ' ci -m "Automated report commits" ' . $vars{report_dir} . $d1->ymd . '/weekly*'; $logger->info("cmd: $cmd"); $status = `$cmd 2>&1` unless ($vars{emulate} || $vars{no_cvs}); $logger->info("status: " . ($status || "none")); if ($status) { ## oh crap, something went wrong... } ## clean up the files ## delete the $d2 and $d3 file unless ($vars{emulate}) { unlink $fh->{ $d2->ymd }, $fh->{ $d3->ymd }; } ## /home/user/local/bin/publish_news.pl -v -e -u myname -p mypass -t "Test Story 002" -b "This is the second story." -T "5,6" chdir $dist_dir; $logger->info("moving to $dist_dir"); my $pub_h = { u => 'gobot', p => 'rivphaw.8NT', title => "GO Weekly Ontology Report for " . join(" ", $d1->day, $d1->month_name, $d1->year ), T => "1,6,9", }; (my $report_url = $vars{report_dir}) =~ s/\/*go//; $report_url .= '/' unless substr($report_url, -1, 1) eq '/'; ## send an email about the new files $pub_h->{story} = 'Greetings GO ontology watchers, The following weekly ontology reports are now available: Ontology changes, full details: web page | text Ontology changes, less detailed: web page | text Definition changes: web page Please enjoy! '; $cmd = "perl bin/publish_news.pl -v -e " . join(" ", map { "-" . $_ . " '" . $pub_h->{$_} . "' " } keys %$pub_h); $logger->info("cmd: $cmd"); $logger->info("vars: " . Dumper(\%vars) . ""); exit(0);