Fix for bug 125660: Templatizes process_bug.cgi.

Patch by Myk Melez <myk@mozilla.org>
r=gerv,bbaetz
This commit is contained in:
myk%mozilla.org 2002-04-12 21:02:00 +00:00
parent 498b8f5f3a
commit a26bc29e52
8 changed files with 518 additions and 314 deletions

View File

@ -373,61 +373,6 @@ sub lsearch {
return -1;
}
sub Product_element {
my ($prod,$onchange) = (@_);
return make_popup("product", keys %::versions, $prod, 1, $onchange);
}
sub Component_element {
my ($comp,$prod,$onchange) = (@_);
my $componentlist;
if (! defined $::components{$prod}) {
$componentlist = [];
} else {
$componentlist = $::components{$prod};
}
my $defcomponent;
if ($comp ne "" && lsearch($componentlist, $comp) >= 0) {
$defcomponent = $comp;
} else {
$defcomponent = $componentlist->[0];
}
return make_popup("component", $componentlist, $defcomponent, 1, "");
}
sub Version_element {
my ($vers, $prod, $onchange) = (@_);
my $versionlist;
if (!defined $::versions{$prod}) {
$versionlist = [];
} else {
$versionlist = $::versions{$prod};
}
my $defversion = $versionlist->[0];
if (lsearch($versionlist,$vers) >= 0) {
$defversion = $vers;
}
return make_popup("version", $versionlist, $defversion, 1, $onchange);
}
sub Milestone_element {
my ($tm, $prod, $onchange) = (@_);
my $tmlist;
if (!defined $::target_milestone{$prod}) {
$tmlist = [];
} else {
$tmlist = $::target_milestone{$prod};
}
my $deftm = $tmlist->[0];
if (lsearch($tmlist, $tm) >= 0) {
$deftm = $tm;
}
return make_popup("target_milestone", $tmlist, $deftm, 1, $onchange);
}
# Generate a string which, when later interpreted by the Perl compiler, will
# be the same as the given string.

View File

@ -22,6 +22,7 @@
# Dan Mosedale <dmose@mozilla.org>
# Dave Miller <justdave@syndicomm.com>
# Christopher Aillon <christopher@aillon.com>
# Myk Melez <myk@mozilla.org>
use diagnostics;
use strict;
@ -56,6 +57,8 @@ my $whoid = confirm_login();
my $requiremilestone = 0;
use vars qw($template $vars);
######################################################################
# Begin Data/Security Validation
######################################################################
@ -103,7 +106,12 @@ ValidateComment($::FORM{'comment'});
print "Content-type: text/html\n\n";
PutHeader ("Bug processed");
# Start displaying the response page.
$vars->{'title'} = "Bug processed";
$template->process("global/header", $vars)
|| ThrowTemplateError($template->error());
$vars->{'header_done'} = 1;
GetVersionTable();
@ -135,9 +143,8 @@ sub CheckonComment( $ ) {
if( $ret ) {
if (!defined $::FORM{'comment'} || $::FORM{'comment'} =~ /^\s*$/) {
# No comment - sorry, action not allowed !
PuntTryAgain("You have to specify a <b>comment</b> on this " .
"change. Please give some words " .
"on the reason for your change.");
ThrowUserError("You have to specify a <b>comment</b> on this change.
Please give some words on the reason for your change.");
} else {
$ret = 0;
}
@ -177,106 +184,34 @@ if ((($::FORM{'id'} && $::FORM{'product'} ne $::oldproduct)
$mok = lsearch($::target_milestone{$prod}, $::FORM{'target_milestone'}) >= 0;
}
# If anything needs to be verified, generate a form for verifying it.
# If the product-specific fields need to be verified, or we need to verify
# whether or not to add the bugs to their new product's group, display
# a verification form.
if (!$vok || !$cok || !$mok || (Param('usebuggroups') && !defined($::FORM{'addtonewgroup'}))) {
# Start the form.
print qq|<form action="process_bug.cgi" method="post">\n|;
# Add all form fields to the form as hidden fields (except those
# being verified), so the user's changes are preserved.
foreach my $i (keys %::FORM) {
if ($i ne 'version' && $i ne 'component' && $i ne 'target_milestone') {
print qq|<input type="hidden" name="$i" value="| . value_quote($::FORM{$i}) . qq|">\n|;
}
}
# Display UI for verifying the version, component, and target milestone fields.
$vars->{'form'} = \%::FORM;
if (!$vok || !$cok || !$mok) {
my ($sectiontitle, $sectiondescription);
if ( Param('usetargetmilestone') ) {
$sectiontitle = "Verify Version, Component, Target Milestone";
$sectiondescription = qq|
You are moving the bug(s) to the product <b>$prod</b>, and now the
version, component, and/or target milestone fields are not correct
(or perhaps they were not correct in the first place). In any case,
please set the correct version, component, and target milestone now:
|;
} else {
$sectiontitle = "Verify Version, Component";
$sectiondescription = qq|
You are moving the bug(s) to the product <b>$prod</b>, and now the
version, and component fields are not correct (or perhaps they were
not correct in the first place). In any case, please set the correct
version and component now:
|;
$vars->{'verify_fields'} = 1;
$vars->{'versions'} = $::versions{$prod};
$vars->{'components'} = $::components{$prod};
if (Param("usetargetmilestone")) {
$vars->{'use_target_milestone'} = 1;
$vars->{'milestones'} = $::target_milestone{$prod};
}
my $versionmenu = Version_element($::FORM{'version'}, $prod);
my $componentmenu = Component_element($::FORM{'component'}, $prod);
print qq|
<h3>$sectiontitle</h3>
<p>
$sectiondescription
<p>
<table><tr>
<td>
<b>Version:</b><br>
$versionmenu
</td>
<td>
<b>Component:</b><br>
$componentmenu
</td>
|;
if ( Param("usetargetmilestone") ) {
my $milestonemenu = Milestone_element($::FORM{'target_milestone'}, $prod);
print qq|
<td>
<b>Target Milestone:</b><br>
$milestonemenu
</td>
|;
else {
$vars->{'use_target_milestone'} = 0;
}
print qq|
</tr></table>
|;
}
# Display UI for determining whether or not to remove the bug from
# its old product's group and/or add it to its new product's group.
if (Param('usebuggroups') && !defined($::FORM{'addtonewgroup'})) {
print qq|
<h3>Verify Bug Group</h3>
<p>
Do you want to add the bug to its new product's group (if any)?
</p>
<p>
<input type="radio" name="addtonewgroup" value="no"><b>no</b><br>
<input type="radio" name="addtonewgroup" value="yes"><b>yes</b><br>
<input type="radio" name="addtonewgroup" value="yesifinold" checked>
<b>yes, but only if the bug was in its old product's group</b><br>
</p>
|;
else {
$vars->{"verify_fields"} = 0;
}
# End the form.
print qq|
<input type="submit" value="Commit">
</form>
<hr>
<a href="query.cgi">Cancel and Return to the Query Page</a>
|;
# End the page and stop processing.
PutFooter();
$vars->{'verify_bug_group'} = (Param('usebuggroups')
&& !defined($::FORM{'addtonewgroup'}));
$template->process("process/verify-new-product.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
exit;
}
}
@ -355,18 +290,12 @@ sub CheckCanChangeField {
return 1;
}
SendSQL("UNLOCK TABLES");
$oldvalue = value_quote($oldvalue);
$newvalue = value_quote($newvalue);
print PuntTryAgain(qq{
Only the owner or submitter of the bug, or a sufficiently
empowered user, may make that change to the $f field.
<TABLE>
<TR><TH ALIGN="right">Old value:</TH><TD>$oldvalue</TD></TR>
<TR><TH ALIGN="right">New value:</TH><TD>$newvalue</TD></TR>
</TABLE>
});
PutFooter();
exit();
$oldvalue = html_quote($oldvalue);
$newvalue = html_quote($newvalue);
ThrowUserError("You tried to change the <strong>$f</strong> field
from <em>$oldvalue</em> to <em>$newvalue</em>,
but only the owner or submitter of the bug, or a
sufficiently empowered user, may change that field.");
}
# Confirm that the reporter of the current bug can access the bug we are duping to.
@ -390,45 +319,21 @@ sub DuplicateUserConfirm {
}
SendSQL("SELECT cclist_accessible FROM bugs WHERE bug_id = $original");
my $cclist_accessible = FetchOneColumn();
$vars->{'cclist_accessible'} = FetchOneColumn();
# Once in this part of the subroutine, the user has not been auto-validated
# and the duper has not chosen whether or not to add to CC list, so let's
# ask the duper what he/she wants to do.
# First, will the user gain access to this bug immediately by being CC'd?
my $reporter_access = $cclist_accessible ? "will immediately" : "might, in the future,";
$vars->{'form'} = \%::FORM;
$vars->{'original_bug_id'} = $original;
$vars->{'duplicate_bug_id'} = $dupe;
# Confirm whether or not to add the reporter to the cc: list
# of the original bug (the one this bug is being duped against).
print "Content-type: text/html\n\n";
PutHeader("Duplicate Warning");
print "<P>
When marking a bug as a duplicate, the reporter of the
duplicate is normally added to the CC list of the original.
The permissions on bug #$original (the original) are currently set
such that the reporter would not normally be able to see it.
<P><B>Adding the reporter to the CC list of bug #$original
$reporter_access allow him/her access to view this bug.</B>
Do you wish to do this?</P>
</P>
";
print "<form method=post>\n\n";
foreach my $i (keys %::FORM) {
# Make sure we don't include the username/password fields in the
# HTML. If cookies are off, they'll have to reauthenticate after
# hitting "submit changes anyway".
# see http://bugzilla.mozilla.org/show_bug.cgi?id=15980
if ($i !~ /^(Bugzilla|LDAP)_(login|password)$/) {
my $value = value_quote($::FORM{$i});
print qq{<input type=hidden name="$i" value="$value">\n};
}
}
print qq{<p><input type=radio name="confirm_add_duplicate" value="1"> Yes, add the reporter to CC list on bug $original</p>\n};
print qq{<p><input type=radio name="confirm_add_duplicate" value="0" checked="checked"> No, do not add the reporter to CC list on bug $original</p>\n};
print qq{\n<p><a href="show_bug.cgi?id=$dupe">Throw away my changes, and go revisit bug $dupe</a>\n};
print qq{\n<p><input type="submit" value="Submit"></p></form>\n};
PutFooter();
$template->process("process/confirm-dupe.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
exit;
} # end DuplicateUserConfirm()
@ -466,11 +371,6 @@ if ($action eq Param("move-button-text")) {
}
# the common updates to all bugs in @idlist start here
#
print "<TITLE>Update Bug " . join(" ", @idlist) . "</TITLE>\n";
print "<HR>\n";
$::query = "update bugs\nset";
$::comma = "";
umask(0);
@ -686,10 +586,9 @@ SWITCH: for ($::FORM{'knob'}) {
DoComma();
if ( !defined$::FORM{'assigned_to'} ||
trim($::FORM{'assigned_to'}) eq "") {
PuntTryAgain("You cannot reassign to a bug to nobody. Unless " .
"you intentionally cleared out the " .
"\"Reassign bug to\" field, " .
Param("browserbugmessage"));
ThrowUserError("You cannot reassign to a bug to nobody. Unless you
intentionally cleared out the \"Reassign bug to\"
field, " . Param("browserbugmessage"));
}
my $newid = DBNameToIdAndCheck($::FORM{'assigned_to'});
$::query .= "assigned_to = $newid";
@ -697,12 +596,12 @@ SWITCH: for ($::FORM{'knob'}) {
};
/^reassignbycomponent$/ && CheckonComment( "reassignbycomponent" ) && do {
if ($::FORM{'product'} eq $::dontchange) {
PuntTryAgain("You must specify a product to help determine the " .
"new owner of these bugs.");
ThrowUserError("You must specify a product to help determine
the new owner of these bugs.");
}
if ($::FORM{'component'} eq $::dontchange) {
PuntTryAgain("You must specify a component whose owner should " .
"get assigned these bugs.");
ThrowUserError("You must specify a component whose owner
should get assigned these bugs.");
}
if ($::FORM{'compconfirm'}) {
DoConfirm();
@ -752,20 +651,19 @@ SWITCH: for ($::FORM{'knob'}) {
SendSQL("SELECT bug_id FROM bugs WHERE bug_id = " . SqlQuote($num));
$num = FetchOneColumn();
if (!$num) {
PuntTryAgain("You must specify a valid bug number of which this bug " .
"is a duplicate. The bug has not been changed.")
ThrowUserError("You must specify a valid bug number of which this bug
is a duplicate. The bug has not been changed.")
}
if (!defined($::FORM{'id'}) || $num == $::FORM{'id'}) {
PuntTryAgain("Nice try, $::COOKIE{'Bugzilla_login'}. But it doesn't really ".
"make sense to mark a bug as a duplicate of " .
"itself, does it?");
ThrowUserError("Nice try, $::COOKIE{'Bugzilla_login'}, but it doesn't
really make sense to mark a bug as a duplicate of itself,
does it?");
}
my $checkid = trim($::FORM{'id'});
SendSQL("SELECT bug_id FROM bugs where bug_id = " . SqlQuote($checkid));
$checkid = FetchOneColumn();
if (!$checkid) {
PuntTryAgain("The bug id $::FORM{'id'} is invalid. Please reload this bug ".
"and try again.");
ThrowUserError("The bug id $::FORM{'id'} is invalid.");
}
$::FORM{'comment'} .= "\n\n*** This bug has been marked as a duplicate of $num ***";
$duplicate = $num;
@ -773,14 +671,13 @@ SWITCH: for ($::FORM{'knob'}) {
last SWITCH;
};
# default
print "Unknown action $::FORM{'knob'}!\n";
PutFooter();
exit;
my $escaped_knob = html_quote($::FORM{'knob'});
ThrowCodeError("Unknown action $escaped_knob!\n");
}
if ($#idlist < 0) {
PuntTryAgain("You apparently didn't choose any bugs to modify.");
ThrowUserError("You apparently didn't choose any bugs to modify.");
}
@ -794,11 +691,9 @@ if ($::FORM{'keywords'}) {
}
my $i = GetKeywordIdFromName($keyword);
if (!$i) {
PuntTryAgain("Unknown keyword named <code>" .
html_quote($keyword) . "</code>. " .
"<P>The legal keyword names are " .
"<A HREF=describekeywords.cgi>" .
"listed here</A>.");
ThrowUserError("Unknown keyword named <code>" . html_quote($keyword) .
"</code>. <p>The legal keyword names are
<a href=\"describekeywords.cgi\">listed here</a></p>.");
}
if (!$keywordseen{$i}) {
push(@keywordlist, $i);
@ -814,8 +709,8 @@ if ($::comma eq ""
&& defined $::FORM{'masscc'} && ! $::FORM{'masscc'}
) {
if (!defined $::FORM{'comment'} || $::FORM{'comment'} =~ /^\s*$/) {
PuntTryAgain("Um, you apparently did not change anything on the " .
"selected bugs.");
ThrowUserError("Um, you apparently did not change anything
on the selected bugs.");
}
}
@ -948,64 +843,30 @@ foreach my $id (@idlist) {
SqlQuote($oldhash{'product'}));
if ($value eq FetchOneColumn()) {
SendSQL("UNLOCK TABLES");
PuntTryAgain("You must determine a target milestone for bug $id " .
"if you are going to accept it. (Part of " .
"accepting a bug is giving an estimate of when it " .
"will be fixed.)");
ThrowUserError("You must determine a target milestone for bug $id
if you are going to accept it. Part of accepting
a bug is giving an estimate of when it will be fixed.",
undef,
"abort");
}
}
if (defined $::FORM{'delta_ts'} && $::FORM{'delta_ts'} ne $delta_ts) {
print "
<H1>Mid-air collision detected!</H1>
Someone else has made changes to this bug at the same time you were trying to.
The changes made were:
<p>
";
use vars qw($template $vars);
($vars->{'operations'}) = GetBugActivity($::FORM{'id'}, $::FORM{'delta_ts'});
$vars->{'start_at'} = $::FORM{'longdesclength'};
$vars->{'comments'} = GetComments($id);
($vars->{'operations'}, $vars->{'incomplete_data'}) =
GetBugActivity($::FORM{'id'}, $::FORM{'delta_ts'});
$template->process("show/activity.html.tmpl", $vars)
|| DisplayError("Template process failed: " . $template->error())
&& exit;
my $comments = GetComments($id);
my $longchanged = 0;
if (scalar(@$comments) > $::FORM{'longdesclength'}) {
$longchanged = 1;
print "<P>Added comments:<blockquote>";
$vars->{'start_at'} = $::FORM{'longdesclength'};
$vars->{'comments'} = $comments;
$vars->{'quoteUrls'} = \&quoteUrls;
$template->process("show/comments.tmpl", $vars)
|| DisplayError("Template process failed: " . $template->error())
&& exit;
print "</blockquote>\n";
}
SendSQL("unlock tables");
print "You have the following choices: <ul>\n";
$::FORM{'delta_ts'} = $delta_ts;
print "<li><form method=post>";
foreach my $i (keys %::FORM) {
# Make sure we don't include the username/password fields in the
# HTML. If cookies are off, they'll have to reauthenticate after
# hitting "submit changes anyway".
# see http://bugzilla.mozilla.org/show_bug.cgi?id=15980
if ($i !~ /^(Bugzilla|LDAP)_(login|password)$/) {
my $value = value_quote($::FORM{$i});
print qq{<input type=hidden name="$i" value="$value">\n};
}
}
print qq{<input type=submit value="Submit my changes anyway">\n};
print " This will cause all of the above changes to be overwritten";
if ($longchanged) {
print ", except for the added comments";
}
print qq{.</form>\n<li><a href="show_bug.cgi?id=$id">Throw away my changes, and go revisit bug $id</a></ul>\n};
PutFooter();
$vars->{'form'} = \%::FORM;
$vars->{'bug_id'} = $id;
$vars->{'quoteUrls'} = \&quoteUrls;
SendSQL("UNLOCK TABLES");
# Warn the user about the mid-air collision and ask them what to do.
$template->process("process/mid-air.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
exit;
}
@ -1024,7 +885,7 @@ The changes made were:
my $orig = $i;
if (!detaint_natural($i)) {
PuntTryAgain("$orig is not a legal bug number");
ThrowUserError("$orig is not a legal bug number", undef, "abort");
}
# Don't use CanSeeBug, since we want to keep deps to bugs a
@ -1033,10 +894,12 @@ The changes made were:
SqlQuote($i));
my $comp = FetchOneColumn();
if ($comp ne $i) {
PuntTryAgain("$i is not a legal bug number");
ThrowUserError("$i is not a legal bug number", undef, "abort");
}
if ($id eq $i) {
PuntTryAgain("You can't make a bug blocked or dependent on itself.");
ThrowUserError("You can't make a bug blocked or dependent on itself.",
undef,
"abort");
}
if (!exists $seen{$i}) {
push(@{$deptree{$target}}, $i);
@ -1078,11 +941,13 @@ The changes made were:
foreach my $i (@isect) {
$both = $both . GetBugLink($i, "#" . $i) . " ";
}
PuntTryAgain("Dependency loop detected!<P>" .
"The following bug(s) would appear on both the \"depends on\" " .
"and \"blocks\" parts of the dependency tree if these changes " .
"are committed: $both<br>" .
"This would create a circular dependency, which is not allowed.");
ThrowUserError(qq|Dependency loop detected!<p>
The following bug(s) would appear on both the "depends on"
and "blocks" parts of the dependency tree if these changes
are committed: $both<br>This would create a circular
dependency, which is not allowed.</p>|,
undef,
"abort");
}
}
my $tmp = $me;
@ -1131,8 +996,6 @@ The changes made were:
}
my $query = "$basequery\nwhere bug_id = $id";
# print "<PRE>$query</PRE>\n";
if ($::comma ne "") {
SendSQL($query);
}
@ -1292,7 +1155,6 @@ The changes made were:
SendSQL("UPDATE bugs SET groupset = groupset - $groupbit WHERE bug_id = $id");
}
print qq|</p>|;
}
# get a snapshot of the newly set values out of the database,
@ -1352,8 +1214,7 @@ The changes made were:
if ($bug_changed) {
SendSQL("UPDATE bugs SET delta_ts = " . SqlQuote($timestamp) . " WHERE bug_id = $id");
}
print "<TABLE BORDER=1><TD><H2>Changes to bug $id submitted</H2>\n";
SendSQL("unlock tables");
SendSQL("UNLOCK TABLES");
my @ARGLIST = ();
if ( $removedCcString ne "" ) {
@ -1366,10 +1227,25 @@ The changes made were:
push @ARGLIST, ( "-forceqacontact", $origQaContact);
}
push @ARGLIST, ($id, $::COOKIE{'Bugzilla_login'});
system ("./processmail",@ARGLIST);
print "<TD><A HREF=\"show_bug.cgi?id=$id\">Back To BUG# $id</A></TABLE>\n";
# Send mail to let people know the bug has been changed. Uses
# a special syntax of the "open" and "exec" commands to capture
# the output "processmail", which "system" doesn't allow
# (i.e. "system ('./processmail', $bugid , $::userid);"), without
# the insecurity of running the command through a shell via backticks
# (i.e. "my $mailresults = `./processmail $bugid $::userid`;").
$vars->{'mail'} = "";
open(PMAIL, "-|") or exec('./processmail', @ARGLIST);
$vars->{'mail'} .= $_ while <PMAIL>;
close(PMAIL);
$vars->{'id'} = $id;
# Let the user know the bug was changed and who did and didn't
# receive email about the change.
$template->process("process/results.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
if ($duplicate) {
# Check to see if Reporter of this bug is reporter of Dupe
SendSQL("SELECT reporter FROM bugs WHERE bug_id = " . SqlQuote($::FORM{'id'}));
@ -1387,15 +1263,34 @@ The changes made were:
AppendComment($duplicate, $::COOKIE{'Bugzilla_login'}, "*** Bug $::FORM{'id'} has been marked as a duplicate of this bug. ***");
CheckFormFieldDefined(\%::FORM,'comment');
SendSQL("INSERT INTO duplicates VALUES ($duplicate, $::FORM{'id'})");
print "<TABLE BORDER=1><TD><H2>Duplicate notation added to bug $duplicate</H2>\n";
system("./processmail", $duplicate, $::COOKIE{'Bugzilla_login'});
print "<TD><A HREF=\"show_bug.cgi?id=$duplicate\">Go To BUG# $duplicate</A></TABLE>\n";
$vars->{'mail'} = "";
open(PMAIL, "-|") or exec('./processmail', $duplicate, $::COOKIE{'Bugzilla_login'});
$vars->{'mail'} .= $_ while <PMAIL>;
close(PMAIL);
$vars->{'id'} = $duplicate;
$vars->{'type'} = "dupe";
# Let the user know a duplication notation was added to the original bug.
$template->process("process/results.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
}
foreach my $k (keys(%dependencychanged)) {
print "<TABLE BORDER=1><TD><H2>Checking for dependency changes on bug $k</H2>\n";
system("./processmail", $k, $::COOKIE{'Bugzilla_login'});
print "<TD><A HREF=\"show_bug.cgi?id=$k\">Go To BUG# $k</A></TABLE>\n";
$vars->{'mail'} = "";
open(PMAIL, "-|") or exec('./processmail', $k, $::COOKIE{'Bugzilla_login'});
$vars->{'mail'} .= $_ while <PMAIL>;
close(PMAIL);
$vars->{'id'} = $k;
$vars->{'type'} = "dep";
# Let the user know we checked to see if we should email notice
# of this change to users with a relationship to the dependent
# bug and who did and didn't receive email about it.
$template->process("process/results.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
}
}
@ -1403,26 +1298,28 @@ The changes made were:
# Show next bug, if it exists.
if ($::COOKIE{"BUGLIST"} && $::FORM{'id'}) {
my @bugs = split(/:/, $::COOKIE{"BUGLIST"});
$vars->{'bug_list'} = \@bugs;
my $cur = lsearch(\@bugs, $::FORM{"id"});
if ($cur >= 0 && $cur < $#bugs) {
my $next_bug = $bugs[$cur + 1];
if (detaint_natural($next_bug) && CanSeeBug($next_bug)) {
print "<hr>\n";
print("<p>The next bug in your list is bug ");
print("<a href='show_bug.cgi?id=$next_bug'>$next_bug</a>:</p>\n");
$::FORM{'id'} = $next_bug;
$vars->{'next_id'} = $next_bug;
# Let the user know we are about to display the next bug in their list.
$template->process("process/next-bug.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
show_bug("header is already done");
exit;
}
else {
# Need this until the navigation_header() fn. goes away totally.
undef $::next_bug;
}
}
}
navigation_header();
PutFooter();
# End the response page.
$template->process("show/navigate.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
$template->process("global/footer", $vars)
|| ThrowTemplateError($template->error());

View File

@ -0,0 +1,32 @@
<!-- 1.0@bugzilla.org -->
[%# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
[%# INTERFACE:
# form: hash; the form fields/values for which to generate hidden fields.
# exclude: string; a regular expression matching fields to exclude
# from the list of hidden fields generated by this template
#%]
[%# Generate hidden form fields for non-excluded fields. %]
[% FOREACH field = form %]
[% NEXT IF field.key.search(exclude) %]
<input type="hidden" name="[% field.key %]" value="[% field.value FILTER html %]">
[% END %]

View File

@ -0,0 +1,73 @@
<!-- 1.0@bugzilla.org -->
[%# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
[%# INTERFACE:
# form: hash; the form values submitted to the script
# original_bug_id: number; the bug number for the bug
# against which a bug is being duped
# duplicate_bug_id: number; the bug number for the bug
# being duped
# cclist_accessible: boolean; whether or not users on the cc: list
# of the original bug can access that bug.
#%]
[% PROCESS global/header title="Duplicate Warning" %]
<p>
When marking a bug as a duplicate, the reporter of the duplicate
is normally added to the CC list of the original. The permissions
on bug [% original_bug_id %] (the original) are currently set
such that the reporter would not normally be able to see it.
</p>
<p>
<b>Adding the reporter to the CC list of bug [% original_bug_id %]
[% IF cclist_accessible %]
will immediately
[% ELSE %]
might, in the future,
[% END %]
allow him/her access to view this bug.</b>
Do you wish to do this?
</p>
<form method="post">
[% PROCESS "global/hidden-fields.html.tmpl" exclude="^(Bugzilla|LDAP)_(login|password)$" %]
<p>
<input type="radio" name="confirm_add_duplicate" value="1">
Yes, add the reporter to CC list on bug [% original_bug_id %]
</p>
<p>
<input type="radio" name="confirm_add_duplicate" value="0" checked="checked">
No, do not add the reporter to CC list on bug [% original_bug_id %]
</p>
<p>
<a href="show_bug.cgi?id=[% duplicate_bug_id %]">Throw away my changes,
and revisit bug [% duplicate_bug_id %]</a>
<p>
<input type="submit" value="Submit">
</p>
</form>
[% PROCESS global/footer %]

View File

@ -0,0 +1,75 @@
<!-- 1.0@bugzilla.org -->
[%# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
[%# INTERFACE:
# form: hash; the form values submitted to the script
# operations: array; bug activity since the user last displayed the bug form,
# used by show/activity.html.tmpl to display recent changes that will be
# overwritten if the user submits these changes. See that template
# for further documentation.
# start_at: number; the comment at which show/comments.tmpl should begin
# displaying comments, either the index of the last comment (if the user
# entered a comment along with their change) or a number less than that
# (if they didn't), in which case no comments are displayed.
# comments: array; all the comments on the bug.
# bug_id: number; the ID of the bug being changed.
#%]
<h1>Mid-air collision detected!</h1>
<p>
Someone else has made changes to this bug at the same time you were trying to.
The changes made were:
</p>
<p>
[% PROCESS "show/activity.html.tmpl" incomplete_data=0 %]
</p>
[% IF comments.size > start_at %]
<p>
Added comments:
<blockquote>
[% PROCESS "show/comments.tmpl" %]
</blockquote>
</p>
[% END %]
<p>
You have the following choices:
</p>
<ul>
<li>
<form method="post">
[% PROCESS "global/hidden-fields.html.tmpl" exclude="^(Bugzilla|LDAP)_(login|password)$" %]
<input type="submit" value="Submit my changes anyway">
This will cause all of the above changes to be overwritten
[% ", except for the added comment(s)" IF comments.size > start_at %].
</form>
</li>
<li>
<a href="show_bug.cgi?id=[% bug_id %]">Throw away my changes,
and revisit bug [% bug_id %]</a>
</li>
</ul>
[% PROCESS global/footer %]

View File

@ -0,0 +1,32 @@
<!-- 1.0@bugzilla.org -->
[%# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
[%# INTERFACE:
# next_id : number; the ID of the next bug in the user's bug list.
#%]
<hr>
<p>
The next bug in your list is bug
<a href="show_bug.cgi?id=[% next_id %]">[% next_id %]</a>:
</p>

View File

@ -0,0 +1,50 @@
<!-- 1.0@bugzilla.org -->
[%# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
[%# INTERFACE:
# id: number; the ID of the bug that was changed/checked.
#
# type: string; the type of change/check that was made: "bug" when a bug
# is changed, "dupe" when a duplication notation is added to a bug,
# and "dep" when a bug is checked for changes to its dependencies.
#%]
[% DEFAULT type="bug" %]
[%
title = {
'bug' => "Changes submitted for bug" ,
'dupe' => "Duplicate notation added to bug" ,
'dep' => "Checking for dependency changes on bug" ,
}
%]
<table border="1">
<tr>
<td>
<h2>[% title.$type %] [%+ id %]</h2>
[% mail %]
</td>
<td>
<a href="show_bug.cgi?id=[% id %]">Back To BUG# [% id %]</a>
</td>
</tr>
</table>

View File

@ -0,0 +1,100 @@
<!-- 1.0@bugzilla.org -->
[%# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
#%]
[%# INTERFACE:
# form: hash; the form values submitted to the script
# verify_fields: boolean; whether or not to verify
# the version, component, and target milestone fields
# versions: array; versions for the new product.
# components: array; components for the new product.
# milestones: array; milestones for the new product.
# verify_bug_group: boolean; whether or not to ask the user
# if they want to add the bug to its new product's group
# use_target_milestone: boolean; whether or not to use
# the target milestone field
#%]
[% USE mycgi = CGI %]
<form action="process_bug.cgi" method="post">
[% PROCESS "global/hidden-fields.html.tmpl" exclude="^version|component|target_milestone$" %]
[%# Verify the version, component, and target milestone fields. %]
[% IF verify_fields %]
<h3>Verify Version, Component[% ", Target Milestone" IF use_target_milestone %]</h3>
<p>
[% IF usetargetmilestone %]
You are moving the bug(s) to the product <b>[% form.product %]</b>,
and the version, component, and/or target milestone fields are no longer
correct. Please set the correct version, component, and target milestone now:
[% ELSE %]
You are moving the bug(s) to the product <b>[% form.product %]</b>,
and the version and component fields are no longer correct.
Please set the correct version and component now:
[% END %]
<p>
<table>
<tr>
<td>
<b>Version:</b><br>
[% mycgi.popup_menu(Name => "version" , Values => versions) %]
</td>
<td>
<b>Component:</b><br>
[% mycgi.popup_menu(Name => "component" , Values => components) %]
</td>
[% IF use_target_milestone %]
<td>
<b>Target Milestone:</b><br>
[% mycgi.popup_menu(Name => "target_milestone" , Values => milestones) %]
</td>
[% END %]
</tr>
</table>
[% END %]
[% IF verify_bug_group %]
<h3>Verify Bug Group</h3>
<p>
Do you want to add the bug to its new product's group (if any)?
</p>
<p>
<input type="radio" name="addtonewgroup" value="no"><b>no</b><br>
<input type="radio" name="addtonewgroup" value="yes"><b>yes</b><br>
<input type="radio" name="addtonewgroup" value="yesifinold" checked>
<b>yes, but only if the bug was in its old product's group</b><br>
</p>
[% END %]
<input type="submit" value="Commit">
</form>
<hr>
<a href="query.cgi">Cancel and Return to the Query Page</a>
[% PROCESS global/footer %]