diff options
Diffstat (limited to 'scripts/undo.pl')
-rwxr-xr-x | scripts/undo.pl | 171 |
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 }; } |