/*
 *	aegis - project change supervisor
 *	Copyright (C) 1997, 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
 *	<http://www.gnu.org/licenses/>.
 */

auto script_name;
script_name = getenv("SCRIPT_NAME");
if (script_name == "")
	script_name = "http://localhost/cgi-bin/aegis.cgi";
auto pn;
pn = project_name();

columns({width = 1000; });
print("Content-Type: text/html");
print("");
print("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"");
print("                      \"http://www.w3.org/TR/REC-html40/loose.dtd\">");

print("<html><head>");
print("<meta name=\"ROBOTS\" content=\"NOINDEX, NOFOLLOW\">");
print("<meta name=\"GENERATOR\" content=\"" ## script_name ## "\">");
print("<meta http-equiv=\"Content-Type\" "
	## "content=\"text/html; charset=ISO-8859-1\">");
print("<style type=\"text/css\"> "
	## "tr.even-group { background-color: #CCCCCC; } "
	## "body { background-color: white; } "
	## "</style>");
/*
 * 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("<link rel=\"stylesheet\" type=\"text/css\" href=\"/aedefault.css\" "
	## "media=\"all\">");
auto stack, depth, n;
depth=0;
stack[depth] = project[pn].state.name;
while ("" != ( n = project[stack[depth]].state.parent_name )) {
  stack[++depth] = n;
}
while ( depth >= 0) {
    print("<link rel=\"stylesheet\" type=\"text/css\" href=\"/" ##
      stack[depth--] ## ".css\" " ## "media=\"all\">");
}
print("<title>");

print("Project " ## quote_html(pn) ## ",");
print("File History Report");
print("</title></head><body><h1 align=center>");

auto href;
print("<a href=\"" ## script_name ## "\">Project</a>");
auto long_project_name;
auto prj_name_parts;
prj_name_parts = split(pn, '.');
href = script_name ## "?file@proj_menu+project@"
	## quote_url(prj_name_parts[0]);
long_project_name = "<a href=\"" ## href ## "\" >"
	## quote_html(prj_name_parts[0]) ## "</a>";
auto j;
for (j = 1; j < count(prj_name_parts); j++)
{
    href ##= '.' ## prj_name_parts[j];
    long_project_name ##= ".<a href=\"" ## href ## "\" >"
    	## quote_html(prj_name_parts[j]) ## "</a>";
};
long_project_name = "&ldquo;" ## long_project_name ## "&rdquo;,<br>";
/* HTTP limits lines to 510 characters */
for (j in wrap(long_project_name, 510))
    print(j);

if (change_number_set())
{
    href = script_name ## "?file@chan_menu+project@" ## quote_url(pn)
	## "+change@" ## change_number();
    print("Change <a href=\"" ## href ## "\">" ## change_number() ##
	"</a>,<br>");
}
if (count(arg) == 1)
    print("File &ldquo;" ## quote_html(arg[0]) ## "&rdquo;,<br>");
print("File History");
print("</h1>");
print("<div class=\"information\">");

print("<table align=center>");

auto ps;
ps = project[project_name()].state;

/*
 * use the files named on the command line,
 * or all project files if not specified
 */
auto file, cs;
if (count(arg) == 0)
{
    if (change_number_set())
    {
	cs = ps.branch.change[change_number()];
	for (file in cs.src)
	    arg ##= file.file_name;
    }
    else
    {
	for (file in ps.src)
	    arg ##= file.file_name;
    }
}

/*
 * create an empty history for each file
 */
auto hist;
for (file in arg)
    hist[file] = [];
auto metname, m;
metname = { };

/*
 * scan all completed changes
 * for any of the named files
 */
auto ph, cf;
for (ph in ps.branch.history)
{
    cs = ps.branch.change[ph.change_number];
    for (cf in cs.src)
    {
	if (cf.file_name in arg)
	{
	    if (cf.usage == build && cf.action == modify)
		continue;
	    hist[cf.file_name] ##=
		{
		    usage = cf.usage;
		    action = cf.action;
		    edit = cf.edit.revision;
		    delta = ph.delta_number;
		    when = cs.history[count(cs.history) - 1].when;
		    change = ph.change_number;
		    description = cs.brief_description;
		    move = cf.move;
		    metrics = cf.metrics;
		};
	    if (count(cf.metrics))
	    {
		for (m in cf.metrics)
		    metname[m.name] = true;
	    }
	}
    }
}

/*
 * print the accumulated history
 */
auto fh, actions, usages, rownum;
for (file in sort(keys(hist)))
{
    href = script_name ## "?file@file_menu+" ## quote_url(file);
    href ##= "+project@" ## quote_url(project_name());

    print("<tr><td colspan=8><br><p>");
    print("<a href=\"" ## href ## "\">");
    print("<span class=\"filename\">" ## quote_html(file) ## "</span></a>");
    print("</td></tr>");

    print("<tr class=\"even-group\">");
    print("<th></th><th>Type</th><th>Action</th><th>Delta</th>");
    print("<th>When</th>");
    print("<th>Change</th><th>Edit</th><th>Description</th>");
    for (m in sort(keys(metname)))
    {
        print("<th>");
	auto msplit, ms2;
	msplit = split(m, "_");
	for (ms2 in msplit)
	    print(capitalize(ms2) ## "<br>");
	print("</th>");
    }
    print("</tr>");
    rownum = 0;

    actions = "BS";
    usages = "BS";
    for (fh in hist[file])
    {
	if (rownum % 6 < 3)
	    print("<tr class=\"odd-group\">");
	else
	    print("<tr class=\"even-group\">");
	++rownum;
	print("<td>&nbsp;&nbsp;</td><td valign=top>");
	if (fh.usage != usages)
	    print(fh.usage);
	print("</td><td valign=top>");
	if (fh.action != actions)
	    print(fh.action);
	print("</td><td valign=top align=right>");
	print(fh.delta);
	print("</td><td valign=top>");
	print(fh.when);
	print("</td><td valign=top align=right>");
	href = script_name ## "?file@chan_menu";
	href ##= "+project@" ## quote_url(project_name());
	href ##= "+change@" ## fh.change;
	print("<a href=\"" ## href ## "\">");
	print(fh.change ## "</a>");
	print("</td><td valign=top align=right>");
	href = script_name ## "?file@file_menu";
	href ##= "+project@" ## quote_url(project_name());
	href ##= "+change@" ## fh.change ## "+" ## quote_html(file);
	print("<a href=\"" ## href ## "\">");
	print(fh.edit ## "</a>");
	print("</td><td valign=top>");
	auto part;
	for (part in wrap_html(quote_html(fh.description), 80))
	    print(part);
	if (fh.move != "")
	{
	    href = script_name ## "?file@file_menu+" ## quote_url(fh.move);
	    href ##= "+project@" ## quote_url(project_name());

	    print("<br>Moved");
	    if (fh.action == create)
		print("from");
	    else
		print("to");
	    print("<a href=\"" ## href ## "\">");
	    print("<span class=\"filename\">" ## quote_html(fh.move)
		## "</span></a>");
	}
	print("</td>");

	auto met;
	for (m in sort(keys(metname)))
	{
	    for (met = 0; met < count(fh.metrics); met++)
	    {
		if (fh.metrics[met].name == m)
		{
		    print("<td valign=top align=right>");
		    print(sprintf("%4.2f", fh.metrics[met].value));
		    print("</td>");
		}
	    }
	}
	print("</tr>");
	actions = fh.action;
	usages = fh.usage;
    }
}
print("<tr><td colspan=8><br><p>");
print("Listed " ## count(keys(hist)) ## " files.");
print("</td></tr>");
print("</table>");
print("</div>");

print("<hr>");
print("<div class=\"report-cmd\">");
print("A similar report may be obtained from the command line, with");
print("<blockquote><samp>aer file_history [ <i>filename</i> ] -p " ##
    quote_html(project_name()) ## "</samp></blockquote>");
print("</div>");

print("<hr>");
print("<p align=center class=\"navbar\">[");
print("<a href=\"" ## script_name ## "\">Project List</a> |");
href = script_name ## "?file@proj_menu+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Project Menu</a> |");
href = script_name ## "?file@changes+project@" ## quote_url(pn);
print("<a href=\"" ## href ## "\">Change List</a>");
if (change_number_set())
{
    href = script_name ## "?file@chan_menu+project@" ## quote_url(pn) ##
	"+change@" ## change_number();
    print("| <a href=\"" ## href ## "\">Change Menu</a>");
}
print("]</p>");

print("<hr>");
print("This page was generated " ## now() ## ".");
print("</body></html>");
