http://bugzilla.spamassassin.org/show_bug.cgi?id=3434

           Summary: Debug levels for sets are out of reach of API; none for
                    conf
           Product: Spamassassin
           Version: unspecified
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P3
         Component: Tools
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


The following patch (which I hope this text field treats well) implements a 
number of changes, all 
related to debug sets. I'll outline them here.

  - Creates a new set, 'conf', used by ::Conf* modules.
  - Adds a new option to Mail::SpamAssassin->new() called 'debug_level'.
  - Documents the new option and explains how debug sets work.
  - Allows salearn and spamassassin to modify debug levels for sets in the same 
way.
    - spamassassin had a hack on --debug to allow this, it has been left in 
place and
      options set with it will override --debug-set-level options to provide 
backward
      compatibility.
  - Tests Mail::SpamAssassin->new() debugging in new test file t/debug.t
  - Modifies all calls to dbg() from ::Conf* modules to include debug set and 
level info.
  - Updates MANIFEST to include new file
    (though my manifest order seems to be different and so the patch is funky).

Patch below.

-- 
Casey West

diff -Nru Mail-SpamAssassin-3.000000-orig/MANIFEST 
Mail-SpamAssassin-3.000000/MANIFEST
--- Mail-SpamAssassin-3.000000-orig/MANIFEST    Fri May 21 13:29:33 2004
+++ Mail-SpamAssassin-3.000000/MANIFEST Fri May 21 15:09:44 2004
@@ -1,31 +1,22 @@
 BUGS
-COPYRIGHT
-Changes
-INSTALL
-INSTALL.VMS
-LICENSE
-MANIFEST
-MANIFEST.SKIP
-Makefile.PL
-PACKAGING
-README
-STATUS
-TRADEMARK
-USAGE
-CREDITS
-build/README
 build/cf_to_html
 build/convert_pods_to_doc
 build/find_meta_missing_dependencies
 build/get_version
 build/preprocessor
+build/README
 build/tag_nightly_mc
 build/tag_weekly_mc
 build/update_devel
 build/update_stable
+build/update_website_docs
 contrib/mbox-to-check
 contrib/run-corpora
 contrib/run-masses
+COPYRIGHT
+CREDITS
+INSTALL
+INSTALL.VMS
 ldap/README
 ldap/README.testing
 ldap/sa_test.ldif
@@ -46,49 +37,50 @@
 lib/Mail/SpamAssassin/HTML.pm
 lib/Mail/SpamAssassin/Locales.pm
 lib/Mail/SpamAssassin/Locker.pm
-lib/Mail/SpamAssassin/Locker/UnixNFSSafe.pm
 lib/Mail/SpamAssassin/Locker/Flock.pm
+lib/Mail/SpamAssassin/Locker/UnixNFSSafe.pm
 lib/Mail/SpamAssassin/Locker/Win32.pm
 lib/Mail/SpamAssassin/MailingList.pm
 lib/Mail/SpamAssassin/Message.pm
-lib/Mail/SpamAssassin/Message/Node.pm
 lib/Mail/SpamAssassin/Message/Metadata.pm
 lib/Mail/SpamAssassin/Message/Metadata/Received.pm
+lib/Mail/SpamAssassin/Message/Node.pm
 lib/Mail/SpamAssassin/NetSet.pm
 lib/Mail/SpamAssassin/PerMsgLearner.pm
 lib/Mail/SpamAssassin/PerMsgStatus.pm
 lib/Mail/SpamAssassin/PersistentAddrList.pm
 lib/Mail/SpamAssassin/Plugin.pm
+lib/Mail/SpamAssassin/Plugin/Hashcash.pm
+lib/Mail/SpamAssassin/Plugin/RelayCountry.pm
+lib/Mail/SpamAssassin/Plugin/SPF.pm
 lib/Mail/SpamAssassin/Plugin/Test.pm
+lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm
 lib/Mail/SpamAssassin/PluginHandler.pm
 lib/Mail/SpamAssassin/Reporter.pm
 lib/Mail/SpamAssassin/SHA1.pm
 lib/Mail/SpamAssassin/SQLBasedAddrList.pm
 lib/Mail/SpamAssassin/TextCat.pm
 lib/Mail/SpamAssassin/Util.pm
-masses/CORPUS_POLICY
-masses/CORPUS_SUBMIT
-masses/CORPUS_SUBMIT_NIGHTLY
-masses/Makefile
-masses/README
-masses/README.perceptron
-masses/corpora/README
+lib/Mail/SpamAssassin/Util/RegistrarBoundaries.pm
+LICENSE
+MANIFEST                       This list of files
+MANIFEST.SKIP
 masses/corpora/fuzzy-hash-maildir
 masses/corpora/mass-find-nonspam
-masses/corpora/remove-tests-from-logs
+masses/corpora/README
 masses/corpora/uniq-mailbox
 masses/corpora/uniq-maildirs
+masses/CORPUS_POLICY
+masses/CORPUS_SUBMIT
+masses/CORPUS_SUBMIT_NIGHTLY
 masses/cpucount
 masses/extract-message-from-mbox
 masses/find-extremes
 masses/fp-fn-statistics
 masses/fp-fn-to-tcr
 masses/freqdiff
-masses/graphs/gen-score-freqs-gnuplot-table
-masses/graphs/gnuplot-score-graph
 masses/hit-frequencies
 masses/lint-rules-from-freqs
-masses/logs-to-c
 masses/mass-check
 masses/mass-check-results-to-mbox
 masses/mass-check.cf
@@ -96,31 +88,31 @@
 masses/mk-baseline-results
 masses/overlap
 masses/parse-rules-for-masses
-masses/perceptron.c
 masses/post-ga-analysis.pl
-masses/rewrite-cf-with-new-scores
+masses/README
+masses/README.perceptron
 masses/rule-dev/maildir-scan-headers
-masses/rule-qa/README.nightly
 masses/rule-qa/corpus-hourly
 masses/rule-qa/corpus-nightly
 masses/rule-qa/corpus-tagtime
 masses/rule-qa/markup-rules-file-with-freqs
 masses/rule-qa/post-bugs-for-retired-tests
+masses/rule-qa/README.nightly
 masses/runGA
-masses/score-ranges-from-freqs
 masses/tenpass/10pass-compute-tcr
 masses/tenpass/10pass-run
-masses/tenpass/README
 masses/tenpass/compute-current-tcr
-masses/tenpass/split-log-into-buckets
-masses/uniq-scores
+masses/tenpass/README
 ninjabutton.png
+PACKAGING
 procmailrc.example
+README
 rules/10_misc.cf
 rules/20_anti_ratware.cf
 rules/20_body_tests.cf
 rules/20_compensate.cf
 rules/20_dnsbl_tests.cf
+rules/20_drugs.cf
 rules/20_fake_helo_tests.cf
 rules/20_head_tests.cf
 rules/20_html_tests.cf
@@ -130,63 +122,63 @@
 rules/20_ratware.cf
 rules/20_uri_tests.cf
 rules/23_bayes.cf
+rules/25_body_tests_es.cf
+rules/25_hashcash.cf
+rules/25_spf.cf
+rules/25_uribl.cf
 rules/30_text_de.cf
 rules/30_text_fr.cf
-rules/50_scores.cf
+rules/30_text_nl.cf
+rules/30_text_pl.cf
 rules/60_whitelist.cf
+rules/init.pre
+rules/languages
+rules/local.cf
 rules/STATISTICS-set1.txt
 rules/STATISTICS-set2.txt
 rules/STATISTICS-set3.txt
 rules/STATISTICS.txt
-rules/languages
-rules/local.cf
-rules/regression_tests.cf
 rules/triplets.txt
 rules/user_prefs.template
 sa-learn.raw
 sample-nonspam.txt
 sample-spam.txt
-spamassassin.raw
-spamassassin.spec
-spamc/Makefile.in
-spamc/Makefile.win
-spamc/README.qmail
-spamc/README.win
 spamc/acconfig.h
-spamc/config.h.in
-spamc/config.h.win
 spamc/configure
 spamc/configure.in
 spamc/configure.pl
 spamc/libspamc.c
 spamc/libspamc.h
 spamc/qmail-spamc.c
-spamc/replace/README.getopt
+spamc/README.qmail
+spamc/README.win
 spamc/replace/getopt.c
 spamc/replace/getopt.h
-spamc/spamc.c
-spamc/spamc.pod
+spamc/replace/README.getopt
 spamc/utils.c
 spamc/utils.h
+spamd/netbsd-rc-script.sh
 spamd/README
 spamd/README.vpopmail
-spamd/netbsd-rc-script.sh
 spamd/redhat-rc-script.sh
 spamd/slackware-rc-script.sh
 spamd/solaris-rc-script.sh
-spamd/spamd.raw
 spamd/suse-rc-script.sh
-sql/README
-sql/README.awl
-sql/README.bayes
 sql/awl_mysql.sql
+sql/awl_pg.sql
 sql/bayes_mysql.sql
 sql/bayes_pg.sql
-t/SATest.pl
-t/SATest.pm
+sql/README
+sql/README.awl
+sql/README.bayes
+sql/userpref_mysql.sql
+sql/userpref_pg.sql
+STATUS
 t/basic_lint.t
 t/bayesdbm.t
+t/bayesdbm_flock.t
 t/bayessql.t
+t/body_mod.t
 t/cidrs.t
 t/data/etc/hello.txt
 t/data/mime-subject.txt
@@ -197,6 +189,14 @@
 t/data/nice/005
 t/data/nice/006
 t/data/nice/007
+t/data/nice/008
+t/data/nice/009
+t/data/nice/010
+t/data/nice/011
+t/data/nice/012
+t/data/nice/013
+t/data/nice/014
+t/data/nice/015
 t/data/nice/base64.txt
 t/data/nice/mailman_message.txt
 t/data/nice/mime1
@@ -208,6 +208,7 @@
 t/data/nice/mime7
 t/data/nice/mime8
 t/data/nice/not_gtube.eml
+t/data/nice/spf1
 t/data/spam/001
 t/data/spam/002
 t/data/spam/003
@@ -219,54 +220,47 @@
 t/data/spam/009
 t/data/spam/010
 t/data/spam/011
+t/data/spam/012
+t/data/spam/013
 t/data/spam/badmime.txt
 t/data/spam/badmime2.txt
 t/data/spam/base64.txt
 t/data/spam/bsmtp
+t/data/spam/dnsbl.eml
 t/data/spam/gtube.eml
-t/data/whitelists/action.eff.org
-t/data/whitelists/amazon_co_uk_ship
-t/data/whitelists/amazon_com_ship
-t/data/whitelists/cert.org
-t/data/whitelists/debian_bts_reassign
-t/data/whitelists/linuxplanet
-t/data/whitelists/lp.org
-t/data/whitelists/media_unspun
-t/data/whitelists/mlist_mailman_message
-t/data/whitelists/mlist_yahoo_groups_message
-t/data/whitelists/mypoints
-t/data/whitelists/neat_net_tricks
-t/data/whitelists/netcenter-direct_de
-t/data/whitelists/oracle_net_techblast
-t/data/whitelists/orbitz.com
-t/data/whitelists/paypal.com
-t/data/whitelists/register.com_password
-t/data/whitelists/ryanairmail.com
-t/data/whitelists/sf.net
-t/data/whitelists/winxpnews.com
-t/data/whitelists/yahoo-inc.com
 t/db_awl_path.t
 t/db_based_whitelist.t
 t/db_based_whitelist_ips.t
+t/debug.t
 t/dnsbl.t
 t/forged_rcvd.t
 t/gtube.t
+t/hashcash.t
 t/html_obfu.t
+t/ip_addrs.t
 t/lang_pl_tests.t
 t/mimeparse.t
 t/nonspam.t
 t/plugin.t
+t/prefs_include.t
 t/razor2.t
+t/rcvd_parser.t
 t/recips.t
+t/report_safe.t
 t/reportheader.t
 t/reportheader_8bit.t
-t/rule_tests.t
+t/rule_names.t
+t/rule_types.t
+t/SATest.pl
+t/SATest.pm
 t/sha1.t
 t/spam.t
 t/spamc.t
 t/spamc_B.t
 t/spamc_c.t
 t/spamc_c_stdout_closed.t
+t/spamc_E.t
+t/spamc_l.t
 t/spamd.t
 t/spamd_allow_user_rules.t
 t/spamd_hup.t
@@ -280,8 +274,10 @@
 t/spamd_report_ifspam.t
 t/spamd_stop.t
 t/spamd_symbols.t
+t/spamd_syslog.t
 t/spamd_unix.t
 t/spamd_utf8.t
+t/spf.t
 t/sql_based_whitelist.t
 t/strip2.t
 t/stripmarkup.t
@@ -289,60 +285,19 @@
 t/uri.t
 t/utf8.t
 t/whitelist_addrs.t
+t/whitelist_from.t
 t/whitelist_to.t
 t/zz_cleanup.t
-tools/README.speedtest
 tools/bayes_dump_to_trusted_networks
 tools/check_whitelist
 tools/convert_awl_dbm_to_sql
 tools/desc_length.pl
 tools/mboxsplit
+tools/README.speedtest
 tools/sa-stats.pl
 tools/speedtest
 tools/split_corpora
 tools/test_extract
 tools/triplets.pl
-lib/Mail/SpamAssassin/Constants.pm
-rules/25_uribl.cf
-lib/Mail/SpamAssassin/Plugin/RelayCountry.pm
-lib/Mail/SpamAssassin/Plugin/URIDNSBL.pm
-lib/Mail/SpamAssassin/Plugin/Hashcash.pm
-t/ip_addrs.t
-t/rule_types.t
-sql/awl_pg.sql
-sql/userpref_mysql.sql
-sql/userpref_pg.sql
-t/data/spam/dnsbl.eml
-t/report_safe.t
-rules/20_drugs.cf
-rules/30_text_pl.cf
-t/rcvd_parser.t
-rules/init.pre
-t/hashcash.t
-rules/25_hashcash.cf
-lib/Mail/SpamAssassin/Plugin/SPF.pm
-rules/25_spf.cf
-t/spf.t
-t/data/nice/spf1
-t/data/nice/008
-t/data/nice/009
-t/data/nice/010
-t/data/nice/011
-t/data/nice/012
-t/data/nice/013
-t/data/nice/014
-t/data/nice/015
-t/data/spam/012
-t/data/spam/013
-t/whitelist_from.t
-t/rule_names.t
-rules/25_body_tests_es.cf
-build/update_website_docs
-t/spamd_syslog.t
-t/prefs_include.t
-t/body_mod.t
-t/bayesdbm_flock.t
-t/spamc_E.t
-lib/Mail/SpamAssassin/Util/RegistrarBoundaries.pm
-t/spamc_l.t
-rules/30_text_nl.cf
+TRADEMARK
+USAGE
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/LDAP.pm 
Mail-
SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/LDAP.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/LDAP.pm
        Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/LDAP.pm
        Thu May 27 13:30:19 2004
@@ -52,7 +52,7 @@
 ###########################################################################
 
 sub load_modules {             # static
-  dbg("LDAP: loading Net::LDAP and URI");
+  dbg("LDAP: loading Net::LDAP and URI", conf => 1);
   eval {
     require Net::LDAP; # actual server connection
     require URI;       # parse server connection dsn
@@ -73,9 +73,9 @@
    my ($self, $username) = @_;
 
    my $url = $self->{main}->{conf}->{user_scores_dsn}; # an ldap URI
-   dbg("LDAP: URL is $url");
+   dbg("LDAP: URL is $url", conf => 1);
    if(!defined($url) || $url eq '') {
-     dbg ("LDAP: No URL defined; skipping LDAP");
+     dbg ("LDAP: No URL defined; skipping LDAP", conf => 1);
      return;
    }
 
@@ -103,7 +103,7 @@
 
   my $host   = $uri->host;
   if (!defined($host) || $host eq '') {
-    dbg("LDAP: No server specified, assuming localhost");
+    dbg("LDAP: No server specified, assuming localhost", conf => 1);
     $host = "localhost";
   }
   my $port   = $uri->port;
@@ -114,7 +114,7 @@
   my %extn   = $uri->extensions; # unused
 
   $filter =~ s/__USERNAME__/$username/g;
-  dbg("LDAP: host=$host, port=$port, base='$base', attr=${attr[0]}, 
scope=$scope, filter='$filter'");
+  dbg("LDAP: host=$host, port=$port, base='$base', attr=${attr[0]}, 
scope=$scope, filter='$filter'", 
conf => 1);
 
   my $main = $self->{main};
   my $ldapuser = $main->{conf}->{user_scores_ldap_username};
@@ -123,14 +123,14 @@
   if(!$ldapuser) {
       undef($ldapuser);
   } else {
-      dbg("LDAP: user='$ldapuser'");
+      dbg("LDAP: user='$ldapuser'", conf => 1);
   }
 
   if(!$ldappass) {
       undef($ldappass);
   } else {
       # don't log this to avoid leaking sensitive info
-      # dbg("LDAP: pass='$ldappass'");
+      # dbg("LDAP: pass='$ldappass'", conf => 1);
   }
 
   my $f_attribute = $attr[0];
@@ -152,7 +152,7 @@
   foreach my $entry ($result->all_entries) {
     my @v = $entry->get_value($f_attribute);
     foreach my $v (@v) {
-      dbg("LDAP: retrieving prefs for $username: $v");
+      dbg("LDAP: retrieving prefs for $username: $v", conf => 1);
       $conf .= $v."\n";
     }
   }
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/SQL.pm 
Mail-
SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/SQL.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf/SQL.pm
        Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf/SQL.pm
        Thu May 27 13:31:55 2004
@@ -88,7 +88,7 @@
 
    my $dsn = $self->{main}->{conf}->{user_scores_dsn};
    if(!defined($dsn) || $dsn eq '') {
-     dbg ("No DSN defined; skipping sql");
+     dbg ("No DSN defined; skipping sql", conf => 1);
      return 1;
    }
 
@@ -140,12 +140,12 @@
         "$f_username = ".$dbh->quote($username).
         " or $f_username = '[EMAIL PROTECTED]' order by $f_username asc";
      }
-     dbg("Conf::SQL: executing SQL: $sql");
+     dbg("Conf::SQL: executing SQL: $sql", conf => 1);
       my $sth = $dbh->prepare($sql);
       if($sth) {
          my $rv  = $sth->execute();
          if($rv) {
-            dbg("retrieving prefs for $username from SQL server");
+            dbg("retrieving prefs for $username from SQL server", conf => 1);
             my @row;
             my $text = '';
             while(@row = $sth->fetchrow_array()) {
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf.pm 
Mail-SpamAssassin
-3.000000/lib/Mail/SpamAssassin/Conf.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin/Conf.pm
        Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin/Conf.pm
        Fri May 21 15:02:45 2004
@@ -391,7 +391,7 @@
   my ($self, $set) = @_;
   $self->{scores} = $self->{scoreset}->[$set];
   $self->{scoreset_current} = $set;
-  dbg("Score set $set chosen.");
+  dbg("Score set $set chosen.", conf => 1);
 }
 
 sub get_score_set {
@@ -1141,7 +1141,7 @@
       if ($self->{lint_rules}) {
         warn $msg."\n";
       } else {
-        dbg ($msg);
+        dbg ($msg, conf => 1);
       }
       $self->{errors}++;
       next;
@@ -1200,7 +1200,7 @@
       }
 
       # if we get here, note the issue, then we'll fail through for an error.
-      dbg("rewrite_header: ignoring $hdr, not From, Subject, or To");
+      dbg("rewrite_header: ignoring $hdr, not From, Subject, or To", conf => 
1);
     }
 
 =item fold_headers { 0 | 1 }        (default: 1)
@@ -2338,7 +2338,7 @@
       if (!$self->{allow_user_rules}) {
         goto failed_line;
       }
-      dbg("Checking privileged commands in user config");
+      dbg("Checking privileged commands in user config", conf => 1);
     }
 
 =back
@@ -2374,7 +2374,9 @@
 
     if ( $key eq 'allow_user_rules' ) {
       $self->{allow_user_rules} = $value+0;
-      dbg( ($self->{allow_user_rules} ? "Allowing":"Not allowing") . " user 
rules!"); next;
+      dbg( ($self->{allow_user_rules} ? "Allowing":"Not allowing") . " user 
rules!",
+           conf => 1);
+      next;
     }
 
 =item header SYMBOLIC_TEST_NAME header op /pattern/modifiers
        [if-unset: STRING]
@@ -3244,7 +3246,7 @@
     if ($self->{lint_rules}) {
       warn $msg."\n";
     } else {
-      dbg ($msg);
+      dbg ($msg, conf => 1);
     }
     $self->{errors}++;
   }
@@ -3538,7 +3540,7 @@
   if (!File::Spec->file_name_is_absolute ($path)) {
     my ($vol, $dirs, $file) = File::Spec->splitpath ($self->{currentfile});
     $path = File::Spec->catpath ($vol, $dirs, $path);
-    dbg ("plugin: fixed relative path: $path");
+    dbg ("plugin: fixed relative path: $path", conf => 1);
   }
   return $path;
 }
diff -Nru Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin.pm 
Mail-SpamAssassin
-3.000000/lib/Mail/SpamAssassin.pm
--- Mail-SpamAssassin-3.000000-orig/lib/Mail/SpamAssassin.pm
        Fri May 21 13:29:30 2004
+++ Mail-SpamAssassin-3.000000/lib/Mail/SpamAssassin.pm
        Fri May 21 15:04:57 2004
@@ -224,6 +224,41 @@
 Otherwise, the default is taken from the runtime environment (ie. this process'
 effective UID under UNIX).
 
+=item debug
+
+If set to true, debugging is enabled. It is disabled by default.
+
+=item debug_level
+
+Sets debug levels for SpamAssassin debugging operations. The value is
+a hash reference. Following are valid debug set names and their default values.
+
+  {
+    datediff      =>  -1,
+    razor         =>  -3,
+    dcc           =>   0,
+    pyzor         =>   0,
+    rbl           =>   0,
+    dnsavailable  =>  -2,
+    bayes         =>   0,
+    conf          =>   1,
+
+    # Bitfield:
+    #   header regex:         1
+    #   body-text:            2
+    #   uri tests:            4
+    #   raw-body-text:        8
+    #   full-text regexp:    16
+    #   run_eval_tests:      32
+    #   run_rbl_eval_tests:  64
+    rulesrun      =>  64,
+  }
+
+A value of zero (C<0>) disables the debug set. If debug levels are
+progressive, use negative numbers. Lowering the debug level B<increases>
+the amount of debugging that will occur. If debug levels are bit fields,
+use positive numbers.
+
 =back
 
 If none of C<rules_filename>, C<site_rules_filename>, C<userprefs_filename>, or
@@ -266,10 +301,16 @@
   $DEBUG->{rbl}=0;
   $DEBUG->{dnsavailable}=-2;
   $DEBUG->{bayes}=0;
+  $DEBUG->{conf}=1;
   # Bitfield:
   # header regex: 1 | body-text: 2 | uri tests: 4 | raw-body-text: 8
   # full-text regexp: 16 | run_eval_tests: 32 | run_rbl_eval_tests: 64
   $DEBUG->{rulesrun}=64;
+  if ( defined $self->{debug_level} && ref($self->{debug_level}) eq 'HASH' ) {
+    my @dbg_sets   = grep { $_ ne 'enabled' } keys %{$DEBUG};
+    my @new_levels = grep { defined $self->{debug_level}->{$_} } @dbg_sets;
+    @[EMAIL PROTECTED] = @{$self->[EMAIL PROTECTED];
+  }
 
   $self->{conf} ||= new Mail::SpamAssassin::Conf ($self);
   $self->{plugins} = Mail::SpamAssassin::PluginHandler->new ($self);
diff -Nru Mail-SpamAssassin-3.000000-orig/sa-learn.raw 
Mail-SpamAssassin-3.000000/sa-learn.raw
--- Mail-SpamAssassin-3.000000-orig/sa-learn.raw        Fri May 21 13:29:33 2004
+++ Mail-SpamAssassin-3.000000/sa-learn.raw     Thu May 27 13:27:45 2004
@@ -112,9 +112,10 @@
   'learnprob=f' => \$opt{'learnprob'},
   'randseed=i'  => \$opt{'randseed'},
 
-  'debug-level|D:s' => \$opt{'debug-level'},
-  'version|V'       => \$opt{'version'},
-  'help|h|?'        => \$opt{'help'},
+  'debug-level|D:s'    => \$opt{'debug-level'},
+  'debug-set-level=s%' => \$opt{'debug-set-level'},
+  'version|V'          => \$opt{'version'},
+  'help|h|?'           => \$opt{'help'},
 
   'dump:s' => \$opt{'dump'},
   'import' => \$opt{'import'},
@@ -186,6 +187,7 @@
     site_rules_filename => $opt{'siteconfigpath'},
     userprefs_filename  => $opt{'prefspath'},
     debug               => defined( $opt{'debug-level'} ),
+    debug_level         => ($opt{'debug-set-level'} || {}),
     local_tests_only    => 1,
     dont_copy_prefs     => 1,
     PREFIX              => $PREFIX,
@@ -518,6 +520,7 @@
  -p prefs, --prefspath=file, --prefs-file=file    Set user preferences file
  --siteconfigpath=path             Path for site configs (def: 
/etc/mail/spamassassin)
  -D, --debug-level                 Print debugging messages
+--debug-set-level name=level       Configure debug levels for individual debug 
sets
  -V, --version                     Print version
  -h, --help                        Print usage message
 
@@ -835,6 +838,13 @@
  =item B<-D>, B<--debug-level>
 
 Produce diagnostic output.
+
+=item B<--debug-set-level> [name=level]
+
+Set debug levels for SpamAssassin debug sets. This allows fine-grained
+control over what code points will debug, and how much.
+
+Review the possible debug sets in L<Mail::SpamAssassin>.
 
 =item B<--no-sync>
 
diff -Nru Mail-SpamAssassin-3.000000-orig/spamassassin.raw 
Mail-SpamAssassin-3.000000/
spamassassin.raw
--- Mail-SpamAssassin-3.000000-orig/spamassassin.raw    Fri May 21 13:29:33 2004
+++ Mail-SpamAssassin-3.000000/spamassassin.raw Thu May 27 13:27:27 2004
@@ -122,6 +122,7 @@
   'test-mode|test|t'                        => \$opt{'test-mode'},
   'lint'                                    => \$opt{'lint'},
   'debug-level|debug|D:s'                   => \$opt{'debug-level'},
+  'debug-set-level=s%'                      => \$opt{'debug-set-level'},
   'version|V'                               => \$opt{'version'},
   'help|h|?'                                => \$opt{'help'},
   'mbox'                                    => sub { $opt{'format'} = 'mbox'; 
},
@@ -151,6 +152,7 @@
     userprefs_filename  => $opt{'prefspath'},
     local_tests_only    => $opt{'local'},
     debug               => defined( $opt{'debug-level'} ),
+    debug_level         => ($opt{'debug-set-level'} || {}),
     dont_copy_prefs     => ( $opt{'create-prefs'} ? 0 : 1 ),
     PREFIX              => $PREFIX,
     DEF_RULES_DIR       => $DEF_RULES_DIR,
@@ -423,6 +425,8 @@
  --add-addr-to-blacklist=addr      Add addr to blacklist (AWL)
  --remove-addr-from-whitelist=addr Remove addr from whitelist (AWL)
  -D, --debug [area=n,...]          Print debugging messages
+ --debug-set-level name=level      Configure debug levels for individual
+                                   debug sets
  -V, --version                     Print version
  -h, --help                        Print usage message
 
@@ -589,6 +593,13 @@
 hit, use:
 
         spamassassin -D rulesrun=255
+
+=item B<--debug-set-level> [name=level]
+
+Set debug levels for SpamAssassin debug sets. This allows fine-grained
+control over what code points will debug, and how much.
+
+Review the possible debug sets in L<Mail::SpamAssassin>.
 
 =item B<-x>, B<--nocreate-prefs>
 
diff -Nru Mail-SpamAssassin-3.000000-orig/t/SATest.pm 
Mail-SpamAssassin-3.000000/t/SATest.pm
--- Mail-SpamAssassin-3.000000-orig/t/SATest.pm Fri May 21 13:29:31 2004
+++ Mail-SpamAssassin-3.000000/t/SATest.pm      Fri May 21 14:53:22 2004
@@ -144,7 +144,9 @@
 
   open (OUT, ">log/tst.cf") or die;
   print OUT $lines; close OUT;
-  $scr_pref_args = "-p log/tst.cf";
+  $scr_pref_args     = "-p log/tst.cf";
+  $salearn_pref_args = "-p log/tst.cf";
+  return "log/tst.cf";
 }
 
 # Run spamassassin. Calls back with the output.
diff -Nru Mail-SpamAssassin-3.000000-orig/t/debug.t 
Mail-SpamAssassin-3.000000/t/debug.t
--- Mail-SpamAssassin-3.000000-orig/t/debug.t   Wed Dec 31 19:00:00 1969
+++ Mail-SpamAssassin-3.000000/t/debug.t        Thu May 27 13:18:03 2004
@@ -0,0 +1,35 @@
+#!/usr/bin/perl
+
+use lib '.'; use lib 't';
+use SATest; sa_t_init("debug");
+use Test; BEGIN { plan tests => 47 };
+
+# ---------------------------------------------------------------------------
+
+$SIG{__WARN__} = sub {
+  ok $_[0] !~ /Failed to parse line in SpamAssassin configuration/;
+};
+
+my $prefs_file = tstprefs <<__PREFS__;
+header LAST_RCVD_LINE  Received =~ /www.fasttrec.com/
+header MESSAGEID_MATCH MESSAGEID =~ /fasttrec.com/
+header ENV_FROM                EnvelopeFrom =~ /jm.netnoteinc.com/
+body SUBJ_IN_BODY      /YOUR BRAND NEW HOUSE/
+uri URI_RULE           /WWW.SUPERSITESCENTRAL.COM/i
+body BODY_LINE_WRAP    /making obscene amounts of money from the/
+header RELAYS          X-Spam-Relays-Untrusted =~ / helo=www.fasttrec.com /
+heder FOO
+__PREFS__
+
+use Mail::SpamAssassin;
+my $sa = Mail::SpamAssassin->new({
+  site_rules_filename => $prefs_file,
+  debug               => 1,
+  debug_level         => {
+    conf => 0,
+  },
+})->init;
+
+# Would be nice, but requires STDERR to be caught when calling the program.
+# Portability requires the use of something like IPC::Open3.
+# salearnrun "-D --debug-set-level conf=0 --sync --siteconfigpath=$prefs_file";



------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

Reply via email to