summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorMark Côté <mcote@mozilla.com>2015-06-04 20:36:32 +0200
committerMark Côté <mcote@mozilla.com>2015-06-05 18:14:34 +0200
commit6c5fcca1d4fcef47bcbb7a3bf9fd2261ebeb9414 (patch)
tree2ef767b79b9559283bc3245e58b03beb5d15c041 /extensions
parentcf55aa5ea49a62a2bdf9f99a5cb10821aba17ed3 (diff)
downloadbugzilla-6c5fcca1d4fcef47bcbb7a3bf9fd2261ebeb9414.tar.gz
bugzilla-6c5fcca1d4fcef47bcbb7a3bf9fd2261ebeb9414.tar.xz
Bug 1171576 - Preserve drive-by reviews in MozReview attachment-conversion script r=glob
If any flags were set on a parent attachment for reviewers not present in the review request, preserve them on all children. Also only call attachment update() once per attachment, not once per flag.
Diffstat (limited to 'extensions')
-rwxr-xr-xextensions/MozReview/bin/add-mozreview-children.pl72
1 files changed, 49 insertions, 23 deletions
diff --git a/extensions/MozReview/bin/add-mozreview-children.pl b/extensions/MozReview/bin/add-mozreview-children.pl
index b93a95a94..a63966a62 100755
--- a/extensions/MozReview/bin/add-mozreview-children.pl
+++ b/extensions/MozReview/bin/add-mozreview-children.pl
@@ -52,6 +52,24 @@ sub rr_url {
return $rb_host . "/r/" . $rrid . "/";
}
+sub set_review_flag {
+ my ($child_attach, $flag_type, $flag_status, $reviewer, $setter) = @_;
+
+ my %params = (
+ type_id => $flag_type->id,
+ status => $flag_status
+ );
+
+ if ($flag_status eq "?") {
+ $params{'requestee'} = $reviewer->login;
+ $params{'setter'} = $setter;
+ } else {
+ $params{'setter'} = $reviewer;
+ }
+
+ return Bugzilla::Flag->set_flag($child_attach, \%params);
+}
+
my $dbh = Bugzilla->dbh;
my $bugs_query = "SELECT distinct bug_id FROM attachments WHERE mimetype='text/x-review-board-request' AND isobsolete=0";
@@ -138,9 +156,9 @@ foreach my $bug_id (@$bug_ids) {
foreach my $flag (@{ $parent_attach->flags }) {
if ($flag->type->name eq "review") {
if ($flag->status eq "?") {
- $parent_flags{$flag->requestee->id} = $flag->status;
+ $parent_flags{$flag->requestee->id} = $flag;
} else {
- $parent_flags{$flag->setter->id} = $flag->status;
+ $parent_flags{$flag->setter->id} = $flag;
}
}
}
@@ -181,40 +199,48 @@ foreach my $bug_id (@$bug_ids) {
# Set flags. If there was a parent, check it for flags by the
# requestee. Otherwise, set an r? flag.
+ # Preserve the original flag hash since we need to modify it for
+ # every child to find extra reviewers (see below the 'foreach').
+ my %tmp_parent_flags = %parent_flags;
+
foreach my $reviewer_id (@{ $child->{"reviewers_bmo_ids"} }) {
my $reviewer = Bugzilla::User->new({ id => $reviewer_id,
cache => 1 });
print " Reviewer " . $reviewer->login . " (" . $reviewer->id . ")\n";
$reviewer->settings->{block_reviews}->{value} = 'off';
- my $flag_status = $parent_flags{$reviewer->id};
- if (defined($flag_status)) {
- print " Flag for reviewer " . $reviewer->id . ": " . $flag_status . "\n";
- my %params = (
- type_id => $flag_type->id,
- status => $flag_status
- );
-
- if ($flag_status eq "?") {
- $params{'requestee'} = $reviewer->login;
- $params{'setter'} = $attacher;
- } else {
- $params{'setter'} = $reviewer;
- }
+ my $flag = $tmp_parent_flags{$reviewer->id};
+ if (defined($flag)) {
+ print " Flag for reviewer " . $reviewer->id . ": " . $flag->status . "\n";
- my $child_flag = Bugzilla::Flag->set_flag($child_attach, \%params);
+ set_review_flag($child_attach, $flag_type, $flag->status,
+ $reviewer, $attacher);
+ delete $tmp_parent_flags{$reviewer->id};
} else {
# No flag on the parent; this probably means the reviewer
# cancelled the review, so don't set r?.
print " No review flag for reviewer " . $reviewer->id . "\n";
}
+ }
- $child_attach->update($timestamp);
- print " Posting comment.\n";
- $bug->add_comment('',
- { isprivate => 0,
- type => CMT_ATTACHMENT_CREATED,
- extra_data => $child_attach->id });
+ # Preserve flags that were set directly on the attachment
+ # from reviewers not listed in the review request.
+ foreach my $extra_reviewer_id (keys %tmp_parent_flags) {
+ my $extra_reviewer = Bugzilla::User->new({
+ id => $extra_reviewer_id,
+ cache => 1
+ });
+ my $flag = $tmp_parent_flags{$extra_reviewer_id};
+ print " Extra flag set for reviewer " . $extra_reviewer->login . "\n";
+ set_review_flag($child_attach, $flag->type, $flag->status,
+ $extra_reviewer, $flag->setter);
}
+
+ $child_attach->update($timestamp);
+ print " Posting comment.\n";
+ $bug->add_comment('',
+ { isprivate => 0,
+ type => CMT_ATTACHMENT_CREATED,
+ extra_data => $child_attach->id });
}
}