/*
 *	aegis - project change supervisor
 *	Copyright (C) 1991-1994, 2002, 2005, 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/>.
 *
 * normally resides at "projdir"/info/state
 *
 * read and written by aegis, so it needs locking
 *
 * If you change this file, don't forget to change
 *	man5/aepstate.5
 */

#include <libaegis/common.def>

/*
 * Each test is numbered uniquely.  The name is of the form
 * t[0-9][0-9][0-9][0-9][am].sh ('a' for automatic and 'm' for manual.)
 * It would be possible to number each test within each change, (of the
 * form C???T??[AM].sh) but this would not cover -New_ReLeaSe, where the
 * test numbering can not start at 1 again, otherwise tests could not be
 * retained across releases.  Hence, the next test number is not unique
 * to any branch, but unique to the whole project.
 */
next_test_number = integer;

/*
 * ================== Obsolete Fields ==================
 *
 * The following fields are only present for old projects.  When aegis
 * sees them, they will be moved into the "trunk" transaction.  A very
 * few will persist until the next aenrls.
 */

/*
 * File permission mode mask.  See umask(2) for more information.
 * This value will always be OR'ed with 022, because aegis is paranoid.
 */
umask = integer;

/*
 * This field contains a description of the project.  Large amounts of
 * prose are not required; a single line is sufficient.
 */
description = string;

/*
 * This field contains the name of the user to whom baseline files
 * belong.
 */
owner_name = string;

/*
 * This field contains the name of the group to which baseline files
 * belong.
 */
group_name = string;

/*
 * If this field is true, then a developer may review her own change.
 * This is probably only a good idea for projects of less than 3 people.
 * The idea is for as many people as possible to critically examine a
 * change.
 */
developer_may_review = boolean;

/*
 * If this field is true, then a developer may integrate her own change.
 * This is probably only a good idea for projects of less than 3 people.
 * The idea is for as many people as possible to critically examine a
 * change.
 */
developer_may_integrate = boolean;

/*
 * If this field is true, then a reviewer may integrate a change she
 * reviewed.  This is probably only a good idea for projects of less
 * than 3 people.  The idea is for as many people as possible to
 * critically examine a change.
 */
reviewer_may_integrate = boolean;

/*
 * This field is true if developers may created changes, in addition to
 * administrators.  This tends to be a very useful thing, since
 * developers find most of the bugs.
 */
developers_may_create_changes = boolean;

/*
 * This command is used to notify a developer that a change requires
 * developing; it is issued when a project administrator uses an 'aedb
 * -User' command to force development of a change by a specific user.
 * All of the substitutions described in aesub(5) are available.  This
 * field is optional.
 *
 * Executed as: the new developer.
 * Current directory: the development directory of the change
 *	for the new developer.
 * Exit status: ignored.
 */
forced_develop_begin_notify_command = string;

/*
 * Notify that a change requires reviewing.  All of the substitutions
 * described in aesub(5) are available.  This field is optional.
 *
 * This command could also be used to notify other management systems,
 * such as progress and defect tracking.
 *
 * Executed as: the developer.
 * Current directory: the development directory of the change
 * Exit status: ignored.
 */
develop_end_notify_command = string;

/*
 * Notify that a change has been withdrawn from review for further
 * development.  All of the substitutions described in aesub(5) are
 * available.  This field is optional.
 *
 * This command could also be used to notify other management systems,
 * such as progress and defect tracking.
 *
 * Executed as: the developer.
 * Current directory: the development directory of the change
 * Exit status: ignored.
 */
develop_end_undo_notify_command = string;

/*
 * Notify that the review has passed.  All of the substitutions
 * described in aesub(5) are available.  This field is optional.
 *
 * This command could also be used to notify other management systems,
 * such as progress and defect tracking.
 *
 * Executed as: the reviewer.
 * Current directory: the development directory of the change
 * Exit status: ignored.
 */
review_pass_notify_command = string;

/*
 * Notify that a review pass has has been rescinded.  All of the
 * substitutions described in aesub(5) are available.  This field is
 * optional.
 *
 * This command could also be used to notify other management systems,
 * such as progress and defect tracking.
 *
 * Executed as: the reviewer.
 * Current directory: the development directory of the change
 * Exit status: ignored.
 */
review_pass_undo_notify_command = string;

/*
 * Notify that the review has failed.  All of the substitutions
 * described in aesub(5) are available.  This field is optional.
 *
 * This command could also be used to notify other management systems,
 * such as progress and defect tracking.
 *
 * Executed as: the reviewer.
 * Current directory: the development directory of the change
 * Exit status: ignored.
 */
review_fail_notify_command = string;

/*
 * Notify that the integration has passed.  All of the substitutions
 * described in aesub(5) are available.  This field is optional.
 *
 * This command could also be used to notify other management systems,
 * such as progress and defect tracking.
 *
 * Executed as: the project owner.
 * Current directory: the new project baseline
 * Exit status: ignored.
 */
integrate_pass_notify_command = string;

/*
 * Notify that the integration has failed.  All of the substitutions
 * described in aesub(5) are available.  This field is optional.
 *
 * This command could also be used to notify other management systems,
 * such as progress and defect tracking.
 *
 * Executed as: the integrator.
 * Current directory: the development directory of the change
 * Exit status: ignored.
 */
integrate_fail_notify_command = string;

/*
 * The pathname of where to place new development directories.  The
 * pathname must be absolute.  Only consulted if the uconf field of the
 * same name is not set.  Defaults to $HOME.
 */
default_development_directory = string;

/*
 * This field contains what to do when a change is created with
 * no test exemption specified.
 */
default_test_exemption = boolean;

/*
 * This field contains a list of copyright years, for use in copyright
 * notices, etc.  It is updated each integrate_begin, if necessary, to
 * include the current year.  Available as the ${Copyright_Years}
 * substitution, and included in the version listing.
 */
copyright_years = [ integer ];

/*
 * Changes are numbered sequentially from one.
 * This field records the next unused change number.
 */
next_change_number = integer;

/*
 * Deltas are numbered sequentially from one.
 * This field records the next unused delta number.
 */
next_delta_number = integer;

/*
 * This field is a list of the files in the project.
 */
src =
[
    {
	/*
	 * The name of the file, relative to the baseline.
	 */
	file_name = string;

	/*
	 * What the file is for.
	 */
	usage = file_usage;

	/*
	 * The edit number of the file.
	 */
	edit_number = string;

	/*
	 * The change which locked this file.
	 *
	 * Caveat: this field is redundant, you can figure it out by scanning
	 * all of he change files.  Having it here is very convenient,
	 * even though it means multiple updates.
	 */
	locked_by = integer;

	/*
	 * The change which is about to create this file
	 * for the first time.
	 * Same caveat as above.
	 */
	about_to_be_created_by = integer;

	/*
	 * The change which last deleted this file.
	 * We never throw them away, becase
	 * (a) it may be created again, and more imortant
	 * (b) we need it to recreate earlier deltas.
	 */
	deleted_by = integer;
    }
];

/*
 * This field contains a history of integrations for the project.
 * Update by each successful 'aegis -Integrate_Pass' command.
 */
history =
[
	{
		/*
		 * The delta number of the integration.
		 */
		delta_number = integer;

		/*
		 * The number of the change which was integrated.
		 */
		change_number = integer;

		/*
		 * the names by which this delta is known
		 */
		name = [ string ];
	}
];

/*
 * The list of changes which have been created to date.
 */
change = [integer];

/*
 * The list of administrators of the project.
 */
administrator = [string];

/*
 * The list of developers of the project.
 */
developer = [string];

/*
 * The list of reviewers of the project.
 */
reviewer = [string];

/*
 * The list of integrators of the project.
 */
integrator = [string];

/*
 * The change currently being integrated.
 * Only one change (within a project) may be integrated at a time.
 * Only set when an integration is in progress.
 */
currently_integrating_change = integer;

/*
 * The version numbers for (this release of) the project.
 *	(The major verion defaults to one if not given,
 *	the minor version defaults to zero if not given.)
 */
version_major = integer;
version_minor = integer;

/*
 * The version number this project was derived from.
 * This is of most use when producing "patch" files.
 */
version_previous = string;
