summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlpsolit%gmail.com <>2006-03-28 08:25:38 +0200
committerlpsolit%gmail.com <>2006-03-28 08:25:38 +0200
commit60720d6c4768e932e33d49ef3bbee91c13dc81aa (patch)
treedbc824766e5cd3b74112be72cdcbb7bd99be244a
parentd9d7c1c44820cb866e3214f1a34a5dfcbc851ee1 (diff)
downloadbugzilla-60720d6c4768e932e33d49ef3bbee91c13dc81aa.tar.gz
bugzilla-60720d6c4768e932e33d49ef3bbee91c13dc81aa.tar.xz
Bug 92515: Implement the ability to change the resolution of a bug without reopening it - Patch by Frédéric Buclin <LpSolit@gmail.com> r=wicked a=myk
-rwxr-xr-xprocess_bug.cgi43
-rw-r--r--template/en/default/bug/knob.html.tmpl54
-rw-r--r--template/en/default/global/user-error.html.tmpl5
3 files changed, 52 insertions, 50 deletions
diff --git a/process_bug.cgi b/process_bug.cgi
index d1efd3825..f19763c23 100755
--- a/process_bug.cgi
+++ b/process_bug.cgi
@@ -449,13 +449,6 @@ sub CheckCanChangeField {
{
return 1;
}
-
- # A resolution change is always accompanied by a status change. So, we
- # always OK resolution changes; if they really can't do this, we will
- # notice it when status is checked.
- if ($field eq "resolution") {
- return 1;
- }
# END DO_NOT_CHANGE
# Allow anyone to change comments.
@@ -1127,7 +1120,7 @@ SWITCH: for ($cgi->param('knob')) {
ChangeResolution('');
last SWITCH;
};
- /^resolve$/ && CheckonComment( "resolve" ) && do {
+ /^(resolve|change_resolution)$/ && CheckonComment( "resolve" ) && do {
# Check here, because its the only place we require the resolution
check_field('resolution', scalar $cgi->param('resolution'),
\@::settable_resolution);
@@ -1144,11 +1137,14 @@ SWITCH: for ($cgi->param('knob')) {
}
}
- # RESOLVED bugs should have no time remaining;
- # more time can be added for the VERIFY step, if needed.
- _remove_remaining_time();
+ if ($cgi->param('knob') eq 'resolve') {
+ # RESOLVED bugs should have no time remaining;
+ # more time can be added for the VERIFY step, if needed.
+ _remove_remaining_time();
+
+ ChangeStatus('RESOLVED');
+ }
- ChangeStatus('RESOLVED');
ChangeResolution($cgi->param('resolution'));
last SWITCH;
};
@@ -1221,20 +1217,10 @@ SWITCH: for ($cgi->param('knob')) {
ValidateBugID($duplicate, 'dup_id');
$cgi->param('dup_id', $duplicate);
- # Make sure the bug is not already marked as a dupe
- # (may appear in race condition)
- my $dupe_of =
- $dbh->selectrow_array("SELECT dupe_of FROM duplicates
- WHERE dupe = ?",
- undef, $cgi->param('id'));
- if ($dupe_of) {
- ThrowUserError("dupe_entry_found", { dupe_of => $dupe_of });
- }
-
# Make sure a loop isn't created when marking this bug
# as duplicate.
my %dupes;
- $dupe_of = $duplicate;
+ my $dupe_of = $duplicate;
my $sth = $dbh->prepare('SELECT dupe_of FROM duplicates
WHERE dupe = ?');
@@ -1699,13 +1685,13 @@ foreach my $id (@idlist) {
SendSQL($query);
}
- # Check for duplicates if the bug is [re]open
+ # Check for duplicates if the bug is [re]open or its resolution is changed.
SendSQL("SELECT resolution FROM bugs WHERE bug_id = $id");
my $resolution = FetchOneColumn();
- if ($resolution eq '') {
+ if ($resolution ne 'DUPLICATE') {
SendSQL("DELETE FROM duplicates WHERE dupe = $id");
}
-
+
my $newproduct_id = $oldhash{'product_id'};
if ($cgi->param('product') ne $cgi->param('dontchange')) {
my $newproduct_id = get_product_id($cgi->param('product'));
@@ -2068,6 +2054,11 @@ foreach my $id (@idlist) {
}
if ($duplicate) {
+ # If the bug was already marked as a duplicate, remove
+ # the existing entry.
+ $dbh->do('DELETE FROM duplicates WHERE dupe = ?',
+ undef, $cgi->param('id'));
+
# Check to see if Reporter of this bug is reporter of Dupe
SendSQL("SELECT reporter FROM bugs WHERE bug_id = " .
$cgi->param('id'));
diff --git a/template/en/default/bug/knob.html.tmpl b/template/en/default/bug/knob.html.tmpl
index c76251ae9..9f9e73f41 100644
--- a/template/en/default/bug/knob.html.tmpl
+++ b/template/en/default/bug/knob.html.tmpl
@@ -72,24 +72,9 @@
Resolve [% terms.bug %], changing
<a href="page.cgi?id=fields.html#resolution">resolution</a> to
</label>
- <select name="resolution"
- onchange="document.changeform.knob[[% knum %]].checked=true">
- [% FOREACH r = bug.choices.resolution %]
- <option value="[% r FILTER html %]">[% resolution_descs.${r} FILTER html %]</option>
- [% END %]
- </select>
- <br>
- [% knum = knum + 1 %]
-
- <input type="radio" id="knob-duplicate" name="knob" value="duplicate">
- <label for="knob-duplicate">
- Resolve [% terms.bug %], mark it as duplicate of [% terms.bug %] #
- </label>
- <input name="dup_id" size="6"
- onchange="if (this.value != '')
- {document.changeform.knob[[% knum %]].checked=true}">
- <br>
- [% knum = knum + 1 %]
+ [% PROCESS select_resolution %]
+
+ [% PROCESS duplicate %]
[% IF bug.user.canedit %]
<input type="radio" id="knob-reassign" name="knob" value="reassign">
@@ -135,6 +120,14 @@
[% ELSE %]
[% IF bug.resolution != "MOVED" ||
(bug.resolution == "MOVED" && bug.user.canmove) %]
+ <input type="radio" id="knob-change-resolution" name="knob" value="change_resolution">
+ <label for="knob-change-resolution">
+ Change <a href="page.cgi?id=fields.html#resolution">resolution</a> to
+ </label>
+ [% PROCESS select_resolution %]
+
+ [% PROCESS duplicate %]
+
<input type="radio" id="knob-reopen" name="knob" value="reopen">
<label for="knob-reopen">
Reopen [% terms.bug %]
@@ -162,7 +155,6 @@
[% END %]
<input type="submit" value="Commit">
- <input type="hidden" name="form_name" value="process_bug">
<p>
<font size="+1">
<b>
@@ -186,3 +178,27 @@
[% END %]
</p>
+
+[%# Common actions %]
+
+[% BLOCK select_resolution %]
+ <select name="resolution"
+ onchange="document.changeform.knob[[% knum %]].checked=true">
+ [% FOREACH r = bug.choices.resolution %]
+ <option value="[% r FILTER html %]">[% resolution_descs.${r} FILTER html %]</option>
+ [% END %]
+ </select>
+ <br>
+ [% knum = knum + 1 %]
+[% END %]
+
+[% BLOCK duplicate %]
+ <input type="radio" id="knob-duplicate" name="knob" value="duplicate">
+ <label for="knob-duplicate">
+ Mark the [% terms.bug %] as duplicate of [% terms.bug %] #
+ </label>
+ <input name="dup_id" size="6"
+ onchange="if (this.value != '') {document.changeform.knob[[% knum %]].checked=true}">
+ <br>
+ [% knum = knum + 1 %]
+[% END %]
diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl
index c217b2347..6e029e1f5 100644
--- a/template/en/default/global/user-error.html.tmpl
+++ b/template/en/default/global/user-error.html.tmpl
@@ -320,11 +320,6 @@
[% title = "Description Required" %]
You must provide a description of the [% terms.bug %].
- [% ELSIF error == "dupe_entry_found" %]
- [% title = "Already marked as duplicate" %]
- This [% terms.bug %] has already been marked as a duplicate
- of [% terms.bug %] [%+ dupe_of FILTER html %].
-
[% ELSIF error == "dupe_not_allowed" %]
[% title = "Cannot mark $terms.bugs as duplicates" %]
You cannot mark [% terms.bugs %] as duplicates when