Provided by: aegis_4.24.3-3_amd64 bug

NAME

        aeintegratq - integrate changes into projects

SYNOPSIS

        aeintegratq [ option...  ] project-name...

DESCRIPTION

        The aeintegratq command is used to manage the integrations of one or more changes in one
        or more projects.  Normally run via cron(1) or at(1) with the name of a single project,
        aeintegratq will manage all operations for integration even when -Build and -Test are
        required on multiple architectures. If a change review is revoked after the queue is
        running aeintegratq will notice the bad state and silently move on.  If one or more
        changes are ended or passed after the queue is running, and -loop has been given,
        aeintegratq will notice the new change[s] and integrate them. Additional options allow
        the integrator full control over most aspects of queue management such as the order of
        integration of multiple changes.

OPTIONS

        The following options are understood:

   Option Summary
        -h      Help, show usage information.

        -H      Help, show usage plus all helpful comment information.

        -a      run on Any machine (normally only IntegrationHost)

        -s      run remote operations via ssh (default rsh)

        -n      No action, just tell what would be done.

        -ib s   Specify (remote) server for ibegin.

        -ip s   Specify (remote) server for ipass.

        -k      Keep the scripts and report files.

        -K      Keep the temp file even if integration passes.

        -loop   Loop to process more changes if they become available before aeintegratq
                completes.  It will stop when there is nothing more to be done.

        -M list Minimum, run given changes -minimum

        -P list Precious, do not IFail changes in list, just stop.

        -R list Ready, specify order and subset, e.g. -R 29,45

        -S stage
                Pick up at given stage (diff|build|test|integrate)

        -c change-number
                specify Change to integrate at Stage

        -p project-name
                specify single Project name

        NOTE: if custom options such as -P -R -S -c -p are given only a single project may be
        integrated since the options would be meaningless to the next project given.

        Some options are present only for testing and investigation.  Note that options are
        rarely required for normal operations.

   Control Options
        The following options are available for special needs.  They control the order and
        disposition of each change awaiting_integration in a given project.

        -R[eady] number1,number2...
                This option is used to specify order or subset to integrate.  Only those changes
                listed will be attempted, and in exactly the order given. This applies to queue
                looping if -loop is given. In particular note unless the list includes future
                changes, future loops will not integrate them.

                Useful if a particular change must go in before another for some reason.  Or if
                only integrating one or two changes when several are awaiting_integration in the
                given project.  A single change may also be specified with the -c[hange] number
                option, which is common for other aegis commands.  However the -R option allows a
                list and if given will override any -c given.

        -P[recious] number1,number2...

        -P[recious] all
                This option is used to specify that a particular change or subset of changes
                should be considered precious.  It neither implies order nor limits the queue run
                to that subset; it only means that the changes should be considered precious.
                Note that at least one number (or the keyword all) must be given.

                The concept of precious means that if the given change were to fail anywhere in
                the integration process, then the process simply stops and leaves the problem
                change in the delta directory.  The -IFail would not actually be executed.  This
                is sometimes useful to diagnose a problem which only occurs during integrations.
                It is also useful if the failure is due to a transient problem such as unreliable
                machines on the network.  In such a case the integration can be resumed after
                fixing the problem.  See the stage options below.

                If, on the other hand, a precious change makes it through the integration process
                successfully, the option has no effect.

        -M[inimum] number1,number2... or all
                Integrate the given change[s] with the -minimum option.  Such changes will be put
                on the end of the queue so that the last integrations of a run will be a minimum.
                This feature allows practical use of minimum integrations without requiring
                -minimum on each and every integration.  See the section below on Minimum
                integrations for more information.  If -loop is given any change[s] specified as
                minimum will run at the end of the loop in which they are ready, they will not be
                pushed to the final loop.

        -ib[server] server-name or ""

        -ip[server] server-name or ""
                To specify a remote server on which to run -ibegin or 0 respecively. These
                options are rarely needed, but may be useful if a project is hosted on a
                different file server and has a large baseline. By having the -ibegin run on that
                server the network traffic would be greatly reduced and for large projects and/or
                slow networks can greatly reduce the time required for -ibegin.  The option form
                of giving an empty name depends on the output of df -k giving a parseable host
                name. If that is not true on your integration host architecture, you will have to
                specify the server name.

        -display display-value or ""
                To specify a valid X display for use during integration operations.

   Stage Options
        The following options allow [re]starting an integration which has already progressed
        through some stages.  This is useful to deal with failed (precious) integrations, or to
        finish automatically an integration begun by hand.

        -S[tage] diff

        -S[tage] build

        -S[tage] test

        -S[tage] integrate
                Pick up the integration at the given stage.  Requires -c[hange] number option to
                specify the change number.

Advanced Controls

        The integrator may provide for special situations such as operations required after
        -Build and before -Test, or at the end of a queue run.  Such capabilities are provided by
        hooks and strategies described below.

   Hooks
        There are a set of hooks available which are run, if present, before and after each stage
        of the integration.  They can be used to help ensure that the integrator actually gets
        some sleep while managing large projects.

        These hooks are searched for in the directory $HOME/integration_hooks.  None need exist;
        aeintegratq will only pay attention to any that do exist.  Hooks may be any form of
        executable (script, etc) and are called with 2 arguments: project-name change-number.
        They run as the integrator on the machine from which aeintegratq was started.  They are
        named using the project name along with a suffix according to what place in the
        integration process you want them to run.

        Note that if a hook for project foo exists it is also used for any branches under that
        project.  For example, if you have provided foo.pre_ip, it will be run for foo.1 and
        foo.1.0 as well.  If for some reason you want different (or no) action for project
        foo.1.0, then you would provide foo.1.0.pre_ip which does what you wish, including
        nothing, effectively overriding foo.pre_ip.

        Here is how to map particular places in the integration process to hook suffixes.

                           ┌──────────────────────────────────────────────────┐
                           │run at time                          extension    │
                           ├──────────────────────────────────────────────────┤
                           │before attempting -Integrate_Begin   .pre_ib      │
                           │after -Integrate_Begin completes     .ib          │
                           │before attempting -Diff              .pre_d       │
                           │after -Diff completes                .d           │
                           │before attempting -Build             .pre_b       │
                           │after -Build completes               .b           │
                           │before attempting -Build on <arch>   .pre_<arch>b │
                           │after -Build on <arch> completes     .<arch>b     │
                           │before attempting -Test              .pre_t       │
                           │after -Test completes                .t           │
                           │before attempting -IPass             .pre_ip      │
                           │after -IPass completes               .ip          │
                           │before attempting -IFail             .pre_if      │
                           │after -IFail completes               .if          │
                           └──────────────────────────────────────────────────┘
        The hook program should exit with 0 if successful or 1 if not.  A non-zero exit causes
        the change being integrated to fail immediately unless it was marked precious.

        Note that in most cases anything done via an .ip hook should probably be done instead by
        the ipass_notify command in the project attributes file (see aepattr(5) for more
        information), or the build_time_adjust_notify_command in the project configuration file
        (see aepconf(5) for more information), but the hook can provide a temporary way to keep
        going until the permanent solution can be implemented.

        In addition two special hooks, aeintegratq.end and aeintegratq.fail, are recognized.
        They are called when aeintegratq finishes a queue run.  They are called with 2 arguments
        like any other hook (project-name change-number) although both the project-name and
        change-number given are of the last change integrated and may be less than useful.

        The .end hook is called if/when the queue run is finished and was successful.  Note that
        this does not mean that no changes failed, only that no queue errors occurred.  This hook
        might be used to invoke another queue run on a different project/branch, or possibly even
        on the same project, if other changes may have been ended and/or reviewed while the first
        run was in progress, see also the -loop option.  These conditions arise quite often with
        flex time engineers.  Another use of the .end hook is to automatically build a new
        package using the newly integrated project as source.

        If queue errors were encountered, or a change failed that was marked precious, then the
        .fail hook is called.  An obvious use of that hook would be an e-mailed page to the
        integrator.

   Strategy or Oops-retry
        Sometimes a persistent build problem will plague integrations.  This can be very annoying
        if it ruins an overnight run, especially if the cure is simple when it happens.  Examples
        of this can be timeouts due to a busy data server or other transient errors.  Note that
        this applies only to -Build related problems.

        To deal with such problems the integrator may provide a strategy script specific to a
        project.  An executable program should be found in $HOME/strategy.<project_name>.  The
        program will be run as the integrator with the delta directory as current directory.  The
        program may do any commands necessary to clean up and/or diagnose the error.  If the
        script finds the problem to be transient and fix-able, it exits successfully (with 0
        status) and aeintegratq will re-launch the -Build and log the re-try.  Otherwise the
        script should exit with a 1 and the change will fail.

Multi-Architecture integrations

        For projects which build and test on multiple architectures, aeintegratq requires
        arch_hosts be installed and have available at least one machine of each architecture
        required.  This is also true if the host from which aeintegratq is run is of a different
        architecture from the target architecture of the project being integrated.

        If you wish to take advantage of multiple architecture automatic integrations, you can
        install arch_hosts or provide a more simple script which will return a machine name
        according to architecture and job type.

Minimum integrations

         provides a minimum integration capability which may be used for various reasons.  The
        term minimum may be a bit counter intuitive.  One might think it means to do the minimum
        amount of work, however it actually means use a minimum of files from the baseline in
        populating the delta directory.  Since no constructed files are put in the delta
        directory, this normally leads to actually building everything in the project from
        sources and, as such, might be considered the most robust of builds.

        Note that any change which removes a file, whether by aerm or aemv, results in an
        implicit minimum integration.  This is intended to ensure nothing in the project
        references the removed file.

        A project may adopt a policy that a product release should be based on a minimum
        integration.  Such a policy may be a reflection of local confidence, or lack thereof, in
        the project's DMT (Dependency Maintenance Tool) or build system.  Or it may be based on a
        validation process wishing to make a simple statement on how the released package was
        produced.

        Another, more transient, reason a to require a minimum integration might be when
        upgrading a third party library, compiler or maybe even OS level.  Any of these events
        would signal the need for a minimum integration to ensure everything is rebuilt using the
        new resources.  This can be done with minimum overhead using the -M option as described
        above.

        The cost of a minimum integration varies according to type and size of the project.  For
        very large projects, especially those building large numbers of binaries, the cost can be
        large.  However large projects also require significant time to fully populate the delta
        directory.  A minimum integration only copies those files under aegis control, skipping
        all “produced” files.  In the case where a file upon which everything depends is changed,
        everything will be built anyway so the copy of the already built files is a waste of
        time.  This means that sometimes a minimum can be as cheap as a normal integration.

Manual Tests

         allows tests to be defined as manual which may be necessary if the test requires human
        interaction or some transient resource. Such tests can be problematic for automatic
        integrations and generally must have some means to pass without running during
        integrations. For this, and other, reasons most sites seek to avoid manual tests. There
        are a number of ways to code a test such that it will pass automatically during
        integrations. Just one example for shell script tests might be:

        CSTATE=`aesub -p $AEGIS_PROJECT -c $AEGIS_CHANGE '${state}'`
        if [ "$CSTATE" = "being_integrated" ]
        then
            echo "`basename $0` passes during integration"
            exit 0
        fi

Optional Support Programs

        There are some programs which aeintegratq will use if they are installed.

        • arch_hosts was mentioned previously.  It is optional only if your projects and your
        file server are of a single architecture.

        • aelogres may enhance the information provided in -IFail entries.  Normally all you get
        is the last 10 lines of the log file, which is not bad if tests fail, but can be terrible
        for failed builds.  If you provide a program named aelogres which knows how to extract a
        better succinct report of problems, the output of that program will be used instead of
        the simple tail.  It is called with a -i option.

        • sound_all_machines, if available, will be called when integrations either pass or fail.
        It can be helpful to announce the fact that an integration has finished.  If it passed,
        developers will probably want to do an aed to bring their changes up to date.  The audio
        announcement provides another timely hint.

        The sound files are searched for in the /var/lib/aegis/sounds directory.  They will have
        endings of _pass and _fail according to the results of a given attempt.  Two sound files
        are required: integration_pass and integration_fail.  Others will be used if provided to
        customize the sounds so that each developer may have one or more personal sounds.  If a
        file named <developer>_pass is located, it will be used.  If a set of files exist named
        <developer_pass.[0-9] they will be used in random sequence.  The same search rule applies
        to _fail sets.  The sound_all_machines program may use a host list and play the sound
        file on each machine or, assuming that other audio capabilities exist, might do any form
        of announcement desired.

EXIT STATUS

        The aeintegratq command will exit with a status of 1 on any error.  The aeintegratq
        command will only exit with a status of 0 if there are no errors.

ENVIRONMENT VARIABLES

        See aegis(1) for a list of environment variables which may affect this command.  See
        aepconf(5) for the project configuration file's project_specific field for how to set
        environment variables for all commands executed by Aegis.

FILES

        Control files are searched for in the $HOME directory.  They are named
        strategy.<project>, They need not exist if no special action is necessary.

        The hook scripts are searched for in the $HOME/integration_hooks directory.  They are
        named <project>.<stage>.  Also aeintegratq.end and aeintegratq.fail.  These hooks also
        need not exist if no special action is desired.

COPYRIGHT

        aeintegratq version 4.24.3.D001
        Copyright (C) 1998-2005 Endocardial Solutions, Inc.

        The aeintegratq program comes with ABSOLUTELY NO WARRANTY; This is free software and you
        are welcome to redistribute it under certain conditions;

AUTHOR