You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jm...@apache.org on 2006/08/04 16:33:24 UTC
svn commit: r428735 - in /spamassassin/trunk: build/mkrules
masses/rule-qa/corpus-hourly masses/rule-qa/get-rulemetadata-for-revision
Author: jm
Date: Fri Aug 4 07:33:22 2006
New Revision: 428735
URL: http://svn.apache.org/viewvc?rev=428735&view=rev
Log:
preparation for bug 4984, 4985: add (still-disabled) infrastructure to track rule metadata, for use by the ruleqa web UI
Added:
spamassassin/trunk/masses/rule-qa/get-rulemetadata-for-revision (with props)
Modified:
spamassassin/trunk/build/mkrules
spamassassin/trunk/masses/rule-qa/corpus-hourly
Modified: spamassassin/trunk/build/mkrules
URL: http://svn.apache.org/viewvc/spamassassin/trunk/build/mkrules?rev=428735&r1=428734&r2=428735&view=diff
==============================================================================
--- spamassassin/trunk/build/mkrules (original)
+++ spamassassin/trunk/build/mkrules Fri Aug 4 07:33:22 2006
@@ -22,7 +22,7 @@
# http://wiki.apache.org/spamassassin/RulesProjPromotion
sub usage {
- die "mkrules/run [--src srcdir] [--out outputdir]\n";
+ die "build/mkrules [--src srcdir] [--out outputdir]\n";
}
my $RULE_KEYWORDS_RE = qr{
@@ -46,6 +46,7 @@
@opt_srcs $opt_out $opt_sandboxout $opt_manifest
$opt_manifestskip $opt_listpromotable $opt_active
$opt_activeout $opt_inactiveout $default_file_header
+ $opt_rulemetadata
);
GetOptions("src=s" => \@opt_srcs,
"out=s",
@@ -55,6 +56,7 @@
"active=s",
"manifest=s",
"manifestskip=s",
+ "rulemetadata=s",
);
if (!@opt_srcs) {
@@ -659,6 +661,8 @@
fix_up_rule_dependencies($rule);
}
+ my $rulemd = '';
+
# output the known rules that are not meta subrules.
foreach my $rule (@rulenames) {
next if ($rule =~ /^__/);
@@ -667,6 +671,7 @@
my $text = $rules->{$rule}->{output_text};
next unless defined ($text);
+ $rulemd .= get_rulemetadata_string($rule);
$output_file_text->{$pubfile} .= "##{ $rule\n".
$text.
"##} ".$rule."\n\n";
@@ -678,6 +683,7 @@
my $pubfile = $rules->{$rule}->{output_file};
my $text = $rules->{$rule}->{output_text};
next unless defined ($text);
+ $rulemd .= get_rulemetadata_string($rule);
$output_file_text->{$pubfile} .= $text;
}
@@ -693,6 +699,33 @@
# and get them lint-checked!
$files_to_lint->{$file} = 1;
}
+
+ if ($opt_rulemetadata) {
+ open (RULEMD, ">".$opt_rulemetadata)
+ or die "cannot write rulemd to $opt_rulemetadata";
+ print RULEMD "<rulemds>", $rulemd, "</rulemds>\n";
+ close RULEMD or die "cannot close rulemd to $opt_rulemetadata";
+ }
+}
+
+sub get_rulemetadata_string {
+ my ($rule) = @_;
+
+ return '' unless ($opt_rulemetadata);
+ return '' unless ($rules->{$rule}->{found_definition});
+
+ my $mod = 0;
+ my $srcfile = $rules->{$rule}->{srcfile};
+ my @s = stat $srcfile;
+ if (@s) {
+ $mod = $s[9];
+ }
+
+ return "<rulemetadata>".
+ "<name>$rule</name>".
+ "<src>$srcfile</src>".
+ "<srcmtime>$mod</srcmtime>".
+ "</rulemetadata>\n";
}
sub fix_up_rule_dependencies {
Modified: spamassassin/trunk/masses/rule-qa/corpus-hourly
URL: http://svn.apache.org/viewvc/spamassassin/trunk/masses/rule-qa/corpus-hourly?rev=428735&r1=428734&r2=428735&view=diff
==============================================================================
--- spamassassin/trunk/masses/rule-qa/corpus-hourly (original)
+++ spamassassin/trunk/masses/rule-qa/corpus-hourly Fri Aug 4 07:33:22 2006
@@ -194,6 +194,9 @@
else {
print "$corpusdir/$file: rev=$daterev time=$time{$file} (set 0)\n";
}
+
+ # TODO: complete this work
+ # get_rulemetadata_for_revision($daterev, $revision{$file});
}
}
@@ -489,5 +492,30 @@
$str =~ s/\s+/ /gs; # on a single line please
return '<mclogmds>'.$str.'</mclogmds>';
+}
+
+sub create_rulemetadata_dir {
+ my $rev = shift;
+ my $dir = "$opt{html}/rulemetadata/$rev";
+ if (!-d $dir) {
+ my $prevu = umask 0;
+ mkpath([$dir], 0, oct($opt{html_mode})) or warn "failed to mkdir $dir";
+ umask $prevu;
+ }
+ return $dir;
+}
+
+sub get_rulemetadata_for_revision {
+ my ($daterev, $rev) = @_;
+
+ my $dir = create_rulemetadata_dir($rev);
+
+ my $cmd = "./rule-qa/get-rulemetadata-for-revision ".
+ "--rev=$rev --outputdir='$dir'";
+
+ system($cmd);
+ if ($? >> 8 != 0) {
+ warn "'$cmd' failed";
+ }
}
Added: spamassassin/trunk/masses/rule-qa/get-rulemetadata-for-revision
URL: http://svn.apache.org/viewvc/spamassassin/trunk/masses/rule-qa/get-rulemetadata-for-revision?rev=428735&view=auto
==============================================================================
--- spamassassin/trunk/masses/rule-qa/get-rulemetadata-for-revision (added)
+++ spamassassin/trunk/masses/rule-qa/get-rulemetadata-for-revision Fri Aug 4 07:33:22 2006
@@ -0,0 +1,112 @@
+#!/local/perl586/bin/perl
+
+# get-rulemetadata-for-revision -- find out metadata for a given
+# rule revision, and store it in the filesystem for later access
+# by the ruleqa.cgi web UI. If the metadata is already in the fsys,
+# don't bother re-extracting it, as it's an expensive operation.
+
+# settings are located in $HOME/.corpus
+
+sub usage {
+ die qq{
+usage: get-rulemetadata-for-revision --rev=NNNNN
+ [--outputdir=/path/to/output/dir]
+};
+}
+
+use strict;
+use warnings;
+use Getopt::Long;
+use File::Path;
+use File::Copy;
+use Time::ParseDate;
+use Cwd;
+
+use vars qw(
+ $opt_outputdir
+ $opt_rev
+);
+GetOptions(
+ "rev=s" => \$opt_rev,
+ "outputdir=s" => \$opt_outputdir,
+);
+
+$opt_outputdir ||= '.';
+$opt_rev or usage();
+
+my $conf_file = "$ENV{HOME}/.corpus";
+my $outfile = "$opt_outputdir/rulemetadata.xml";
+my %conf;
+
+configure();
+if (already_cached()) {
+ print "rule metadata already cached: $outfile\n";
+ exit;
+}
+
+print "creating rule metadata file: $outfile\n";
+my $tmpdir = "/tmp/rulemd.$$";
+svn_and_build();
+copy_md($outfile);
+system ("rm -rf $tmpdir");
+exit;
+
+
+
+sub configure {
+ # does rough equivalent of source
+ open(C, $conf_file) || die "open failed: $conf_file: $!\n";
+ my $pwd = getcwd;
+
+ while (<C>) {
+ chomp;
+ s/#.*//;
+ if (/^\s*(.*?)\s*=\s*(.*?)\s*$/) {
+ my ($key, $val) = ($1, $2);
+ $val =~ s/\$PWD/$pwd/gs;
+ $conf{$key} = $val;
+ }
+ }
+ close(C);
+}
+
+sub already_cached {
+ return (-f $outfile && -s _ > 0);
+}
+
+sub svn_and_build {
+ mkdir $tmpdir, 0700 or die "cannot mkdir $tmpdir";
+
+ # note: copies .svn dir from the existing SVN checkout;
+ # that way, the path and credentials are preserved, just the
+ # revision number changes.
+ my $cmd;
+ $cmd = "cd $tmpdir; ".
+ "cp -pr $conf{tree}/.svn .svn; ".
+ "svn update --non-interactive -r$opt_rev < /dev/null";
+
+ print "[$cmd]\n";
+ system $cmd;
+ if ($? >> 8 != 0) { die "'$cmd' failed"; }
+
+ $cmd = "cd $tmpdir; ".
+ "perl Makefile.PL MKRULES_SWITCHES=--rulemetadata < /dev/null; ".
+ "make; ".
+ "perl build/mkrules --src rulesrc --out rules ".
+ "--rulemetadata=rules/rulemetadata.xml";
+
+ print "[$cmd]\n";
+ system $cmd;
+ if ($? >> 8 != 0) { die "'$cmd' failed"; }
+}
+
+sub copy_md {
+ my $outfile = shift;
+ my $infile = "rules/rulemetadata.xml";
+ if (!-f $infile) {
+ die "no $infile!";
+ }
+
+ copy ($infile, $outfile) or die "copy $infile $outfile failed";
+}
+
Propchange: spamassassin/trunk/masses/rule-qa/get-rulemetadata-for-revision
------------------------------------------------------------------------------
svn:executable = *