/*
* aegis - project change supervisor
* Copyright (C) 1998, 2002, 2003, 2005-2008 Peter Miller
*
* 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 3 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, see
* .
*/
auto pn, p;
pn = project_name();
p = project[pn];
auto ps, cs;
ps = p.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 t, month, year;
if (count(arg) > 0)
t = mktime(arg[0]);
else
t = now();
month = 0 + strftime("%m", t);
year = 0 + strftime("%Y", t);
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("
");
print("");
print("");
print("");
print("");
/*
* Netscape 4.x has numerous CSS bugs, two of which need mentioning.
* 1. If a style sheet is not present Netscape says 404 Not found, when
* it should silently ignore it. 2. Style sheets who's media is not
* "screen" will be ignored. Fortunately we can use (2) to get around (1).
*/
print("");
auto stack, depth, bn;
depth=0;
stack[depth] = project[pn].state.name;
while ("" != ( bn = project[stack[depth]].state.parent_name )) {
stack[++depth] = bn;
}
while ( depth >= 0) {
print("");
}
print("");
print("Project " ## quote_html(pn) ## ", Change Cause Histogram");
print("
");
auto earliest_mday, latest_mday;
auto bucket, mday, last_mday;
bucket = {};
for (ph in ps.branch.history)
{
cs = ps.branch.change[ph.change_number];
when = cs.history[count(cs.history) - 1].when;
if (year != 0 + strftime("%Y", when))
continue;
if (month != 0 + strftime("%m", when))
continue;
mday = 0 + strftime("%d", when);
if (typeof(bucket[mday]) == "nul")
bucket[mday] = {};
bucket[mday][cs.cause]++;
bucket[mday].Total++;
}
max = 1;
for (mday in keys(bucket))
{
n = 0 + bucket[mday].Total;
if (n > max)
max = n;
}
max = 400. / max;
last_mday = 28;
for (n = 28; n < 32; ++n)
{
when = mktime(strftime("1-%b-%Y 00:00:00", t));
when += (n - 1) * (24 * 60 * 60);
if (strftime("%m", when) + 0 != month)
break;
last_mday = n;
}
auto clr;
print("
");
print("
Day
Count
");
for (mday = 1; mday <= last_mday; ++mday)
{
if (typeof(bucket[mday]) == "nul")
bucket[mday] = {};
n = 0 + bucket[mday].Total;
print("
");
print(mday);
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[mday][cause];
if (n > 0)
{
clr = cmap[cause];
n = round(n * max);
if (n < 3)
n = 3;
href = script_name ## "?file@rect+" ## n ## "+12";
href ##= "+color+" ## clr;
print("");
}
}
print("
");
}
print("
");
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("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("This cause is used for new functionality requested by the customer,");
print("or by a source outside the development organization.");
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("