diff options
author | terry%netscape.com <> | 1998-08-26 15:14:15 +0200 |
---|---|---|
committer | terry%netscape.com <> | 1998-08-26 15:14:15 +0200 |
commit | 482763c95359bd0352878542826693064d9e365e (patch) | |
tree | af570f3e013f34f28ca7967e4b7dcd7a9f05f854 /buglist.cgi | |
download | bugzilla-482763c95359bd0352878542826693064d9e365e.tar.gz bugzilla-482763c95359bd0352878542826693064d9e365e.tar.xz |
Bugzilla source.
Diffstat (limited to 'buglist.cgi')
-rwxr-xr-x | buglist.cgi | 623 |
1 files changed, 623 insertions, 0 deletions
diff --git a/buglist.cgi b/buglist.cgi new file mode 100755 index 000000000..3ac68c4df --- /dev/null +++ b/buglist.cgi @@ -0,0 +1,623 @@ +#! /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> + +puts "Content-type: multipart/x-mixed-replace;boundary=ThisRandomString" +puts "" +puts "--ThisRandomString" + +proc InitMessage {str} { + global initstr + append initstr "$str\n" + puts "Content-type: text/plain" + puts "" + puts $initstr + puts "" + puts "--ThisRandomString" + flush stdout +} + + +# The below "if catch" stuff, if uncommented, will trap any error, and +# mail the error messages to terry. What a hideous, horrible +# debugging hack. + +# if {[catch { + + +source "CGI.tcl" + +ConnectToDatabase + +if {![info exists FORM(cmdtype)]} { + # This can happen if there's an old bookmark to a query... + set FORM(cmdtype) doit +} + +switch $FORM(cmdtype) { + runnamed { + set buffer $COOKIE(QUERY_$FORM(namedcmd)) + ProcessFormFields $buffer + } + editnamed { + puts "Content-type: text/html +Refresh: 0; URL=query.cgi?$COOKIE(QUERY_$FORM(namedcmd)) + +<TITLE>What a hack.</TITLE> +Loading your query named <B>$FORM(namedcmd)</B>..." + exit + } + forgetnamed { + puts "Set-Cookie: QUERY_$FORM(namedcmd)= ; path=/ ; expires=Sun, 30-Jun-99 00:00:00 GMT +Content-type: text/html + +<HTML> +<TITLE>Forget what?</TITLE> +OK, the <B>$FORM(namedcmd)</B> query is gone. +<P> +<A HREF=query.cgi>Go back to the query page.</A>" + exit + } + asnamed { + if {[regexp {^[a-zA-Z0-9_ ]+$} $FORM(newqueryname)]} { + puts "Set-Cookie: QUERY_$FORM(newqueryname)=$buffer ; path=/ ; expires=Sun, 30-Jun-99 00:00:00 GMT +Content-type: text/html + +<HTML> +<TITLE>OK, done.</TITLE> +OK, you now have a new query named <B>$FORM(newqueryname)</B>. + +<P> + +<A HREF=query.cgi>Go back to the query page.</A>" + } else { + puts "Content-type: text/html + +<HTML> +<TITLE>Picky, picky.</TITLE> +Query names can only have letters, digits, spaces, or underbars. You entered +\"<B>$FORM(newqueryname)</B>\", which doesn't cut it. +<P> +Click the <B>Back</B> button and type in a valid name for this query." + } + exit + } + asdefault { + puts "Set-Cookie: DEFAULTQUERY=$buffer ; path=/ ; expires=Sun, 30-Jun-99 00:00:00 GMT +Content-type: text/html + +<HTML> +<TITLE>OK, default is set.</TITLE> +OK, you now have a new default query. + +<P> + +<A HREF=query.cgi>Go back to the query page, using the new default.</A>" + exit + } +} + +proc qadd { item } { + global query + append query "$item" +} + + +proc DefCol {name k t {s ""} {q 0}} { + global key title sortkey needquote + set key($name) $k + set title($name) $t + if {![cequal $s ""]} { + set sortkey($name) $s + } + set needquote($name) $q +} + +DefCol resolved_ts "bugs.resolved_ts" DateResolved bugs.resolved_ts +DefCol verified_ts "bugs.verified_ts" DateVerified bugs.verified_ts +DefCol opendate "date_format(bugs.creation_ts,'Y-m-d')" Opened bugs.creation_ts +DefCol changeddate "date_format(bugs.delta_ts,'Y-m-d')" Changed bugs.delta_ts +DefCol severity "substring(bugs.bug_severity, 1, 3)" Sev bugs.bug_severity +DefCol priority "substring(bugs.priority, 1, 3)" Pri bugs.priority +DefCol platform "substring(bugs.rep_platform, 1, 3)" Plt bugs.rep_platform +DefCol owner "assign.login_name" Owner assign.login_name +DefCol reporter "report.login_name" Reporter report.login_name +DefCol status "substring(bugs.bug_status,1,4)" State bugs.bug_status +DefCol resolution "substring(bugs.resolution,1,4)" Res bugs.resolution +DefCol summary "substring(bugs.short_desc, 1, 60)" Summary {} 1 +DefCol summaryfull "bugs.short_desc" Summary {} 1 +DefCol component "substring(bugs.component, 1, 8)" Comp bugs.component +DefCol product "substring(bugs.product, 1, 8)" Product bugs.product +DefCol version "substring(bugs.version, 1, 5)" Vers bugs.version +DefCol os "substring(bugs.op_sys, 1, 4)" OS bugs.op_sys +DefCol status_summary "bugs.status_summary" Status_Summary {} 1 + +if {[info exists COOKIE(COLUMNLIST)]} { + set collist $COOKIE(COLUMNLIST) +} else { + set collist $default_column_list +} + +set dotweak [info exists FORM(tweak)] + +if {$dotweak} { + confirm_login +} + + +puts "Content-type: text/plain\n" + +set query " +select + bugs.bug_id" + + +foreach c $collist { + append query ", +\t$key($c)" +} + + +if {$dotweak} { + append query ", +bugs.product, +bugs.bug_status" +} + +append query " +from bugs, + profiles assign, + profiles report, + versions projector +where bugs.assigned_to = assign.userid +and bugs.reporter = report.userid +and bugs.product = projector.program +and bugs.version = projector.value +" + +if {[info exists FORM(sql)]} { + append query "and (\n[join [url_decode $FORM(sql)] { }]\n)" +} else { + + + set legal_fields { bug_id product version rep_platform op_sys bug_status + resolution priority bug_severity assigned_to reporter + bug_file_loc short_desc component + status_summary resolved_ts verified_ts} + + foreach field [array names FORM] { + if { [ lsearch $legal_fields $field ] != -1 && ![cequal $FORM($field) ""]} { + qadd "\tand (\n" + set or "" + if { $field == "assigned_to" || $field == "reporter" || $field == "qa_assigned_to"} { + foreach p [split $FORM($field) ","] { + qadd "\t\t${or}bugs.$field = [DBname_to_id $p]\n" + set or "or " + } + } elseif { $field == "resolved_ts"} { + if {! [cequal $FORM(resolved_ts_2) ""]} { + qadd "\t\tbugs.resolved_ts between \n\t\t\tTO_DATE('$FORM($field)','DD-MON-YY') and\n \t\t\tTO_DATE('$FORM(resolved_ts_2)', 'DD-MON-YY')\n" + } else { + qadd "\t\tTO_CHAR (bugs.resolved_ts,'DD-MON-YY') = '[string toupper $FORM($field)]'\n" + } + } elseif { $field == "verified_ts"} { + if {! [cequal $FORM(verified_ts_2) ""]} { + qadd "\t\tbugs.verified_ts between \n\t\t\tTO_DATE('$FORM($field)','DD-MON-YY') and\n \t\t\tTO_DATE('$FORM(verified_ts_2)', 'DD-MON-YY')\n" + } else { + qadd "\t\tTO_CHAR (bugs.verified_ts,'DD-MON-YY') = '[string toupper $FORM($field)]'\n" + } + } else { + foreach v $MFORM($field) { + if {[cequal $v "(empty)"]} { + qadd "\t\t${or}bugs.$field is null\n" + } else { + qadd "\t\t${or}bugs.$field = '$v'\n" + } + set or "or " + } + } + qadd "\t)\n" + } + } + + if {[lookup FORM changedin] != ""} { + qadd "and to_days(now()) - to_days(bugs.delta_ts) <= $FORM(changedin) " + } +} + +if {[info exists FORM(order)]} { + qadd "order by " + switch -glob $FORM(order) { + *.* {} + *Number* { + set FORM(order) bugs.bug_id + } + *Import* { + set FORM(order) bugs.priority + } + *Assign* { + set FORM(order) "assign.login_name, bugs.bug_status, priorities.rank, bugs.bug_id" + } + default { + set FORM(order) "bugs.bug_status, priorities.rank, assign.login_name, bugs.bug_id" + } + } + if {[cequal [cindex $FORM(order) 0] "\{"]} { + # I don't know why this happens, but... + set FORM(order) [lindex $FORM(order) 0] + } + qadd $FORM(order) +} + +puts "Please stand by ..." +if {[info exists FORM(debug)]} { + puts $query +} +flush stdout +set child 0 +if {[info exists FORM(keepalive)]} { + set child [fork] + if {$child == 0} { + while 1 { + puts "Still waiting ..." + flush stdout + sleep 10 + } + puts "Child process died, what's up?" + flush stdout + exit 0 + } +} +SendSQL $query + +set count 0 +set bugl "" +proc pnl { str } { + global bugl + append bugl "$str" +} + +regsub -all {[&?]order=[^&]*} $buffer {} fields +regsub -all {[&?]cmdtype=[^&]*} $fields {} fields + + +if {[info exists FORM(order)]} { + regsub -all { } ", $FORM(order)" "%20" oldorder +} else { + set oldorder "" +} + +if {$dotweak} { + pnl "<FORM NAME=changeform METHOD=POST ACTION=\"process_bug.cgi\">" +} + +set tablestart "<TABLE CELLSPACING=0 CELLPADDING=2> +<TR ALIGN=LEFT><TH> +<A HREF=\"buglist.cgi?[set fields]&order=bugs.bug_id\">ID</A>" + + +foreach c $collist { + if {$needquote($c)} { + append tablestart "<TH WIDTH=100% valigh=left>" + } else { + append tablestart "<TH valign=left>" + } + if {[info exists sortkey($c)]} { + append tablestart "<A HREF=\"buglist.cgi?[set fields]&order=$sortkey($c)$oldorder\">$title($c)</A>" + } else { + append tablestart $title($c) + } +} + +append tablestart "\n" + +set dotweak [info exists FORM(tweak)] + +set p_true 1 + +while { $p_true } { + set result [FetchSQLData] + set p_true [MoreSQLData] + if { $result != "" } { + set bug_id [lvarpop result] + if {![info exists seen($bug_id)]} { + set seen($bug_id) 1 + incr count + if {($count % 200) == 0} { + # Too big tables take too much browser memory... + pnl "</TABLE>$tablestart" + } + if {[info exists buglist]} { + append buglist ":$bug_id" + } else { + set buglist $bug_id + } + pnl "<TR VALIGN=TOP ALIGN=LEFT><TD>" + if {$dotweak} { + pnl "<input type=checkbox name=id_$bug_id>" + } + pnl "<A HREF=\"show_bug.cgi?id=$bug_id\">" + pnl "$bug_id</A> " + foreach c $collist { + set value [lvarpop result] + set nowrap {} + + #-- This cursor is used to pick the login_name to be + # displayed on the query list as the field value may or + # maynot have vales associated to it + + if { $c == "qa_assigned_to"} { + set dml_cur [ oraopen $lhandle ] + + orasql $dml_cur "select login_name + from profiles + where userid = $value" + + set cur_resultset [orafetch $dml_cur] + + if {$cur_resultset != ""} { + set value $cur_resultset + set nowrap {nowrap} + } else { + set value "" + } + + oraclose $dml_cur + + } + + if {$needquote($c)} { + set value [html_quote $value] + } else { + set value "<nobr>$value</nobr>" + } + pnl "<td $nowrap>$value" + } + if {$dotweak} { + set value [lvarpop result] + set prodarray($value) 1 + set value [lvarpop result] + set statusarray($value) 1 + } + pnl "\n" + } + } +} +if {$child != 0} { + kill $child +} +puts "" +puts "--ThisRandomString" + +set toolong 0 +puts "Content-type: text/html" +if { [info exists buglist] } { + if {[clength $buglist] < 4000} { + puts "Set-Cookie: BUGLIST=$buglist\n" + } else { + puts "Set-Cookie: BUGLIST=\n" + set toolong 1 + } +} else { + puts "" +} +set env(TZ) PST8PDT + +PutHeader "Bug List" "Bug List" + +puts -nonewline " +<CENTER><H1>M<font -= 2>OZILLA</font> B<font -= 2>UGS</font></H1> +<B>[fmtclock [getclock ]]</B>" +if {[info exists FORM(debug)]} { puts "<PRE>$query</PRE>" } + +if {$toolong} { + puts "<h2>This list is too long for bugzilla's little mind; the" + puts "Next/Prev/First/Last buttons won't appear.</h2>" +} + +set cdata [ split [read_file -nonewline "comments"] "\n" ] +random seed +puts {<HR><I><A HREF="newquip.html">} +puts [lindex $cdata [random [llength $cdata]]]</I></A></CENTER> +puts "<HR SIZE=10>$tablestart" +puts $bugl +puts "</TABLE>" + +switch $count { + 0 { + puts "Zarro Boogs found." + } + 1 { + puts "One bug found." + } + default { + puts "$count bugs found." + } +} + +if {$dotweak} { + GetVersionTable + puts " +<SCRIPT> +numelements = document.changeform.elements.length; +function SetCheckboxes(value) { + for (var i=0 ; i<numelements ; i++) { + item = document.changeform.elements\[i\]; + item.checked = value; + } +} +document.write(\" <input type=button value=\\\"Uncheck All\\\" onclick=\\\"SetCheckboxes(false);\\\"> <input type=button value=\\\"Check All\\\" onclick=\\\"SetCheckboxes(true);\\\">\"); +</SCRIPT>" + set resolution_popup [make_options $legal_resolution_no_dup FIXED] + GetVersionTable + set prod_list [array names prodarray] + set list $prod_list + set legal_target_versions $versions([lvarpop list]) + foreach p $list { + set legal_target_versions [intersect $legal_target_versions \ + $versions($p)] + } + set version_popup [make_options \ + [concat "-blank-" $legal_target_versions] \ + $dontchange] + set platform_popup [make_options $legal_platform $dontchange] + set priority_popup [make_options $legal_priority $dontchange] + set sev_popup [make_options $legal_severity $dontchange] + if {[llength $prod_list] == 1} { + set prod_list [lindex $prod_list 0 ] + set legal_component [linsert $components($prod_list) 0 { }] + } else { + set legal_component { } + } + + set component_popup [make_options $legal_component $dontchange] + + set product_popup [make_options $legal_product $dontchange] + + + puts " +<hr> +<TABLE> +<TR> + <TD ALIGN=RIGHT><B>Product:</B></TD> + <TD><SELECT NAME=product>$product_popup</SELECT></TD> + <TD ALIGN=RIGHT><B>Version:</B></TD> + <TD><SELECT NAME=version>$version_popup</SELECT></TD> +<TR> + <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#rep_platform\">Platform:</A></B></TD> + <TD><SELECT NAME=rep_platform>$platform_popup</SELECT></TD> + <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#priority\">Priority:</A></B></TD> + <TD><SELECT NAME=priority>$priority_popup</SELECT></TD> +</TR> +<TR> + <TD ALIGN=RIGHT><B>Component:</B></TD> + <TD><SELECT NAME=component>$component_popup</SELECT></TD> + <TD ALIGN=RIGHT><B><A HREF=\"bug_status.html#severity\">Severity:</A></B></TD> + <TD><SELECT NAME=bug_severity>$sev_popup</SELECT></TD> +</TR> +</TABLE> + +<INPUT NAME=multiupdate value=Y TYPE=hidden> + +<B>Additional Comments:</B> +<BR> +<TEXTAREA WRAP=HARD NAME=comment ROWS=5 COLS=80></TEXTAREA><BR>" + + # knum is which knob number we're generating, in javascript terms. + + set knum 0 + puts " +<INPUT TYPE=radio NAME=knob VALUE=none CHECKED> + Do nothing else<br>" + incr knum + puts " +<INPUT TYPE=radio NAME=knob VALUE=accept> + Accept bugs (change status to <b>ASSIGNED</b>)<br>" + incr knum + if {![info exists statusarray(CLOSED)] && \ + ![info exists statusarray(VERIFIED)] && \ + ![info exists statusarray(RESOLVED)]} { + puts " +<INPUT TYPE=radio NAME=knob VALUE=clearresolution> + Clear the resolution<br>" + incr knum + puts " +<INPUT TYPE=radio NAME=knob VALUE=resolve> + Resolve bugs, changing <A HREF=\"bug_status.html\">resolution</A> to + <SELECT NAME=resolution + ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\"> + $resolution_popup</SELECT><br>" + incr knum + } + if {![info exists statusarray(NEW)] && \ + ![info exists statusarray(ASSIGNED)] && \ + ![info exists statusarray(REOPENED)]} { + puts " +<INPUT TYPE=radio NAME=knob VALUE=reopen> Reopen bugs<br>" + incr knum + } + if {[llength [array names statusarray]] == 1} { + if {[info exists statusarray(RESOLVED)]} { + puts " +<INPUT TYPE=radio NAME=knob VALUE=verify> + Mark bugs as <b>VERIFIED</b><br>" + incr knum + } + if {[info exists statusarray(VERIFIED)]} { + puts " +<INPUT TYPE=radio NAME=knob VALUE=close> + Mark bugs as <b>CLOSED</b><br>" + incr knum + } + } + puts " +<INPUT TYPE=radio NAME=knob VALUE=reassign> + <A HREF=\"bug_status.html#assigned_to\">Reassign</A> bugs to + <INPUT NAME=assigned_to SIZE=32 + ONCHANGE=\"document.changeform.knob\[$knum\].checked=true\" + VALUE=\"$COOKIE(Bugzilla_login)\"><br>" + incr knum + puts "<INPUT TYPE=radio NAME=knob VALUE=reassignbycomponent> + Reassign bugs to owner of selected component<br>" + incr knum + + puts " +<p> +<font size=-1> +To make changes to a bunch of bugs at once: +<ol> +<li> Put check boxes next to the bugs you want to change. +<li> Adjust above form elements. (It's <b>always</b> a good idea to add some + comment explaining what you're doing.) +<li> Click the below \"Commit\" button. +</ol></font> +<INPUT TYPE=SUBMIT VALUE=Commit> +</FORM><hr>" +} + + +if {$count > 0} { + puts "<FORM METHOD=POST ACTION=\"long_list.cgi\"> +<INPUT TYPE=HIDDEN NAME=buglist VALUE=$buglist> +<INPUT TYPE=SUBMIT VALUE=\"Long Format\"> +<A HREF=\"query.cgi\">Query Page</A> +<A HREF=\"colchange.cgi?$buffer\">Change columns</A> +</FORM>" + if {!$dotweak && $count > 1} { + puts "<A HREF=\"buglist.cgi?[set fields]&tweak=1\">Make changes to several of these bugs at once.</A>" + } +} +puts "--ThisRandomString--" +flush stdout + +# +# Below is second part of hideous "if catch" stuff from above. +# +# +# +# }]} { +# exec /usr/lib/sendmail -t << "To: terry +# +# +# $query +# +# $errorInfo +# " +# } |