/* * aegis - project change supervisor * Copyright (C) 1998 Peter Miller; * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * * MANIFEST: report change causes over years */ auto ps, cs; ps = project[project_name()].state; auto ph, when, n, max, href; auto script_name; script_name = getenv("SCRIPT_NAME"); if (script_name == "") script_name = "http://localhost/cgi-bin/aegis.cgi"; auto cmap; cmap = { chain = "255+0+0"; internal_bug = "255+255+0"; internal_enhancement = "0+255+0"; internal_improvement = "0+255+255"; external_bug = "192+192+0"; external_enhancement = "0+192+0"; external_improvement = "0+192+192"; }; columns({width = 1000;}); print("Content-Type: text/html"); print(""); print(""); print("Project Change Cause Histogram"); print("

"); print("Project ``" ## quote_html(project_name()) ## "'',
"); print("Change Cause Histogram"); print("

"); auto earliest_year, latest_year; earliest_year = 0; latest_year = 0; auto bucket, year; bucket = {}; for (ph in ps.branch.history) { cs = ps.branch.change[ph.change_number]; when = cs.history[count(cs.history) - 1].when; year = 0 + strftime("%Y", when); if (typeof(bucket[year]) == "nul") bucket[year] = {}; bucket[year][cs.cause]++; bucket[year].Total++; if (earliest_year == 0 || earliest_year > year) earliest_year = year; if (latest_year < year) latest_year = year; } max = 1; for (year in keys(bucket)) { n = 0 + bucket[year].Total; if (n > max) max = n; } max = 400. / max; auto clr; print("
"); print(""); for (year = earliest_year; year <= latest_year; ++year) { n = 0 + bucket[year].Total; print(""); } print("
YearCount
"); if (n > 0) { href = script_name ## "?file@proj_cch2"; href ##= "+project@" ## quote_url(project_name()); href ##= "+" ## year; print(""); } print(year); if (n > 0) print(""); print(""); print(n); print(""); auto cause; for (cause in [chain, internal_bug, internal_enhancement, internal_improvement, external_bug, external_enhancement, external_improvement]) { n = 0 + bucket[year][cause]; if (n > 0) { clr = cmap[cause]; if (clr == "") clr = "255+0+255"; n = round(n * max); if (n < 3) n = 3; href = script_name ## "?file@rect+" ## n ## "+12"; href ##= "+color+" ## clr; print(""); } } print("
"); print("
"); print("

Legend

"); print("This table associates each color in the above graph with"); print("a change cause. A brief description of each cause is"); print("also given."); print("
"); print(""); clr = cmap[chain]; href = script_name ## "?file@rect+50+12+color+" ## clr; print(""); clr = cmap[internal_bug]; href = script_name ## "?file@rect+50+12+color+" ## clr; print(""); clr = cmap[internal_enhancement]; href = script_name ## "?file@rect+50+12+color+" ## clr; print(""); clr = cmap[internal_improvement]; href = script_name ## "?file@rect+50+12+color+" ## clr; print(""); clr = cmap[external_bug]; href = script_name ## "?file@rect+50+12+color+" ## clr; print(""); clr = cmap[external_enhancement]; href = script_name ## "?file@rect+50+12+color+" ## clr; print(""); clr = cmap[external_improvement]; href = script_name ## "?file@rect+50+12+color+" ## clr; print(""); print("
ColorCauseDescription
"); print(""); print(""); print("chain"); print(""); print("This cause is used for bugs introduced by previous changes."); print("This is a special case of the internal_bug cause."); print("
"); print(""); print(""); print("internal_bug"); print(""); print("This cause is used for bugs found by the development team, or by"); print("the development organization."); print("
"); print(""); print(""); print("internal_enhancement"); print(""); print("This cause is used for new functionality requested by the"); print("development team, or by the development organization."); print("
"); print(""); print(""); print("internal_improvement"); print(""); print("This cause is used for improvement to existing functionality"); print("(e.g. performance) requested by the development team, or by the"); print("development organization."); print("
"); print(""); print(""); print("external_bug"); print(""); print("This cause is used for bugs found by the customer, or by a source"); print("outside the development organization."); print("
"); print(""); print(""); print("external_enhancement"); print(""); print("This cause is used for new functionality requested by the customer,"); print("or by a source outside the development organization."); print("
"); print(""); print(""); print("external_improvement"); print(""); print("This cause is used for improvement to existing functionality"); print("(e.g. performance) requested by the customer, or a source outside"); print("the development development organization."); print("

"); print("This page was generated " ## now() ## "."); print("");