summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlpsolit%gmail.com <>2005-04-13 02:24:33 +0200
committerlpsolit%gmail.com <>2005-04-13 02:24:33 +0200
commitf1e5b2aa558a8b9475f0fec798d47f06cbec0697 (patch)
treeedc9cfd0c5116dd09df6ed4416ee53c964a45d35
parent80faf9c10da4330066d5f57cd144c640ef7d4f65 (diff)
downloadbugzilla-f1e5b2aa558a8b9475f0fec798d47f06cbec0697.tar.gz
bugzilla-f1e5b2aa558a8b9475f0fec798d47f06cbec0697.tar.xz
Bug 288461: sanitycheck.cgi should permit to clean all invalid references to deleted bugs - Patch by Frédéric Buclin <LpSolit@gmail.com> r=glob a=justdave
-rwxr-xr-xsanitycheck.cgi46
1 files changed, 46 insertions, 0 deletions
diff --git a/sanitycheck.cgi b/sanitycheck.cgi
index 89b657e90..e8f4988fb 100755
--- a/sanitycheck.cgi
+++ b/sanitycheck.cgi
@@ -175,6 +175,10 @@ if (defined $cgi->param('cleangroupsnow')) {
"- reduced from $before records to $after records");
}
+###########################################################################
+# Send unsent mail
+###########################################################################
+
if (defined $cgi->param('rescanallBugMail')) {
require Bugzilla::BugMail;
@@ -202,6 +206,42 @@ if (defined $cgi->param('rescanallBugMail')) {
exit;
}
+###########################################################################
+# Remove all references to deleted bugs
+###########################################################################
+
+if (defined $cgi->param('remove_invalid_references')) {
+ Status("OK, now removing all references to deleted bugs.");
+
+ $dbh->bz_lock_tables('attachments WRITE', 'bug_group_map WRITE',
+ 'bugs_activity WRITE', 'cc WRITE',
+ 'dependencies WRITE', 'duplicates WRITE',
+ 'flags WRITE', 'keywords WRITE',
+ 'longdescs WRITE', 'votes WRITE', 'bugs READ');
+
+ foreach my $pair ('attachments/', 'bug_group_map/', 'bugs_activity/', 'cc/',
+ 'dependencies/blocked', 'dependencies/dependson',
+ 'duplicates/dupe', 'duplicates/dupe_of',
+ 'flags/', 'keywords/', 'longdescs/', 'votes/') {
+
+ my ($table, $field) = split('/', $pair);
+ $field ||= "bug_id";
+
+ my $bug_ids =
+ $dbh->selectcol_arrayref("SELECT $table.$field FROM $table
+ LEFT JOIN bugs ON $table.$field = bugs.bug_id
+ WHERE bugs.bug_id IS NULL");
+
+ if (scalar(@$bug_ids)) {
+ $dbh->do("DELETE FROM $table WHERE $field IN (" . join(',', @$bug_ids) . ")");
+ }
+ }
+
+ $dbh->bz_unlock_tables();
+ Status("All references to deleted bugs have been removed.");
+}
+
+
print "OK, now running sanity checks.<p>\n";
###########################################################################
@@ -247,6 +287,7 @@ sub CrossCheck {
"WHERE $table.$field IS NULL " .
" AND $refertable.$referfield IS NOT NULL");
+ my $has_bad_references = 0;
while (MoreSQLData()) {
my ($value, $key) = FetchSQLData();
if (!$exceptions{$value}) {
@@ -260,8 +301,13 @@ sub CrossCheck {
}
}
Alert($alert);
+ $has_bad_references = 1;
}
}
+ # References to non existent bugs can be safely removed, bug 288461
+ if ($table eq 'bugs' && $has_bad_references) {
+ print qq{<a href="sanitycheck.cgi?remove_invalid_references=1">Remove invalid references to non existent bugs.</a><p>\n};
+ }
}
}