/* * aegis - project change supervisor * Copyright (C) 1991-1996, 1998-2001 Peter Miller; * All rights reserved. * * 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 2 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * * MANIFEST: project config file contents definition * * 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 /* * 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; /* * 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; /* * 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 files in the change, change by being undone * (aenfu, aecpu, aermu, aentu). * Defaults to change_file_command is 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 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 develop begin * * 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 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; /* * 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. */ 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 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 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 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 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 * * 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 * * 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; /* * 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); /* * 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 $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 * * 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; /* * 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. * * 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. * * 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 filed, 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. * * ${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 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); } ]; /* * new file templates * (Body and body_command are mutually exclusive.) */ file_template = [ { pattern = [ string ]; body = string; body_command = string; } ]; /* * 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; } ]; /* * 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. * * Setting this field to true will not enable white space characters or * international in filenames. (Yeah, I know, Macintosh and WinNT make * this a pain.) */ shell_safe_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 = [ { name = string; value = string; } ];