/* * 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 * . */ 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(""); 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) ## ","); print("File History Report"); print("

"); auto href; 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); if (change_number_set()) { href = script_name ## "?file@chan_menu+project@" ## quote_url(pn) ## "+change@" ## change_number(); print("Change " ## change_number() ## ",
"); } if (count(arg) == 1) print("File “" ## quote_html(arg[0]) ## "”,
"); print("File History"); print("

"); print("
"); print(""); 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(""); print(""); print(""); print(""); print(""); for (m in sort(keys(metname))) { print(""); } print(""); rownum = 0; actions = "BS"; usages = "BS"; for (fh in hist[file]) { if (rownum % 6 < 3) print(""); else print(""); ++rownum; print(""); auto met; for (m in sort(keys(metname))) { for (met = 0; met < count(fh.metrics); met++) { if (fh.metrics[met].name == m) { print(""); } } } print(""); actions = fh.action; usages = fh.usage; } } print(""); print("

"); print(""); print("" ## quote_html(file) ## ""); print("

TypeActionDeltaWhenChangeEditDescription"); auto msplit, ms2; msplit = split(m, "_"); for (ms2 in msplit) print(capitalize(ms2) ## "
"); print("
  "); if (fh.usage != usages) print(fh.usage); print(""); if (fh.action != actions) print(fh.action); print(""); print(fh.delta); print(""); print(fh.when); print(""); href = script_name ## "?file@chan_menu"; href ##= "+project@" ## quote_url(project_name()); href ##= "+change@" ## fh.change; print(""); print(fh.change ## ""); print(""); href = script_name ## "?file@file_menu"; href ##= "+project@" ## quote_url(project_name()); href ##= "+change@" ## fh.change ## "+" ## quote_html(file); print(""); print(fh.edit ## ""); print(""); 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("
Moved"); if (fh.action == create) print("from"); else print("to"); print(""); print("" ## quote_html(fh.move) ## ""); } print("
"); print(sprintf("%4.2f", fh.metrics[met].value)); print("

"); print("Listed " ## count(keys(hist)) ## " files."); print("

"); print("
"); print("
"); print("
"); print("A similar report may be obtained from the command line, with"); print("
aer file_history [ filename ] -p " ## quote_html(project_name()) ## "
"); 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"); if (change_number_set()) { href = script_name ## "?file@chan_menu+project@" ## quote_url(pn) ## "+change@" ## change_number(); print("| Change Menu"); } print("]

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