aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsanitycheck.cgi54
-rw-r--r--template/en/default/admin/sanitycheck/messages.html.tmpl19
2 files changed, 73 insertions, 0 deletions
diff --git a/sanitycheck.cgi b/sanitycheck.cgi
index 171029b2e..93228fc67 100755
--- a/sanitycheck.cgi
+++ b/sanitycheck.cgi
@@ -341,6 +341,36 @@ if ($cgi->param('remove_invalid_attach_references')) {
Status('attachment_reference_deletion_end');
}
+###########################################################################
+# Remove all references to deleted users or groups from whines
+###########################################################################
+
+if ($cgi->param('remove_old_whine_targets')) {
+ Status('whines_obsolete_target_deletion_start');
+
+ $dbh->bz_start_transaction();
+
+ foreach my $target (['groups', 'id', MAILTO_GROUP],
+ ['profiles', 'userid', MAILTO_USER])
+ {
+ my ($table, $col, $type) = @$target;
+ my $old_ids =
+ $dbh->selectcol_arrayref("SELECT DISTINCT mailto
+ FROM whine_schedules
+ LEFT JOIN $table
+ ON $table.$col = whine_schedules.mailto
+ WHERE mailto_type = $type AND $table.$col IS NULL");
+
+ if (scalar(@$old_ids)) {
+ $dbh->do("DELETE FROM whine_schedules
+ WHERE mailto_type = $type AND mailto IN (" .
+ join(',', @$old_ids) . ")");
+ }
+ }
+ $dbh->bz_commit_transaction();
+ Status('whines_obsolete_target_deletion_end');
+}
+
Status('checks_start');
###########################################################################
@@ -996,6 +1026,30 @@ if (scalar(@$badbugs > 0)) {
}
###########################################################################
+# Whines
+###########################################################################
+
+Status('whines_obsolete_target_start');
+
+my $display_repair_whines_link = 0;
+foreach my $target (['groups', 'id', MAILTO_GROUP],
+ ['profiles', 'userid', MAILTO_USER])
+{
+ my ($table, $col, $type) = @$target;
+ my $old = $dbh->selectall_arrayref("SELECT whine_schedules.id, mailto
+ FROM whine_schedules
+ LEFT JOIN $table
+ ON $table.$col = whine_schedules.mailto
+ WHERE mailto_type = $type AND $table.$col IS NULL");
+
+ if (scalar(@$old)) {
+ Status('whines_obsolete_target_alert', {schedules => $old, type => $type}, 'alert');
+ $display_repair_whines_link = 1;
+ }
+}
+Status('whines_obsolete_target_fix') if $display_repair_whines_link;
+
+###########################################################################
# End
###########################################################################
diff --git a/template/en/default/admin/sanitycheck/messages.html.tmpl b/template/en/default/admin/sanitycheck/messages.html.tmpl
index 4300f7815..14e425625 100644
--- a/template/en/default/admin/sanitycheck/messages.html.tmpl
+++ b/template/en/default/admin/sanitycheck/messages.html.tmpl
@@ -288,6 +288,25 @@
[% ELSIF san_tag == "vote_count_alert" %]
Bad vote sum for [% terms.bug %] [%+ id FILTER html %].
+ [% ELSIF san_tag == "whines_obsolete_target_deletion_start" %]
+ OK, now removing non-existent targets from whines.
+
+ [% ELSIF san_tag == "whines_obsolete_target_deletion_end" %]
+ Non-existent targets have been removed from whines.
+
+ [% ELSIF san_tag == "whines_obsolete_target_start" %]
+ Checking for whines with non-existent targets.
+
+ [% ELSIF san_tag == "whines_obsolete_target_alert" %]
+ [% FOREACH schedule = schedules %]
+ Non-existent [% (type == constants.MAILTO_USER) ? "user" : "group" FILTER html %]
+ [%+ schedule.1 FILTER html %] for whine schedule [% schedule.0 FILTER html %]<br>
+ [% END %]
+
+ [% ELSIF san_tag == "whines_obsolete_target_fix" %]
+ <a href="sanitycheck.cgi?remove_old_whine_targets=1">Click here to
+ remove old targets</a>
+
[% END %]
[% END %]