/*
* aegis - project change supervisor
* Copyright (C) 1991-1997, 1999, 2001-2006, 2008, 2012 Peter Miller
* Copyright (C) 2008 Walter Franzini
*
* 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
* .
*
* @note
* if you cange this file, don't forget to change
* man5/aecstate.5
*
* @note
* If you change this file, remmeber to make top-level enums
* hide_if_default whenever possible, or you will break older versions of
* aedist for receive.
*/
#include
state =
(
/*
* The change has been created,
* but has yet to be worked on.
*/
awaiting_development,
/*
* The change is being developed.
*/
being_developed,
/*
* The change has been developed,
* and is waiting to be reviewed.
* (Optional, controlled by pattr::develop_end_action field)
*/
awaiting_review,
/*
* The change has been developed,
* and is being reviewed.
* (Optional, controlled by pattr::develop_end_action field)
*/
being_reviewed,
/*
* The change has passed review,
* and is queued ready for integration.
*/
awaiting_integration,
/*
* The change is being integrated.
*/
being_integrated,
/*
* The change has been completed and is now
* part of the baseline.
* Changes in this state can not be reversed.
*/
completed
);
/*
* This field is the value of test_exemption (see libaegis/cattr.def)
* when the change was created.
*/
given_test_exemption = boolean hide_if_default;
/*
* This field is the value of regression_test_exemption (see
* libaegis/cattr.def) when the change was created.
*/
given_regression_test_exemption = boolean hide_if_default;
/*
* This field records the delta number for this change.
* It is only present if the change is in one of
* the 'being_integrated' or 'completed' states.
*/
delta_number = integer;
/*
* This field records a universally unique identifier for this
* configuration. It is supplements the delta_number field in that
* it is unique across all replicas of the project, whereas the delta
* number is ambiguous across replicas. It is only present in the
* 'being_integrated' and 'completed' states.
*/
delta_uuid = string;
/*
* This field records whether the change was placed into the
* 'being_integrated' state using the -minimum option (or that option was
* implicitly set due to a file being removed). It is
* only present if the change is in the 'being_integrated' state.
*/
minimum_integration = boolean hide_if_default;
/*
* This field records the last change integrated into the project.
* If it disagrees with the project, a 'project_file_command' (from pconf)
* needs to be executed at the next build.
*/
project_file_command_sync = integer;
/*
* This field records the time the last successful
* 'aegis -Build' command was run for all architectures.
* It is only present in the 'being_developed' and 'being_integrated' states.
*/
build_time = time;
/*
* This field records the time the last successful
* 'aegis -Test' command was run for all architectures.
* It is only present in the 'being_developed' and 'being_integrated' states.
*/
test_time = time;
/*
* This field records the time the last successful
* 'aegis -Test -BaseLine' command was run for all architectures.
* It is only present in the 'being_developed' and 'being_integrated' states.
*/
test_baseline_time = time;
/*
* This field records the time the last successful
* 'aegis -Test -Regression' command was run for all architectures.
* It is only present in the 'being_developed' and 'being_integrated' states.
*/
regression_test_time = time;
/*
* This field records the time of various operations for each variant named
* in the "architecture" field.
* It is only present in the 'being_developed' and 'being_integrated' states.
*/
architecture_times =
[
{
/*
* This field is one of the patterns named in
* the outer "architecture" field.
*/
variant = string;
/*
* This field is the computer on which the command was run
* which last changed this structure.
*/
node = string;
/*
* This field records the last time the last
* successful 'aegis -Build' command
* was run for this specific architecture variant.
*/
build_time = time;
/*
* This field records the last time the last
* successful 'aegis -Test' command
* was run for this specific architecture variant.
*/
test_time = time;
/*
* This field records the last time the last
* successful 'aegis -Test -BaseLine' command
* was run for this specific architecture variant.
*/
test_baseline_time = time;
/*
* This field records the last time the last
* successful 'aegis -Test -REGression' command
* was run for this specific architecture variant.
*/
regression_test_time = time;
}
];
/*
* This field is the absolute path of the change's development directory.
* It is only present of the change is in a state
* between 'being_developed' and 'being_integrated' inclusive.
*
* However, branches are treated slightly differently to changes.
* The directory is relative to the root of the project tree, in order to
* facilitate moving the project without rewriting any of the database.
*/
development_directory = string;
/*
* This field is the absolute path of the change's integration directory.
* It is only present of the change is in the 'being_integrated' state.
*/
integration_directory = string;
/*
* This field records the history of the change,
* in the form of state transitions.
*/
history =
[
{
/*
* This field records the time the state transition occured.
*/
when = time;
/*
* This field records what happened.
* Valid value names echo the various aegis functions.
*/
what =
(
new_change,
/*
* The change is advanced from awaiting_development to
* being_developed.
*/
develop_begin,
/*
* The change is un-advanced from being_developed to
* awaiting_development.
*/
develop_begin_undo,
/*
* The change is advanced from being_developed
* to being_reviewed. The project is in
* goto_being_reviewed (the default). The absence of
* the "_2br" suffix is an historical accident.
*/
develop_end,
/*
* The change is advanced from being_developed
* to awaiting_review. The project is in
* goto_awaiting_review.
*/
develop_end_2ar,
/*
* The change is advanced from being_developed
* to awaiting_integration. The project is in
* goto_awaiting_integration.
*/
develop_end_2ai,
/*
* The change is un-advanced from one of
* { awating_review, being_reviewed or
* awaiting_integration } to being_developed.
*/
develop_end_undo,
/*
* The change is advanced from awaiting_review
* to being_reviewed. The project was in
* goto_awaiting_review.
*/
review_begin,
/*
* The change is un-advanced from being_reviewed
* to awaiting_review. The project was in
* goto_awaiting_review.
*/
review_begin_undo,
/*
* The change advanced from being_reviewed
* to being_integrated. The project is in
* goto_being_reviewed or goto_awaiting_review.
*/
review_pass,
/*
* The change DID NOT advance from being_reviewed to being_
* integrated. The project is in goto_awaiting_review.
*
* This will only happen if the review_policy command
* returns a non-zero exit status.
*/
review_pass_2ar,
/*
* The change DID NOT advance from being_reviewed to being_
* integrated. The project is in goto_being_reviewed.
*
* This will only happen if the review_policy command
* returns a non-zero exit status.
*/
review_pass_2br,
/*
* The change un-advanced from awaiting_integration
* to being_reviewed. The project is in
* goto_being_reviewed. (The absence of the "_2br"
* suffix is an historical accident.)
*/
review_pass_undo,
/*
* The change un-advanced from awaiting_integration
* to awaiting_review. The project is in
* goto_awaiting_review.
*/
review_pass_undo_2ar,
/*
* The change is un-advanced from being_reviewed to
* being_developed.
*/
review_fail,
/*
* The change is advanced from awaiting_integration to
* being_integrated.
*/
integrate_begin,
/*
* The change is un-advanced from being_integrated to
* awaiting_intergation.
*/
integrate_begin_undo,
/*
* The change is advanced from being_integrated to
* completed.
*/
integrate_pass,
/*
* The change is un-advanced from being_integrated to
* being_developed.
*/
integrate_fail
);
/*
* This field records the user name of the user who
* caused the state transition.
*/
who = string; /* the user name */
/*
* This field is optional.
* It is a comment of some sort.
* In the cause of review_file and integrate_fail,
* this field will contain why the change failed.
*/
why = string;
}
];
/*
* This field provides a globally unique identifier for the change set,
* even when geographically distributed development is happening.
*/
uuid = string;
/*
* This field is only present in branch changes (long transactions).
*/
branch =
{
/*
* 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;
/*
* 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 begun
* 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_begin_notify_command = string;
/*
* notify that the review has no longer begun
* 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_begin_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 baseline of the project.
* 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;
/*
* This field contains what to do when a change is created with
* no test exemption specified.
*/
default_test_exemption = boolean;
/*
* This field contains what to do when a change is created with
* no regression test exemption specified.
*/
default_test_regression_exemption = boolean
show_if_default;
/*
* This field may be set to true if you want to skip various
* unlucky numbers for changes, branches and tests. Various
* traditions are avoided, both Eastern and Western. Defaults to
* false if not set.
*/
skip_unlucky = boolean;
/*
* This field may be set to true if you want to compress the
* database on writing. (It is always uncompress on reading
* if necessary.)
*/
compress_database = boolean;
/*
* This field controls the state entered on a successfil develop end
* state transition. The default is "being reviewed".
*
* goto_being_reviewed
* This means that the state machine goes from the being_developed
* state to the being_reviewed state. The aerb command only sends
* informative email.
*
* goto_awaiting_review
* This means that the state machine goes from the being_developed
* state to the awaiting_review state. The aerb command is now
* essential.
*
* goto_awaiting_integration
* This means that the state machine goes from the being_developed
* state into the awaiting_inmtegartion state. Code review is
* skipped entirely.
*
* Note that the "developer_may_review" setting may not contradict
* the "develop_end_action". If developers may not review their
* own work, then you may not goto directly to being integrated
* (as this means much te same thing).
*/
develop_end_action = (goto_being_reviewed, goto_awaiting_review,
goto_awaiting_integration);
/*
* This field contains a history of integrations for the branch.
* 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 uuid of the change which was integrated.
*/
uuid = string;
/*
* the time at which the change was integrated.
*/
when = time;
/*
* this field is used to remember if the completed change
* was a branch. By default unknown.
*/
is_a_branch = (unknown, yes, no)
hide_if_default;
}
];
/*
* The list of changes which have been created to date.
*/
change = [integer];
/*
* The list of branches which have been created to date. This
* will be a subset of the above (possibly empty, possibly
* complete, never larger).
*/
sub_branch = [integer];
/*
* The list of administrators of the branch.
*/
administrator = [string];
/*
* The list of developers of the branch.
*/
developer = [string];
/*
* The list of reviewers of the branch.
*/
reviewer = [string];
/*
* The list of integrators of the branch.
*/
integrator = [string];
/*
* The change currently being integrated. Only one change
* (within a branch) may be integrated at a time. Only set when
* an integration is in progress.
*/
currently_integrating_change = integer;
/*
* 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;
/*
* The minimum change number for aenc, if no change number is
* specified. This allows the low-numbered change numbers to be
* used for branches later in the project. Defaults to 10 if
* not set, may not be less than 1.
*/
minimum_change_number = integer;
/*
* This controls whether the automatically selected aenc(1) change
* numbers "fill in" any gaps. Defaults to true if not set.
*/
reuse_change_numbers = boolean;
/*
* The minimum branchhange number for aebr, if no branch number is
* specified. Defaults to 1 if not set.
*/
minimum_branch_number = integer;
/*
* This field may be used to protect the development directory
* after the "being developed" state. It does this by making
* it read-only at develop end time. Should the change ever
* be returned to the "being developed" state, it will be made
* writble again.
*
* The default is false, meaning to leave the development
* directory writable while is being reviewed and integrated.
* Aegis' normal tampering detection will notice if files are
* changed, but there is no reminder to the developer that the
* change should be left alone.
*/
protect_development_directory = boolean;
};
/************************ OBSOLETE FIELDS ************************/
/*
* This field is a list of all the files in the change.
* This field is not obsolete, and will automatically be moved to fstate
* in any change aegis detects it in.
*
* Note: this field is used by aedist to record file state, rather than
* add another file to the transfer format, which has compatibility
* problems already.
*/
src =
[
{
/*
* This file names the file.
* The name is relative to the root of the
* baseline directory tree.
*/
file_name = string;
/*
* This field uniquely identifies the file for its entire
* lifetime. This field remains constant across file renames.
* The value of this field shall be formatted as a valid UUID,
* all in lower case.
*/
uuid = string;
/*
* This field describes what is being done with the file.
*/
action = file_action;
/*
* This field records the edit number of the file
* when it was added to the change (or updated using the
* 'aegis -DIFFerence' command).
* This field is not present for new files.
*/
edit_number = string;
/*
* This field describes what function the file serves.
*/
usage = file_usage;
/*
* These fields are set by a successful
* 'aegis -DIFFerence' command to the last-time-modified
* of the source file and the difference listing.
* It is only present between the 'being_developed' and
* 'being_integrated' states, inclusive.
* This allows checking that the files have not been modified
* at the develop_end, review_pass and integrate_begin
* state transitions.
*/
diff_time = time;
diff_file_time = time;
/*
* To change the name of a file,
* a combination of aerm and aenf are used.
* With deleted files, this field is used to say where it went.
* With new files, this field is used to say where it came from.
*/
move = string;
/*
* This field tracks whether this incarnation of the file
* was executable at `develop end' time. This mode
* is restored (taking the project umask into account)
* when the file is copied.
*
* This field is only meaningful for changes in the
* "completed" state, because this field is only set
* by aeip. Until then, the mode if the file itself is
* the authority.
*/
executable = boolean hide_if_default;
/*
* This field records the file attributes.
*/
attribute = attributes;
}
];
/* vim: set ts=8 sw=4 et : */