/* * aegis - project change supervisor * Copyright (C) 1997, 1998, 2000-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 script_name; script_name = getenv("SCRIPT_NAME"); if (script_name == "") script_name = "http://localhost/cgi-bin/aegis.cgi"; auto pn; pn = project_name(); auto cn; cn = change_number(); auto href; href = script_name ## "?file@proj_menu+project@" ## quote_url(pn); 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, n; depth=0; stack[depth] = project[pn].state.name; while ("" != ( n = project[stack[depth]].state.parent_name )) { stack[++depth] = n; } while ( depth >= 0) { print(""); } print(""); print("Project " ## quote_html(pn) ## ", Change " ## cn ## ", History Report"); print("

"); print("Project"); 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 = "" ## quote_html(prj_name_parts[0]) ## ""; auto j; for (j = 1; j < count(prj_name_parts); j++) { href ##= '.' ## prj_name_parts[j]; long_project_name ##= "." ## quote_html(prj_name_parts[j]) ## ""; }; long_project_name = "“" ## long_project_name ## "”,"; /* HTTP limits lines to 510 characters */ for (j in wrap(long_project_name, 510)) print(j); href = script_name ## "?file@chan_menu+project@" ## quote_url(pn) ## "+change@" ## cn; print("Change " ## cn ## ","); print("
History"); print("

"); print("
"); auto ps, cs; ps = project[project_name()].state; cs = ps.branch.change[cn]; /* * scan all completed changes * for any of the named files */ print(""); print("" ## ""); auto rownum; rownum = 0; for (j in keys(cs.history)) { auto ch; ch = cs.history[j]; if (rownum++ % 6 < 3) print(""); else print(""); print(""); } print(""); print("
WhatWhenWhoComment
"); print(ch.what); print(""); print(ch.when); print(""); auto email, long_name; email = ch.who; try { email = user[ch.who].email_address; } catch (email) { email = ""; } if (email == "") email = ch.who; href = "mailto:" ## email; print(""); long_name = ch.who; try { long_name = passwd[ch.who].pw_comment; } catch (long_name) { long_name = ch.who; } print(quote_html(long_name) ## ""); print(""); auto part; for (part in wrap_html(quote_html(ch.why), 80)) print(part); auto t; if (j == count(cs.history) - 1) t = now(); else t = cs.history[j + 1].when; t = working_days(ch.when, t); if (t >= 0.1) { if (ch.why != "") print("
"); print("Elapsed: " ## sprintf("%5.3f", t) ## " working days."); } print("
"); print("Listed " ## count(cs.history) ## " state transitions."); print("
"); print("
"); print("
"); print("
"); print("A similar report may be obtained from the command line, with one of"); print("
ael change_history -p " ## quote_html(project_name()) ##
    " -c " ## cn);
print("aer change_history -p " ## quote_html(project_name()) ##
    " -c " ## cn ## "
"); print("
"); print("
"); print("

["); print("Project List |"); href = script_name ## "?file@proj_menu+project@" ## quote_url(pn); print("Project Menu |"); href = script_name ## "?file@changes+project@" ## quote_url(pn); print("Change List |"); href = script_name ## "?file@chan_menu+project@" ## quote_url(pn) ## "+change@" ## cn ; print("Change Menu"); print("]

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