pjs/webtools/bugzilla/process_bug.cgi

312 строки
8.9 KiB
Perl
Executable File

#! /usr/bonsaitools/bin/mysqltcl
# -*- Mode: tcl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public License
# Version 1.0 (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): Terry Weissman <terry@mozilla.org>
source "CGI.tcl"
confirm_login
puts "Content-type: text/html\n"
GetVersionTable
if {![cequal $FORM(product) $dontchange]} {
set prod [FormData product]
set vok [expr [lsearch -exact $versions($prod) \
[FormData version]] >= 0]
set cok [expr [lsearch -exact $components($prod) \
[FormData component]] >= 0]
if {!$vok || !$cok} {
puts "<H1>Changing product means changing version and component.</H1>"
puts "You have chosen a new product, and now the version and/or"
puts "component fields are not correct. (Or, possibly, the bug did"
puts "not have a valid component or version field in the first place.)"
puts "Anyway, please set the version and component now.<p>"
puts "<form>"
puts "<table>"
puts "<tr>"
puts "<td align=right><b>Product:</b></td>"
puts "<td>$prod</td>"
puts "</tr><tr>"
puts "<td align=right><b>Version:</b></td>"
puts "<td>[Version_element [FormData version] $prod]</td>"
puts "</tr><tr>"
puts "<td align=right><b>Component:</b></td>"
puts "<td>[Component_element [FormData component] $prod]</td>"
puts "</tr>"
puts "</table>"
foreach i [array names FORM] {
if {[lsearch -exact {version component} $i] < 0} {
puts "<input type=hidden name=$i value=\"[value_quote $FORM($i)]\">"
}
}
puts "<input type=submit value=Commit>"
puts "</form>"
puts "</hr>"
puts "<a href=query.cgi>Cancel all this and go back to the query page.</a>"
exit
}
}
if {[info exists FORM(id)]} {
set idlist $FORM(id)
} else {
set idlist {}
foreach i [array names FORM] {
if {[string match "id_*" $i]} {
lappend idlist [crange $i 3 end]
}
}
}
if {![info exists FORM(who)]} {
set FORM(who) $COOKIE(Bugzilla_login)
}
puts "<TITLE>Update Bug $idlist</TITLE>"
if {[info exists FORM(id)]} {
navigation_header
}
puts "<HR>"
set query "update bugs\nset"
set comma ""
umask 0
proc DoComma {} {
global query comma
append query "$comma\n "
set comma ","
}
proc ChangeStatus {str} {
global dontchange query
if {![cequal $str $dontchange]} {
DoComma
append query "bug_status = '$str'"
}
}
proc ChangeResolution {str} {
global dontchange query
if {![cequal $str $dontchange]} {
DoComma
append query "resolution = '$str'"
}
}
foreach field {rep_platform priority bug_severity url summary \
component bug_file_loc short_desc \
product version component} {
if {[info exists FORM($field)]} {
if {![cequal $FORM($field) $dontchange]} {
DoComma
regsub -all "'" [FormData $field] "''" value
append query "$field = '$value'"
}
}
}
ConnectToDatabase
switch -exact $FORM(knob) {
none {}
accept {
ChangeStatus ASSIGNED
}
clearresolution {
ChangeResolution {}
}
resolve {
ChangeStatus RESOLVED
ChangeResolution $FORM(resolution)
}
reassign {
ChangeStatus NEW
DoComma
set newid [DBNameToIdAndCheck $FORM(assigned_to)]
append query "assigned_to = $newid"
}
reassignbycomponent {
if {[cequal $FORM(component) $dontchange]} {
puts "You must specify a component whose owner should get assigned"
puts "these bugs."
exit 0
}
ChangeStatus NEW
DoComma
SendSQL "select initialowner from components
where program='[SqlQuote $FORM(product)]'
and value='[SqlQuote $FORM(component)]'"
set newname [lindex [FetchSQLData] 0]
set newid [DBNameToIdAndCheck $newname 1]
append query "assigned_to = $newid"
}
reopen {
ChangeStatus REOPENED
}
verify {
ChangeStatus VERIFIED
}
close {
ChangeStatus CLOSED
}
duplicate {
ChangeStatus RESOLVED
ChangeResolution DUPLICATE
set num $FORM(dup_id)
if {[catch {incr num}]} {
puts "You must specify a bug number of which this bug is a"
puts "duplicate. The bug has not been changed."
exit
}
if {$FORM(dup_id) == $FORM(id)} {
puts "Nice try. But it doesn't really make sense to mark a bug as"
puts "a duplicate of itself, does it?"
exit
}
AppendComment $FORM(dup_id) $FORM(who) "*** Bug $FORM(id) has been marked as a duplicate of this bug. ***"
append FORM(comment) "\n\n*** This bug has been marked as a duplicate of $FORM(dup_id) ***"
exec ./processmail $FORM(dup_id) < /dev/null > /dev/null 2> /dev/null &
}
default {
puts "Unknown action $FORM(knob)!"
exit
}
}
if {[lempty $idlist]} {
puts "You apparently didn't choose any bugs to modify."
puts "<p>Click <b>Back</b> and try again."
exit
}
if {[cequal $comma ""]} {
set comment {}
if {[info exists FORM(comment)]} {
set comment $FORM(comment)
}
if {[cequal $comment ""]} {
puts "Um, you apparently did not change anything on the selected bugs."
puts "<p>Click <b>Back</b> and try again."
exit
}
}
set basequery $query
proc SnapShotBug {id} {
global log_columns
SendSQL "select [join $log_columns ","] from bugs where bug_id = $id"
return [FetchSQLData]
}
foreach id $idlist {
SendSQL "lock tables bugs write, bugs_activity write, cc write, profiles write"
set oldvalues [SnapShotBug $id]
set query "$basequery\nwhere bug_id = $id"
# puts "<PRE>$query</PRE>"
if {![cequal $comma ""]} {
if { [SendSQL $query] != 0 } {
puts "<H1>Error -- Changes not applied</H1>"
puts "OK, the database rejected the changes for some reason"
puts "which bugzilla can't deal with. The error string returned"
puts "was:<PRE>$oramsg(errortxt)</PRE>"
puts "Here is the query which caused the error:"
puts "<PRE>$query</PRE>"
}
while {[MoreSQLData]} {
FetchSQLData
}
}
if {[info exists FORM(comment)]} {
AppendComment $id $FORM(who) [FormData comment]
}
if {[info exists FORM(cc)] && [ShowCcList $id] != [lookup FORM cc]} {
set ccids(zz) 1
unset ccids(zz)
foreach person [split $FORM(cc) " ,"] {
if {![cequal $person ""]} {
set cid [DBNameToIdAndCheck $person]
set ccids($cid) 1
}
}
SendSQL "delete from cc where bug_id = $id"
while {[MoreSQLData]} { FetchSQLData }
foreach ccid [array names ccids] {
SendSQL "insert into cc (bug_id, who) values ($id, $ccid)"
while { [ MoreSQLData ] } { FetchSQLData }
}
}
# oracommit $lhandle
set newvalues [SnapShotBug $id]
foreach col $log_columns {
set old [lvarpop oldvalues]
set new [lvarpop newvalues]
if {![cequal $old $new]} {
if {![info exists whoid]} {
set whoid [DBNameToIdAndCheck $FORM(who)]
SendSQL "select delta_ts from bugs where bug_id = $id"
set timestamp [lindex [FetchSQLData] 0]
}
if {[cequal $col assigned_to]} {
set old [DBID_to_name $old]
set new [DBID_to_name $new]
}
set q "insert into bugs_activity (bug_id,who,when,field,oldvalue,newvalue) values ($id,$whoid,$timestamp,'[SqlQuote $col]','[SqlQuote $old]','[SqlQuote $new]')"
# puts "<pre>$q</pre>"
SendSQL $q
}
}
puts "<TABLE BORDER=1><TD><H1>Changes Submitted</H1>"
puts "<TD><A HREF=\"show_bug.cgi?id=$id\">Back To BUG# $id</A></TABLE>"
flush stdout
SendSQL "unlock tables"
exec ./processmail $id < /dev/null > /dev/null 2> /dev/null &
}
if {[info exists next_bug]} {
set FORM(id) $next_bug
puts "<HR>"
navigation_header
source "bug_form.tcl"
} else {
puts "<BR><A HREF=\"query.cgi\">Back To Query Page</A>"
}