summaryrefslogtreecommitdiffstats
path: root/scripts/undo.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/undo.pl')
-rwxr-xr-xscripts/undo.pl171
1 files changed, 83 insertions, 88 deletions
diff --git a/scripts/undo.pl b/scripts/undo.pl
index 24d6f594b..20509cd55 100755
--- a/scripts/undo.pl
+++ b/scripts/undo.pl
@@ -13,14 +13,15 @@ use warnings;
use File::Basename qw(dirname);
use File::Spec::Functions qw(catfile catdir rel2abs);
use Cwd qw(realpath);
+
BEGIN {
- require lib;
- my $dir = rel2abs(catdir(dirname(__FILE__), '..'));
- lib->import($dir, catdir($dir, 'lib'), catdir($dir, qw(local lib perl5)));
+ require lib;
+ my $dir = rel2abs(catdir(dirname(__FILE__), '..'));
+ lib->import($dir, catdir($dir, 'lib'), catdir($dir, qw(local lib perl5)));
}
use Bugzilla;
-BEGIN { Bugzilla->extensions };
+BEGIN { Bugzilla->extensions }
use Bugzilla::Extension::UserProfile::Util qw(tag_for_recount_from_bug);
use Try::Tiny;
@@ -45,38 +46,35 @@ my $query = q{
undo($query);
sub undo {
- my @args = @_;
- my $changes = get_changes(@args);
- my $comments = get_comments(@args);
-
- my %action;
- while ($_ = $changes->()) {
- push @{ $action{$_->{bug_id}}{$_->{bug_when}}{remove_activities} }, { id => $_->{change_id} };
- $action{ $_->{bug_id} }{ $_->{bug_when} }{change}{ $_->{field_name} } = {
- replace => $_->{added},
- with => $_->{removed},
- };
- }
+ my @args = @_;
+ my $changes = get_changes(@args);
+ my $comments = get_comments(@args);
- while ($_ = $comments->()) {
- push @{ $action{ $_->{bug_id} }{$_->{bug_when}}{remove_comments} }, {
- id => $_->{comment_id},
- };
- }
+ my %action;
+ while ($_ = $changes->()) {
+ push @{$action{$_->{bug_id}}{$_->{bug_when}}{remove_activities}},
+ {id => $_->{change_id}};
+ $action{$_->{bug_id}}{$_->{bug_when}}{change}{$_->{field_name}}
+ = {replace => $_->{added}, with => $_->{removed},};
+ }
- my $dbh = Bugzilla->dbh;
- my @bug_ids = reverse sort { $a <=> $b } keys %action;
- say 'Found ', 0 + @bug_ids, ' bugs';
- foreach my $bug_id (@bug_ids) {
- $dbh->bz_start_transaction;
- say "Fix $bug_id";
- try {
- my ($delta_ts) = $dbh->selectrow_array(
- 'SELECT delta_ts FROM bugs WHERE bug_id = ?',
- undef,
- $bug_id);
- my ($previous_last_ts) = $dbh->selectrow_array(
- q{
+ while ($_ = $comments->()) {
+ push @{$action{$_->{bug_id}}{$_->{bug_when}}{remove_comments}},
+ {id => $_->{comment_id},};
+ }
+
+ my $dbh = Bugzilla->dbh;
+ my @bug_ids = reverse sort { $a <=> $b } keys %action;
+ say 'Found ', 0 + @bug_ids, ' bugs';
+ foreach my $bug_id (@bug_ids) {
+ $dbh->bz_start_transaction;
+ say "Fix $bug_id";
+ try {
+ my ($delta_ts)
+ = $dbh->selectrow_array('SELECT delta_ts FROM bugs WHERE bug_id = ?',
+ undef, $bug_id);
+ my ($previous_last_ts) = $dbh->selectrow_array(
+ q{
SELECT MAX(bug_when) FROM (
SELECT bug_when FROM bugs_activity WHERE bug_id = ? AND bug_when < ?
UNION
@@ -84,57 +82,54 @@ sub undo {
UNION
SELECT creation_ts AS bug_when FROM bugs WHERE bug_id = ?
) as changes ORDER BY bug_when DESC
- },
- undef,
- $bug_id, $delta_ts,
- $bug_id, $delta_ts,
- $bug_id,
- );
- die 'cannot find previous last updated time' unless $previous_last_ts;
- my $action = delete $action{$bug_id}{$delta_ts};
- if (keys %{ $action{$bug_id}{$delta_ts}}) {
- die "skipping because more than one change\n";
- }
- elsif (!$action) {
- die "skipping because most recent change newer than automation change\n";
- }
- foreach my $field (keys %{ $action->{change} }) {
- my $change = $action->{change}{$field};
- if ($field eq 'cf_last_resolved' && !$change->{with}) {
- $change->{with} = undef;
- }
- my $did = $dbh->do(
- "UPDATE bugs SET $field = ? WHERE bug_id = ? AND $field = ?",
- undef, $change->{with}, $bug_id, $change->{replace},
- );
- die "Failed to set $field to $change->{with}" unless $did;
- }
- $dbh->do('UPDATE bugs SET delta_ts = ?, lastdiffed = ? WHERE bug_id = ?', undef,
- $previous_last_ts, $previous_last_ts, $bug_id );
- my $del_comments = $dbh->prepare('DELETE FROM longdescs WHERE comment_id = ?');
- my $del_activity = $dbh->prepare('DELETE FROM bugs_activity WHERE id = ?');
- foreach my $comment (@{ $action->{remove_comments}}) {
- $del_comments->execute($comment->{id}) or die "failed to delete comment $comment->{id}";
- }
- foreach my $activity (@{ $action->{remove_activities}}) {
- $del_activity->execute($activity->{id}) or die "failed to delete comment $activity->{id}";
- }
- tag_for_recount_from_bug($bug_id);
- $dbh->bz_commit_transaction;
- sleep 1;
- } catch {
- chomp $_;
- say "Error updating $bug_id: $_";
- $dbh->bz_rollback_transaction;
- };
+ }, undef, $bug_id, $delta_ts, $bug_id, $delta_ts, $bug_id,
+ );
+ die 'cannot find previous last updated time' unless $previous_last_ts;
+ my $action = delete $action{$bug_id}{$delta_ts};
+ if (keys %{$action{$bug_id}{$delta_ts}}) {
+ die "skipping because more than one change\n";
+ }
+ elsif (!$action) {
+ die "skipping because most recent change newer than automation change\n";
+ }
+ foreach my $field (keys %{$action->{change}}) {
+ my $change = $action->{change}{$field};
+ if ($field eq 'cf_last_resolved' && !$change->{with}) {
+ $change->{with} = undef;
+ }
+ my $did = $dbh->do("UPDATE bugs SET $field = ? WHERE bug_id = ? AND $field = ?",
+ undef, $change->{with}, $bug_id, $change->{replace},);
+ die "Failed to set $field to $change->{with}" unless $did;
+ }
+ $dbh->do('UPDATE bugs SET delta_ts = ?, lastdiffed = ? WHERE bug_id = ?',
+ undef, $previous_last_ts, $previous_last_ts, $bug_id);
+ my $del_comments = $dbh->prepare('DELETE FROM longdescs WHERE comment_id = ?');
+ my $del_activity = $dbh->prepare('DELETE FROM bugs_activity WHERE id = ?');
+ foreach my $comment (@{$action->{remove_comments}}) {
+ $del_comments->execute($comment->{id})
+ or die "failed to delete comment $comment->{id}";
+ }
+ foreach my $activity (@{$action->{remove_activities}}) {
+ $del_activity->execute($activity->{id})
+ or die "failed to delete comment $activity->{id}";
+ }
+ tag_for_recount_from_bug($bug_id);
+ $dbh->bz_commit_transaction;
+ sleep 1;
}
- say 'Done.';
+ catch {
+ chomp $_;
+ say "Error updating $bug_id: $_";
+ $dbh->bz_rollback_transaction;
+ };
+ }
+ say 'Done.';
}
sub get_changes {
- my ($where, @bind) = @_;
+ my ($where, @bind) = @_;
- my $sql = qq{
+ my $sql = qq{
SELECT
BA.id AS change_id,
BA.bug_id,
@@ -163,16 +158,16 @@ sub get_changes {
changer.login_name = 'automation\@bmo.tld'
AND BA.bug_when BETWEEN '2018-05-22' AND '2018-05-26'
};
- my $sth = Bugzilla->dbh->prepare($sql);
- $sth->execute(@bind);
+ my $sth = Bugzilla->dbh->prepare($sql);
+ $sth->execute(@bind);
- return sub { $sth->fetchrow_hashref };
+ return sub { $sth->fetchrow_hashref };
}
sub get_comments {
- my ($where, @bind) = @_;
+ my ($where, @bind) = @_;
- my $sql = qq{
+ my $sql = qq{
SELECT
C.comment_id AS comment_id,
C.bug_id AS bug_id,
@@ -196,8 +191,8 @@ sub get_comments {
commenter.login_name = 'automation\@bmo.tld'
AND C.bug_when BETWEEN '2018-05-22' AND '2018-05-26'
};
- my $sth = Bugzilla->dbh->prepare($sql);
- $sth->execute(@bind);
+ my $sth = Bugzilla->dbh->prepare($sql);
+ $sth->execute(@bind);
- return sub { $sth->fetchrow_hashref };
+ return sub { $sth->fetchrow_hashref };
}