Index: lib/Mail/SpamAssassin/Plugin/BodyRuleBaseExtractor.pm
===================================================================
--- lib/Mail/SpamAssassin/Plugin/BodyRuleBaseExtractor.pm (revision 984789)
+++ lib/Mail/SpamAssassin/Plugin/BodyRuleBaseExtractor.pm (working copy)
@@ -176,31 +176,37 @@
}
# ignore ReplaceTags rules
- # TODO: need cleaner way to do this
- goto NO if ($conf->{rules_to_replace}->{$name});
+ my $is_a_replacetags_rule = $conf->{rules_to_replace}->{$name};
+ my ($minlen, $lossy, @bases);
- my ($lossy, @bases);
+ if (!$is_a_replacetags_rule) {
+ eval { # catch die()s
+ my ($qr, $mods) = $self->simplify_and_qr_regexp($rule);
+ ($lossy, @bases) = $self->extract_hints($rule, $qr, $mods);
+ 1;
+ } or do {
+ my $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat;
+ dbg("zoom: giving up on regexp: $eval_stat");
+ };
- eval { # catch die()s
- my ($qr, $mods) = $self->simplify_and_qr_regexp($rule);
- ($lossy, @bases) = $self->extract_hints($rule, $qr, $mods);
- 1;
- } or do {
- my $eval_stat = $@ ne '' ? $@ : "errno=$!"; chomp $eval_stat;
- dbg("zoom: giving up on regexp: $eval_stat");
- };
-
- # if any of the extracted hints in a set are too short, the entire
- # set is invalid; this is because each set of N hints represents just
- # 1 regexp.
- my $minlen;
- foreach my $str (@bases) {
- my $len = length fixup_re($str); # bug 6143: count decoded characters
- if ($len < $min_chars) { $minlen = undef; @bases = (); last; }
- elsif (!defined($minlen) || $len < $minlen) { $minlen = $len; }
+ # if any of the extracted hints in a set are too short, the entire
+ # set is invalid; this is because each set of N hints represents just
+ # 1 regexp.
+ foreach my $str (@bases) {
+ my $len = length fixup_re($str); # bug 6143: count decoded characters
+ if ($len < $min_chars) { $minlen = undef; @bases = (); last; }
+ elsif (!defined($minlen) || $len < $minlen) { $minlen = $len; }
+ }
}
- if ($minlen && @bases) {
+ if ($is_a_replacetags_rule || !$minlen || !@bases) {
+ dbg("zoom: ignoring %s %s",
+ $is_a_replacetags_rule ? 'replace rule' : 'NO', $rule);
+ push @failed, { orig => $rule };
+ $cached->{rule_bases}->{$cachekey} = { };
+ $no++;
+ }
+ else {
# dbg("zoom: YES $base $rule");
# figure out if we have e.g. ["foo", "foob", "foobar"]; in this
@@ -229,13 +235,6 @@
$cached->{rule_bases}->{$cachekey} = { g => \@forcache };
$yes++;
}
- else {
-NO:
- dbg("zoom: NO $rule");
- push @failed, { orig => $rule };
- $cached->{rule_bases}->{$cachekey} = { };
- $no++;
- }
}
$self->{show_progress} and $progress and $progress->final();