/*
 *	aegis - project change supervisor
 *	Copyright (C) 1997, 2001, 2006-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/>.
 */

title
(
	sprintf("Project \"%s\", Change %d", project_name(), change_number()),
	"File Conflict Report"
);

columns
(
	{ name = "File Name\n-----------"; right = 0; },
	{ name = ""; left = 2; width = 6; },
	{ name = ""; width = 6; },
	{ name = "Edit\n------"; width = 6; },
	{ name = "Who\n--------"; width = 8; },
	{ name = "Change\n------"; width = 6; },
	{ name = "State\n-------"; width = 10; },
	{ name = "Description\n-------------"; right = 0; }
);
auto ps;
ps = project[project_name()].state;

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

/*
 * create an empty history for each file
 */
auto hist;
for (file in arg)
	hist[file] = [];

/*
 * scan all active changes
 * for any of the named files
 */
auto cn, cs, cf;
for (cn in keys(ps.branch.change))
{
	cs = ps.branch.change[cn];
	if (cs.state < being_developed || cs.state >= completed)
		continue;
	for (cf in cs.src)
	{
		if (!(cf.file_name in arg))
			continue;
		if (cf.usage == build && cf.action == modify)
			continue;
		auto ch, developer, integrator;
		developer = "";
		integrator = "";
		for (ch in cs.history)
		{
			if (ch.what == develop_begin)
				developer = ch.who;
			else if (ch.what == integrate_begin)
				integrator = ch.who;
			else if (ch.what == integrate_begin_undo)
				integrator = "";
			else if (ch.what == integrate_fail)
				integrator = "";
		}
		hist[cf.file_name] ##=
			{
				usage = cf.usage;
				action = cf.action;
				edit = cf.edit.revision;
				change = cs.change_number;
				state = cs.state;
				who = (cs.state == being_developed ? developer
					: cs.state == being_integrated
					? integrator : "");
				description = cs.brief_description;
			};
	}
}

/*
 * print the accumulated file information
 * if two or more changes have the file in common
 */
auto fh, actions, usages;
auto num_conflicts;
num_conflicts = 0;
for (file in sort(keys(hist)))
{
	if (count(hist[file]) < 2)
		continue;
	need(4);
	print(file);
	actions = "BS";
	usages = "BS";
	for (fh in hist[file])
	{
		print
		(
			"",
			(fh.usage == usages ? "" : fh.usage),
			(fh.action == actions ? "" : fh.action),
			sprintf("%4s", fh.edit),
			fh.who,
			sprintf("%4d", fh.change),
			fh.state,
			fh.description
		);
		actions = fh.action;
		usages = fh.usage;
	}
	++num_conflicts;
}
if (num_conflicts == 0)
	print("There are no files that conflict with this change.");
