/* * aegis - project change supervisor * Copyright (C) 1991-1996, 1998-2008, 2012 Peter Miller * Copyright (C) 2006 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 * . * * * this file normally resides at "projdir"/baseline/config * * this file is only ever read by [me], so does not need locking. * Indeed, it is in the baseline, and subject to history. * * if you change this file, don't forget to change * man5/aepconf.5 */ #include /** * The work_area_style type encapsulates a set of parameters * controlling the appearance of the development directory and the * integration directory. */ type work_area_style = { /* * The source_file_link field is true if hard links are to be * used for project source files (which are not part of the change) so * that the work area has a complete set of source files. * * Defaults to false if not set. * * If the host system does not have hard links, this field will be ignored. * * Maintaining the hard links can be time consuming for large * projects, and add quite a noticeable delay before builds start * doing anything. If possible change your build system to use the * $search_path instead and avoid links. */ source_file_link = boolean; /* * The source_file_symlink field is true if symbolic links are to be * used for project source files (which are not part of the change) * so that the work area has a complete set of source files. * * Defaults to false if not set. * * If (source_file_link == true AND hard links are available) this * field will be ignored. If the host system does not have symbolic * links, this field will be ignored. * * Maintaining the symbolic links can be time consuming for large * projects, and add quite a noticeable delay before builds start * doing anything. If possible change your build system to use the * $search_path instead and avoid symbolic links. */ source_file_symlink = boolean; /* * The source_file_copy field is true if copies are to be used for * project source files (which are not part of the change) so that * the work area has a complete set of source files. File * modification time attributes will be preserved. * * Defaults to false if not set. * * If ((source_file_link == true AND hard links are available) * OR (source_file_symlink == true AND symbolic links are available)) * this field will be ignored. * * Maintaining the copies can be time consuming (and space * consuming) for large projects, and add quite a noticeable delay * before builds start doing anything. If possible change your * build system to use the $search_path instead and avoid copies. */ source_file_copy = boolean; /* * The source_file_whiteout field mat be used to sprecify the * presence (true) or absence (false) of white out files, used to * "cover up" files being removed by a change set. These files * contain 1KB of random data, intended to cause a syntax error * should be build reference them. * * It is rarely necessary to explicitly set this field. It * defaults to false if you set any of the "source_file_link", * "source_file_symlink" or "source_file_copy" to true; it defaults * to false if none of them are true. * * Not meaningful (always false) for integration builds. */ source_file_whiteout = boolean; /* * The derived_file_link field is true if hard links are to * be used for non-source files which are present in the project * baseline(s) but which are not present in the work area, so that * the work area has a complete set of derived files. This allows * work areas to take advantage of "precompiled" object files (etc) * in the baseline(s). * * Defaults to false if not set. * * If the host system does not have hard links, this field will be ignored. * * Maintaining the links can be time consuming for large projects, * and add quite a noticeable delay before builds start doing * anything. If possible, change your build system to use the * $search_path instead and avoid hard links. Alternatively, set * derived_at_start_only = true and your work area will get a "head * start" but the derived files will not be checked for every build, * but this will occasionally result in long build times after * integrations. * * See also the integrate_begin_exceptions and symlink_exceptions * fields (they apply to hard links as well as symbolic links). */ derived_file_link = boolean; /* * The derived_file_symlink field is true if symbolic links are to * be used for non-source files which are present in the project * baseline(s) but which are not present in the work area, so that * the work area has a complete set of derived files. This allows * work areas to take advantage of "precompiled" object files (etc) * in the baseline(s). * * Defaults to false if not set. * * If (derived_file_link == true AND hard links are available) this * field will be ignored. If the host system does not have symbolic * links, this field will be ignored. * * Maintaining the symbolic links can be time consuming for large * projects, and add quite a noticeable delay before builds start * doing anything. If possible, change your build system to use the * $search_path instead and avoid symbolic links. Alternatively, * set derived_at_start_only = true and your work area will get a * "head start" but the derived files will not be checked for every * build, occasionally resulting in long build times after integrations. * * See also the integrate_begin_exceptions and symlink_exceptions fields. */ derived_file_symlink = boolean; /* * The derived_file_copy field is true if copies are to be used for * non-source files which are present in the project baseline(s) but * which are not present in the work area, so that the work area has * a complete set of derived files. This allows work areas to take * advantage of "precompiled" object files (etc) in the baseline(s). * * Defaults to false if not set. * * If ((derived_file_link == true AND hard links are available) * OR (derived_file_symlink == true AND symbolic links are available)) * this field will be ignored. * * Maintaining the copies can be time consuming (and space * consuming) for large projects, and add quite a noticeable delay * before builds start doing anything. If possible, change your * build system to use the $search_path instead and avoid symbolic * links. Alternatively, set derived_at_start_only = true and your * work area will get a "head start" but the derived files will not * be checked for every build, occasionally resulting in long build * times after integrations. * * See also the integrate_begin_exceptions and symlink_exceptions * fields (they apply to copies as well as symbolic links). */ derived_file_copy = boolean; /* * The during_build_only field is set to true if you want the * symbolic links, hard links and/or copies removed again after each * build. This allows the user to maintain the illusion of using * a search path, without actually doing so. This option is not * especially efficient. * * Defaults to false if not set. * * If this field is false, the development directory will be * populated by the develeop begin (edb) command, and the integratin * directory will be populated by the integrate begin (aeib) * command. */ during_build_only = boolean; /* * The derived_at_start_only field controls whether the above fields * controling the appearance of derived files are acted upon before * every build (false) or only when the work area is created (true). * * Defaults to false if not set. * * This field is ignored if during_build_only is true. */ derived_at_start_only = boolean; }; /* * The configuration_directory field names a directory which will * be searched for additional configuration files. (This directive is * only leagal or meaningful in the master project "config" file.) * * All source files (change source files and project source files) * present in this directory will be read in as if they were added to * the end of the project "config" file. * * The usual priority of files (development directory, branch baseline, * etc, project trunk baseline) is observed then these files are read. * * Please note that the physical directies are never searched, only * Aegis concept of the change and project files is consulted. * Placing additional files in the physical directories will have * no effect. */ configuration_directory = string; /* * how to build the project * (actually, how to do an integration build) * mandatory * * All of the substitutions described in aesub(5) are available. * * Executed as: the intgerator (for integration builds) or the developer * (for development builds). * Current directory: the integration directory of the change (for * integration builds) the development directory of the change * (for development builds). * Exit status: zero is considered succes, non-zero is a failure * and a subsequent successful (exit zero) build will be required. */ build_command = string; /* * The integration_directory_style field controls the appearance of the * integration directory. * * If integration_directory_style is not set, it defaults to values * based on OBSOLETE fields. Defaults are shown on the right. * * integration_directory_style = * { * source_file_symlink = create_symlinks_before_integration_build; (false) * source_file_link = false; (false) * source_file_copy = false; (false) * derived_file_symlink = create_symlinks_before_integration_build; (false) * derived_file_link = link_integration_directory; (false) * derived_file_copy = !link_integration_directory; (false) * during_build_only = remove_symlinks_after_integration_build; (false) * derived_at_start_only = true; (false) * }; */ integration_directory_style = work_area_style; /* * The development_directory_style field controls the appearance of the * development directory. * * If integration_directory_style is not set, it defaults to values * based on OBSOLETE fields (all of which default to false if not set): * * development_directory_style = * { * source_file_symlink = create_symlinks_before_build; (false) * source_file_hard_link = false; (false) * source_file_copy = false; (false) * derived_file_symlink = create_symlinks_before_build; (false) * derived_file_hard_link = false; (false) * derived_file_copy = false; (false) * during_build_only = false; (false) * derived_at_start_only = false; (false) * }; */ development_directory_style = work_area_style; /* * how to do a development build * defaults to above * * All of the substitutions described in aesub(5) are available. * * Executed as: the developer * Current directory: the development directory of the change * Exit status: zero is considered succes, non-zero is a failure * and a subsequent successful (exit zero) build will be required. */ development_build_command = string; /* * This command is run when Aegis adjusts the last-time-modified * timestamp on files in the integration directory. If the build tool * uses additional information to supplement file modification times, this * command gives you the opportunity to re-sync the associated database. * * Executed as: the project owner * Current directory: the new project baseline * Exit status: ignored */ build_time_adjust_notify_command = string; /* * This field is set to true if the build command, when executed on any * architecture, results in all architectures being built. This may be * accomplished, for example, by using cross-compilation techiniques, or * Cook's ability to nominate hosts on which to execute each build rule. */ build_covers_all_architectures = boolean; /* * This field is set to true if the test command, when executed on any * architecture, results in all architectures being tested. This may be * accomplished, for example, by using Cook's ability to nominate hosts * on which to execute each test rule. */ test_covers_all_architectures = boolean; /* * Executed whenever the files in the change, change. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ change_file_command = string; /* * Executed whenever the aegis -new_file command is run successfully. * Defaults to `change_file_command' if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ new_file_command = string; /* * Executed whenever the aegis -new_test command is run successfully. * Defaults to `change_file_command' if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ new_test_command = string; /* * Executed whenever the aegis -copy_file command is run successfully. * Defaults to `change_file_command' if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ copy_file_command = string; /* * Executed whenever the aegis -remove_file command is run successfully. * Defaults to `change_file_command' if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ remove_file_command = string; /* * Executed whenever the files in the change, change by being undone * (aenfu, aecpu, aermu, aentu). * Defaults to change_file_command if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ change_file_undo_command = string; /* * Executed whenever the aegis -new_file_undo command is run successfully. * Defaults to change_file_undo_command if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ new_file_undo_command = string; /* * Executed whenever the aegis -new_test_undo command is run successfully. * Defaults to change_file_undo_command if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ new_test_undo_command = string; /* * Executed whenever the aegis -copy_file_undo command is run successfully. * Defaults to change_file_undo_command if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ copy_file_undo_command = string; /* * Executed whenever the aegis -remove_file_undo command is run successfully. * Defaults to change_file_undo_command if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ remove_file_undo_command = string; /* * The make_transparent_command is executed whenever the * aegis -make_transparent command is run successfully. * Defaults to `change_file_command' if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ make_transparent_command = string; /* * The make_transparent_undo_command is executed whenever the * aegis -make_transparent_undo command is run successfully. * Defaults to `change_file_undo_command' if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${File_List} * space separated list of files named * (at times, can be empty) * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ make_transparent_undo_command = string; /* * Executed at development build before 'development_build_command' when * (a) it is the first build after a develop begin, or * (b) after some other change has been integrated into the baseline * since the last build. * * All of the substitutions described in aesub(5) are available. * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ project_file_command = string; /* * Executed at start of develop begin, immediately after the development * directory has been created. * * All of the substitutions described in aesub(5) are available. * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ develop_begin_early_command = string; /* * Executed at develop begin, towards the end of the aedb command. * * All of the substitutions described in aesub(5) are available. * * Executed as: the developer * Current directory: the development directory of the change * Exit status: ignored */ develop_begin_command = string; /* * Executed at develop begin undo * * All of the substitutions described in aesub(5) are available. * * Executed as: the developer * Current directory: unchanged. * Exit status: ignored */ develop_begin_undo_command = string; /* * Executed at integrate begin * * All of the substitutions described in aesub(5) are available. * * Executed as: the project owner * Current directory: the integration directory * Exit status: ignored */ integrate_begin_command = string; /* * Executed at integrate begin undo. * * All of the substitutions described in aesub(5) are available. * * Executed as: the project owner * Current directory: the development directory * Exit status: ignored */ integrate_begin_undo_command = string; /* * This flag is true if aegis should link the files from the baseline * into the integration directory, rther than copy them (the default). * This has risks, as the build script (e.g. Howto.cook or Makefile, etc) * must unlink targets before rebuilding them. * * Defaults to false if not uset. */ link_integration_directory = boolean; /* * This field may be used to specify files (and file patterns) which are * to be omitted from the copy (link) of the baseline when creating the * integration directory. */ integrate_begin_exceptions = [ string ]; /* * This field is OBSOLETE. * * This flag is true if aegis should create symlinks from the * development directory to the baseline for all files in the baseline * not in the development directory immediately before a * development_build_command is issued. Usually use to trick dumb DMTs * into believeing the development directory contains an entire copy of * the project, though sometimes the DMT is smart enough, the tools it * must work with are not. Symlinks in the development directory which * point to nonexistent files will be removed. * * Defaults to false if not set. */ create_symlinks_before_build = boolean; /* * This field is OBSOLETE. * * This flag is true if aegis should create symlinks from the integration * directory to the baseline for all files in the baseline not in the * integration directory immediately before a build_command is issued. * Usually use to trick dumb DMTs into believeing the integration * directory contains an entire copy of the project, though sometimes * the DMT is smart enough, the tools it must work with are not. * Symlinks in the integration directory which point to nonexistent * files will be removed. * * Defaults to the same value as create_symlinks_before_build if not set. */ create_symlinks_before_integration_build = boolean; /* * This field is OBSOLETE. * * This flag is true if aegis should remove symlinks which point from * the development directory to the baseline directory immediately * after a development_build_command is issued. Only consulted if * the create_symlinks_before_build field is true, for the porpose of * reversing the actions of the create_symlinks_before_build field. * * Defaults to false if not set. */ remove_symlinks_after_build = boolean; /* * This field is OBSOLETE. * * This flag is true if aegis should remove symlinks which point * from the integration directory to the baseline directory * immediately after a build_command is issued. Only consulted * if the create_symlinks_before_integration_build field * is true, for the porpose of reversing the actions of the * create_symlinks_before_integration_build field. * * Defaults to true if not set. This default is intentional. It is * important that there are no symlinks in the (new) baseline, because * they could go stale between integrations. If you set this field to * false, caveat emptor. */ remove_symlinks_after_integration_build = boolean; /* * This field is used to name specific files for which symbolic links * must not be made between the development directory and the baseline. * These are usually state files for various tools. */ symlink_exceptions = [ string ]; /* * the history commands are pretty dicey to have here, * because a project could be badly broken if these don't work just right! * On the other hand, they need to be changed from time to time. */ /* * create a new history * always executed as the project owner * All of the substitutions described in aesub(5) are available. * In addition: * * ${Input} * absolute path of the source file * * ${History} * absolute path of the history file * * ${File_Name} (Optional) * The base relative file name of the file for this check-in. Note * that the file name can vary over the lifetime of the file as it * is renamed, but the history file name never does. * DO NOT use this as the name of the history file. * * ${UUID} (Optional) * The universally unique identifier for this file. * This is invariant for the lifetime of the file. * DO NOT use this as the name of the history file. * * Executed as: the project owner * Current directory: the base of the history tree * Exit status: zero indicates succes, all non-zero exits indicate failure * (the integrate pass will fail). */ history_create_command = string; /* * get a file from history * may be executed by developers * All of the substitutions described in aesub(5) are available. * In addition: * * ${History} * absolute path of the history file * * ${Edit} * edit number to be extracted (artibrary string) * * ${Output} * Absolute path of output file. * * Executed as: the developer (or the executing user, in the case of * the -independent option). * Current directory: the base of the history tree * Exit status: zero indicates succes, all non-zero exits indicate failure * (the aecp will fail). */ history_get_command = string; /* * add a new change to the history * always executed as the project owner * All of the substitutions described in aesub(5) are available. * In addition: * * ${Input} * absolute path of the source file * * ${History} * absolute path of the history file * * ${File_Name} (Optional) * the base relative file name of the file for this check-in. * Note that the filename can vary, but the history file never does. * DO NOT use this as the name of the history file. * * ${UUID} (Optional) * The universally unique identifier for this file. * This is invariant for the lifetime of the file. * DO NOT use this as the name of the history file. * * Executed as: the project owner * Current directory: the base of the history tree * Exit status: zero indicates succes, all non-zero exits indicate failure * (the integrate pass will fail). */ history_put_command = string; /* * query the topmost edit of a history file * Result to be printed on stdout. * may be executed by developers * All of the substitutions described in aesub(5) are available. * In addition: * * ${History} * absolute path of the history file * * Executed as: the project owner * Current directory: the base of the history tree * Exit status: zero indicates succes, all non-zero exits indicate failure * (the integrate pass will fail). */ history_query_command = string; /* * The history_transaction_begin_command field is used to specify a * command to be run by aeipass(1) before any history create or history * put commands are run. The default is to do nothing. * * All of the substitutions described in aesub(5) are available. * If you need a transaction ID, use the $version substitution. * * Executed as: the project owner * Current directory: the base of the history tree * Exit status: zero indicates succes, all non-zero exits indicate failure * (the integrate pass will fail). */ history_transaction_begin_command = string; /* * The history_transaction_end_command field is used to specify a * command to be run by aeipass(1) after any history create or history * put commands are run, but before any history query commands are run. * The default is to do nothing. * * All of the substitutions described in aesub(5) are available. * If you need a transaction ID, use the $version substitution. * * Executed as: the project owner * Current directory: the base of the history tree * Exit status: zero indicates succes, all non-zero exits indicate failure * (the integrate pass will fail). */ history_transaction_end_command = string; /* * The history_transaction_abort_command field is used to specify a * command to be run by aeipass(1) to indicate that a transaction has * been abandoned. The default is to do nothing. * * All of the substitutions described in aesub(5) are available. * If you need a transaction ID, use the $version substitution. * * Executed as: the project owner * Current directory: the base of the history tree * Exit status: ignored. */ history_transaction_abort_command = string; /* * Many history tools (e.g. RCS) can modify the contents of the file * when it is committed. While there are usually options to turn this * off, they are seldom used. The problem is: if the commit changes the * file, the source in the repository now no longer matches the object * file in the repository - i.e. the history tool has compromised the * referential integrity of the repository. * * fatal * Emit a fatal error if a source file is modified by a * history_put_command or history_create_command. * This is the default. * * warn * Emit a warning if a source file is modified. * * ignore * Ignore a source file changing. You sure better hope it was only * in a comment! */ history_put_trashes_file = (fatal, warn, ignore); /* * This field describes the content style which the history tool is * capable of working with. * * ascii_text * The history tool can only cope with files which contain printable * ASCII characters, plus space, tab and newline. The file must * end with a newline. This is the default. * * international_text * The history tool can only cope with files which do not contain * the NUL character. The file must end with a newline. This is * the default. * * binary_capable * The history tool can cope with files without any limitation on * the form of the contents. * * When a file is added to the history (by either the history_create_ * command or the history_put_command) it is examined for conformance * to this limitation. If there is a problem, the file is encoded in * either quoted printable for MIME64, whichever is smaller, before * being given to the history tool. This encoding is transparent, * the file in the baseline is unchanged. * * On extract (the history_get_command) the encoding is reversed, using * information attached to the change file information. This is because * each put could use a different encoding (although in practice, file * contents rarely change that dramatically, and the same encoding is * likely to be deduced every time). */ history_content_limitation = (ascii_text, international_text, binary_capable); /* * The history_label_command is executed at integration pass, and * when executing aedn(1) to label the file version in history with a * particular label. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${History} * absolute path of the history file. * * ${Edit} * edit number to be extracted (artibrary string). * * ${Label} * During aedn(1), this is set to the name given in the command. * At integration pass it is the same as ${Version}. * * Executed as: the project owner * Current directory: the base of the history tree * Exit status: zero indicates succes, all non-zero exits indicate failure * (the integrate pass, but a warning will be issued). */ history_label_command = string; /* * difference of 2 files * All of the substitutions described in aesub(5) are available. * In addition: * * ${ORiginal} * absolute path of file in baseline (usually) * * ${Input} * absolute path of file in development directory (usually) * * ${Output} * Absolute path of output file * * Executed as: the project owner (for integration diffs), or the * developer (for development diffs) * Current directory: the integration directory (for integration diffs), * or the development directory (for development diffs) * Exit status: zero indicates succes, all non-zero exits indicate failure * (the aed will fail). */ diff_command = string; /* * This command is used to obtain the difference of 3 files. This command * is deprecated, in favour of the merge_command, below. All of the * substitutions described in aesub(5) are available. In addition: * * ${ORiginal} * Absolute path of common ancestor * * ${Most_Recent} * Absolute path of competing edit, usually in the baseline. * * ${Input} * absolute path of file in development directory (usually) * * ${Output} * absolute path of output file * * Executed as: the developer * Current directory: the development directory * Exit status: zero indicates succes, all non-zero exits indicate failure * (the aed will fail). */ diff3_command = string; /* * This command is used to merge two competing edits. * * This command is almost identical to the diff3_command, above. However, * with this command, Aegis will have already moved the input file to a * back-up name; the output name will be the name of the source file. * (It is the source file which is being reconstructed, after all, * from the two competing edits.) * * Historically, the diff3_command as abused to perform an in-situ merge * (by moving the $output back over the $input); this resulted in the * completion message disagreeing with the performed action. * This command MUST NOT move its input and output files around. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${ORiginal} * Absolute path of common ancestor * * ${Most_Recent} * Absolute path of competing edit, usually in the baseline. * * ${Input} * absolute path of file in development directory (usually) * * ${Output} * absolute path of output file, in the development directory (usually) * * Executed as: the developer * Current directory: the development directory * Exit status: zero indicates succes, all non-zero exits indicate failure * (the aed will fail). */ merge_command = string; /* * The difference of 2 files, to send around as a patch. (This isn't the * same as diff_command, because it's aimed at GNU Patch, not at humans.) * * Defaults to "set +e; diff -c -L $index -L $index $original $input > * $output; text $? -le 1" if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${ORiginal} * absolute path of file in baseline (usually) * * ${Input} * absolute path of file in development directory (usually) * * ${Output} * Absolute path of output file * * ${INDex} * Project relative name of the file, for use in index lines, * such as GNU diff's -L option. Optional. * * Executed as: the executing user. * Current directory: the development directory for change in progress, * the integration doirectory for change bein integrated, the * baseline for changes which are completed. * Exit status: zero indicates succes, all non-zero exits indicate failure * (the aed will fail). */ patch_diff_command = string; /* * The difference of 2 files, to fiure out the differences between version * for the aeannotate listing. (This isn't the same as diff_command, * because it's aimed at aeannotate, not at humans.) * * Defaults to "set +e; diff $option $original $input > $output; text $? -le 1" * if not set. * * All of the substitutions described in aesub(5) are available. * In addition: * * ${ORiginal} * absolute path of file in baseline (usually) * * ${Input} * absolute path of file in development directory (usually) * * ${Output} * Absolute path of output file * * ${INDex} * Project relative name of the file, for use in index lines, * such as GNU diff's -L option. Optional. * * ${OPTion} * Extra options to be passed to the diff command, as set by the * aeannotate -diff-option command line option. Use with care. * * Executed as: the executing user. * Current directory: the development directory for change in progress, * the integration doirectory for change bein integrated, the * baseline for changes which are completed. * Exit status: zero indicates succes, all non-zero exits indicate failure * (the aed will fail). */ annotate_diff_command = string; /* * This field is used to set the command to be executed by 'aegis -test'. * Defaults to "$shell $filename" if not set. * * All of the substitutions described in aesub(5) are available, * In addition: * * ${File_Name} * the absolute path of the test to be executed. * ${VARiables} * the text of name=value variable settings from the command line, * suitably quoted to protect special character from the shell. * Will be appended to the end of the command if not used explicitly. * * Note that tests are source files, and thus never have the execute bit set. * * Executed as: the project owner (for integration tests) or the developer * (for development tests), or the executing user (for -independent tests) * Current directory: the integration directory (for integration tests), * the development directory (for development tests), the project * baseline (for -bl tests), or the current directory (for * -indenpendent tests). * Exit status: zero indicates succes, one indicates failure, anything * else indicates "no result". */ test_command = string; /* * This field is used to set the command to be executed by 'aegis * -test' by a developer. Defaults to be the same as the * test_command field if not set. It is a significantly bad idea to * make tests behave differently in development tests and integration * tests; avoid this at all costs. * * All of the substitutions described in aesub(5) are available, * In addition: * * ${File_Name} * the absolute path of the test to be executed. * ${VARiables} * the text of name=value variable settings from the command line, * suitably quoted to protect special character from the shell. * Will be appended to the end of the command if not used explicitly. * * Note that tests are source files, and thus never have the execute bit set. * * Executed as: the developer * Current directory: the development directory (for development tests), * the project baseline (for -bl tests) * Exit status: zero indicates succes, one indicates failure, anything * else indicates "no result". */ development_test_command = string; /* * This is an advanced field, used to run more than test at once. * It is of most use if you have a multi-processor machine. * * All of the substitutions described in aesub(5) are available, * In addition: * * ${File_Names} * The base-relative paths of the tests to be executed. Note that * tests are source files, and thus never have the execute bit set. * ${VARiables} * the text of name=value variable settings from the command line, * suitably quoted to protect special character from the shell. * Will be appended to the end of the command if not used explicitly. * ${Ouput} * The absolute path of a file in aetest(5) format, to be created * by the batch test command, to contain the results of the tests. * * Executed as: the project owner (for integration tests) or the developer * (for development tests), or the executing user (for -independent tests) * Current directory: the integration directory (for integration tests), * the development directory (for development tests), the project * baseline (for -bl tests), or the current directory (for * -indenpendent tests). * Exit status: zero indicates success, one indicates failure. * Individual test tesults are read from $output. */ batch_test_command = string; /* * This command is executed to help determine the architecture of the * machine. If it is empty or undefined then nothing is done. */ architecture_discriminator_command = string ; /* * This is a list of system and machine architectures on which each * change must successfully build and test. */ architecture = [ { /* * The name of an architecture. Available as the * ${ARCHitecture} substitution, the AEGIS_ARCH * environment variable, and listed in the architecture * field of the cattr/cstate file. */ name = string; /* * A pattern in the form "sysname-release-version-machine". * Normal filename matching wildcards may be used. */ pattern = string; /* * The type of architecture this is. By default, if * an architecture is named in the *change* attributes, * it is required (unless an exception has been granted, * in which case it isn't in the list). * * However, you can have "optional" architectures for * which you can build and test, but they don't contribute * to the overall timestamps. */ mode = (required, optional, forbidden); } ] redefinition_ok; /* * new file templates * (Body and body_command are mutually exclusive.) */ file_template = [ { pattern = [ string ]; body = string; body_command = string; } ] redefinition_ok; /* * Whiteout templates are used to produce "whiteout" files in the * development directory when a file has been removed. The idea is that * if it is referenced during the build, it will result in compile errors. * If no patters match, 1 1K junk file will be used instead. An *absent* * body field means don't create any whiteout. */ whiteout_template = [ { pattern = [ string ]; body = string; } ] redefinition_ok; /* * This field is used to limit the length of filenames. All new files * may not have path components longer than this. Existing files are not * affected. The last component must also allow for the ",D" suffix of * difference files. Where this value is larger than the file system * allows, the file system limit will be imposed. * Defaults to 255 if not set. */ maximum_filename_length = integer; /* * This field may be used to limit the characters allowed * in filenames to only those explicitly allowed by POSIX. * Defaults to false if not set. * * For a filename to be portable across conforming implementations of * IEEE Std 1003.1-1988, it shall consist only of alphanumeric * characters, dot, hyphen or underscore. Hyphen shall not be used * as the first character of a portable filename. * * If this field is false, all characters are allowed * except non-printing characters, space characters and leading hypens. */ posix_filename_charset = boolean; /* * This field may be used to limit filesnames so that they conform to * the DOS 8+3 filename limits and to the DOS filename character set. * Defaults to false if not set. This field is used in combination * with the other filename fields, it does not replace them. * * It also denies use of the filenames which look like device names, * such as [aA][uU][xX] etc. */ dos_filename_required = boolean; /* * This field may be used to limit filesnames so that they conform to * the Windows98 and WindowsNT filename limits. Defaults to false if * not set. This field is used in combination with the other filename * fields, it does not replace them. * * It also denies use of the filenames which look like device names, * such as [aA][uU][xX] etc. */ windows_filename_required = boolean; /* * This field may be used to limit filenames so that they may not contain * shell special characters. If you do not set this to true, you will * need to use the ${quote} substitution around filenames in commands, * or risk unexpected errors. This field defaults to true if not set. * * The user must take great care to use the ${quote} substitution around * all file names in commands in the project configuration. */ shell_safe_filenames = boolean; /* * This field may be used to allow white space characters in file names. * This will allow the following characters to appear in filenames: * backspace (BS, \b, 0x08), horizontal tab (HT, \t, 0x09), new line * (NL, \n, 0x0A), vertical tab (VT, \v, 0x0B), form feed (FF, \f, * 0x0C), and carriage return (CR, \r, 0x0D). * * Defaults to false if not set. * * The user must take great care to use the ${quote} substitution around * all file names in commands in the project configuration. And even * then, substitutions which expect a space separated list of file names * will have undefined results. */ allow_white_space_in_filenames = boolean; /* * This field may be used to allow file names with non-ascii-printable * characters in them. Usually this would mean a UTF8 or international * charset of some kind. * * Defaults to false if not set. */ allow_non_ascii_filenames = boolean; /* * This field is used to specify a list of patterns of acceptable * filenames. The patterns are constructed from the usual shell * filename wildcards. Defaults to "*" if not set. */ filename_pattern_accept = [ string ]; /* * This field is used to specify a list of patterns of unacceptable * filenames. The patterns are constructed from the usual shell * filename wildcards. Defaults to "*,D" if not set. The pattern * "*,D" is always appended. * * Where the filename_pattern_accept and filename_pattern_reject fields * conflict, the reject takes precedence. */ filename_pattern_reject = [ string ]; /* * This string is used to form the filename of new tests, where the * filename is not specified on the aent command line. * * Defaults to "test/$hundred/t$number$type.sh" if not set. * * All of the substitutions defined in aesub(5) are available. The * following 3 substitutions are also available: * * Hundred The test number divided by 100, zero padded to 2 digits * (Optional) * Number The test number, zero padded to 4 digits * (Mandatory) * Type The test type (a = automatic, m = manual) * (Optional) */ new_test_filename = string; /* * This field is used to determine the name of the development directory * at develope begin. All of the substitutions defined in aesub(5) are * available. The following substitutions is also available: * * Default_Development_Directory * The directory within which the development directory is * to be created. * Magic * A single letter, starting from "C", which can be * inserted. This must be used, as it allows Aegis to try * different names should there be a conflict. * * If not set, defaults to * "$ddd/${left $p ${expr ${namemax $ddd} - ${length .$magic$c}}}.$magic$c" * For DOS compatibility (8+3 filenames), a useful setting is * "$ddd/${downcase ${left ${id $p} 7}$magic}.${right 00$change 3}" */ development_directory_template = string; /* * This field is used to form the filename for metrics gathering. * The metrics file will be read by aeipass, if present, and stored in the * change file metrics field. The following substitutions are available: * * File_Name * The name of the source file the statistics relate to. * * If not set, defaults to * "$filename,S" * a common DOS-compatible alternative is * "metrics/$filename" */ metrics_filename_pattern = string; /* * This list of filename patterns is consulted by aedist --receive when it * is checking for files which could be used to host Trojan horse attacks. * This will be different for different projects, so you will need to * update this youself. */ trojan_horse_suspect = [ string ]; /* * This is a list of project specific vales. They may be accessed by * using the ${project_specific } subsstitution. See aesub(5) * for more information. */ project_specific = attributes redefinition_ok; /* * This field controls the adjustment of file modification times at the * end of integrate-pass. File times are adjusted so that development * directories are, in the main, out of date with respect to the baseline. * The idea is that, at the very least, programs need to be relinked so * that aet -reg does not give false negatives. * * Combining this with the project_file_command (above) can alleviate the * vast majority of file mo time inconsistencies experienced as a result * of a project integration and the subsequent changes in the baseline's * mod times. * * Unless you are a masochist, do not set this field. Leave it as the default. * * adjust_and_sleep * Causes the file times to be adjusted, and if the file times * would extend into the future, aeipass will sleep until that time * has passed. This is the default. * * adjust_only * Causes the file times to be adjusted. If the file time extend * into the future, a warning is issued. * * dont_adjust * File modification times are not adjusted. This is a really bad * idea. Really. Make sure that, at the very minimum, * project_file_command touches all of the change's files, * otherwise the build problems which ensue are going to take you * weeks to track down and lose you mucho productivity. * You have been warned. * * See also the build_time_adjust_notify_command field. */ build_time_adjust = (adjust_and_sleep, adjust_only, dont_adjust); /* * If this field is set, each aedb, aechown, aede and aerpass will * append a Signed-off-by: line to the change description. This should * only be set to true for open source projects. * * For a description of Signed-off-by see * http://www.ussg.iu.edu/hypermail/linux/kernel/0405.2/1301.html * http://www.osdl.org/newsroom/press_releases/2004/2004_05_24_dco.html * * * Developer's Certificate of Origin 1.0 * * By making a contribution to this project, I certify that: * * (a) The contribution was created in whole or in part by me and I have * the right to submit it under the open source license indicated in * the file; or * * (b) The contribution is based upon previous work that, to the best * of my knowledge, is covered under an appropriate open source * license and I have the right under that license to submit that * work with modifications, whether created in whole or in part by * me, under the same open source license (unless I am permitted to * submit under a different license), as indicated in the file; or * * (c) The contribution was provided directly to me by some other person * who certified (a), (b) or (c) and I have not modified it. */ signed_off_by = boolean; /* * Executed whenever the aegis -review_pass command is run. * Defaults to `exit 0;' if not set. * * All of the substitutions described in aesub(5) are available. * * Executed as: the current reviewer. * Current directory: the development directory of the change * Exit status: zero means the change has been reviewed sufficiently. * non-zero means that further review(s) are necessary. */ review_policy_command = string; /* * Executed whenever the aegis -develop_end command is run. * Defaults to `exit 0;' if not set. * * This command is executed before any action is taken. If it returns a * non-zero exit status, the change may not leave the "being developed" * state. * * All of the substitutions described in aesub(5) are available. * * Executed as: the current reviewer. * Current directory: the development directory of the change * Exit status: zero means the change has been reviewed sufficiently. * non-zero means that further review(s) are necessary. */ develop_end_policy_command = string; /* * The unchanged_file_develop_end_policy field is used to control * what happens when development of a change is ended, and the change * contains files which have not had their contents or their attributes * changed. * * ignore * Does not look for or warn about unchanged files. * warning * If the change sets contains unchanged files, an warning will be * issued for each one. * error * If the change set contains unchanged files, an error will be * issued for each one, and develop end will not complete (and the * change will remain in the "being developed" state). */ unchanged_file_develop_end_policy = (ignore, warning, error); /* * The unchanged_file_integrate_pass_policy field is used to control * what happens when a change is completed, and the change contains * files which have not had their contents or their attributes changed. * * ignore * Does not look for or warn about unchanged files. * warning * If the change sets contains unchanged files, an warning will be * issued for each one. * remove * If the change set contains unchanged files, they will be silently * removed from the change set. The project file is unaffected. */ unchanged_file_integrate_pass_policy = (ignore, warning, remove); /* * It is possible to have Aegis cache the list of project files that * were present at integrate pass for each delta (integrated change * set). This is used to optimize all project_file_roll_forward-based * operations, such as aecp -delta or aepatch. * * This cache will optimize many operations which would otherwise * require time to reconstruct the project state using the * roll-foworward data available in each change set. However, it comes * at the cost of disk space, and not everyone can afford more and more * disk. * * This field defaults to true if not set. */ cache_project_file_list_for_each_delta = boolean; /* * It is possible to have Aegis exclude from the clean process any file * that match one of the pattern listed in the clean_exceptions list. * * This field default to an empty list if not set. */ clean_exceptions = [ string ]; /* vim: set ts=8 sw=4 et : */