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 = *