diff options
-rwxr-xr-x | bin/ae-cvs-ci | 204 | ||||
-rwxr-xr-x | bin/ae-svn-ci | 240 | ||||
-rw-r--r-- | bin/ae2cvs | 579 |
3 files changed, 0 insertions, 1023 deletions
diff --git a/bin/ae-cvs-ci b/bin/ae-cvs-ci deleted file mode 100755 index 47c8073..0000000 --- a/bin/ae-cvs-ci +++ /dev/null @@ -1,204 +0,0 @@ -# -# aegis - project change supervisor -# Copyright (C) 2004 Peter Miller; -# All rights reserved. -# -# As a specific exception to the GPL, you are allowed to copy -# this source file into your own project and modify it, without -# releasing your project under the GPL, unless there is some other -# file or condition which would require it. -# -# MANIFEST: shell script to commit changes to CVS -# -# It is assumed that your CVSROOT and CVS_RSH environment variables have -# already been set appropriately. -# -# This script is expected to be run as by integrate_pass_notify_command -# and as such the baseline has already assumed the shape asked for by -# the change. -# -# integrate_pass_notify_command = -# "$bin/ae-cvs-ci $project $change"; -# -# Alternatively, you may wish to tailor this script to the individual -# needs of your project. Make it a source file, e.g. "etc/ae-cvs-ci.sh" -# and then use the following: -# -# integrate_pass_notify_command = -# "$sh ${s etc/ae-cvs-ci} $project $change"; -# - -USAGE="Usage: $0 <project> <change>" - -PRINT="echo" -EXECUTE="eval" - -while getopts "hnq" FLAG -do - case ${FLAG} in - h ) - echo "${USAGE}" - exit 0 - ;; - n ) - EXECUTE=":" - ;; - q ) - PRINT=":" - ;; - * ) - echo "$0: unknown option ${FLAG}" >&2 - exit 1 - ;; - esac -done - -shift `expr ${OPTIND} - 1` - -case $# in -2) - project=$1 - change=$2 - ;; -*) - echo "${USAGE}" 1>&2 - exit 1 - ;; -esac - -here=`pwd` - -AEGIS_PROJECT=$project -export AEGIS_PROJECT -AEGIS_CHANGE=$change -export AEGIS_CHANGE - -module=`echo $project | sed 's|[.].*||'` - -baseline=`aegis -cd -bl` - -if test X${TMPDIR} = X; then TMPDIR=/var/tmp; fi - -TMP=${TMPDIR}/ae-cvs-ci.$$ -mkdir ${TMP} -cd ${TMP} - -PWD=`pwd` -if test X${PWD} != X${TMP}; then - echo "$0: ended up in ${PWD}, not ${TMP}" >&2 - exit 1 -fi - -fail() -{ - set +x - cd $here - rm -rf ${TMP} - echo "FAILED" 1>&2 - exit 1 -} -trap "fail" 1 2 3 15 - -Command() -{ - ${PRINT} "$*" - ${EXECUTE} "$*" -} - -# -# Create a new CVS work area. -# -# Note: this assumes the module is checked-out into a directory of the -# same name. Is there a way to ask CVS where is is going to put a -# modules, so we can always get the "cd" right? -# -${PRINT} cvs co $module -${EXECUTE} cvs co $module > LOG 2>&1 -if test $? -ne 0; then cat LOG; fail; fi -${EXECUTE} cd $module - -# -# Now we need to extract the sources from Aegis and drop them into the -# CVS work area. There are two ways to do this. -# -# The first way is to use the generated tarball. -# This has the advantage that it has the Makefile.in file in it, and -# will work immediately. -# -# The second way is to use aetar, which will give exact sources, and -# omit all derived files. This will *not* include the Makefile.in, -# and so will not be readily compilable. -# -# gunzip < $baseline/export/${project}.tar.gz | tardy -rp ${project} | tar xf - -aetar -send -comp-alg=gzip -o - | tar xzf - - -# -# If any new directories have been created we will need to add them -# to CVS before we can add the new files which we know are in them, -# or they would not have been created. Do this only if the -n option -# isn't used, because if it is, we won't have actually checked out the -# source and we'd erroneously report that all of them need to be added. -# -if test "X${EXECUTE}" != "X:" -then - find . \( -name CVS -o -name Attic \) -prune -o -type d -print | - xargs --max-args=1 | - while read dir - do - if [ ! -d "$dir/CVS" ] - then - Command cvs add "$dir" - fi - done -fi - -# -# Use the Aegis meta-data to perform some CVS commands that CVS can't -# figure out for itself. -# -aegis -l cf -unf | sed 's| -> [0-9][0-9.]*||' | -while read usage action rev filename -do - if test "x$filename" = "x" - then - filename="$rev" - fi - case $action in - create) - Command cvs add $filename - ;; - remove) - Command rm -f $filename - Command cvs remove $filename - ;; - *) - ;; - esac -done - -# -# Extract the brief description. We'd like to do this using aesub -# or something, like so: -# -# message=`aesub '${version} - ${change description}'` -# -# but the expansion of ${change description} has a lame hard-coded max of -# 80 characters, so we have to do this by hand. (This has the slight -# benefit of preserving backslashes in front of any double-quotes in -# the text; that will have to be handled if we go back to using aesub.) -# -description=`aegis -ca -l | sed -n 's/brief_description = "\(.*\)";$/\1/p'` -version=`aesub '${version}'` -message="$version - $description" - -# -# Now commit all the changes. -# -Command cvs -q commit -m \"$message\" - -# -# All done. Clean up and go home. -# -cd $here -rm -rf ${TMP} -exit 0 diff --git a/bin/ae-svn-ci b/bin/ae-svn-ci deleted file mode 100755 index 301d890..0000000 --- a/bin/ae-svn-ci +++ /dev/null @@ -1,240 +0,0 @@ -# -# aegis - project change supervisor -# Copyright (C) 2004 Peter Miller; -# All rights reserved. -# -# As a specific exception to the GPL, you are allowed to copy -# this source file into your own project and modify it, without -# releasing your project under the GPL, unless there is some other -# file or condition which would require it. -# -# MANIFEST: shell script to commit changes to Subversion -# -# This script is expected to be run by the integrate_pass_notify_command -# and as such the baseline has already assumed the shape asked for by -# the change. -# -# integrate_pass_notify_command = -# "$bin/ae-svn-ci $project $change http://svn.site.com/svn/trunk --username svn_user"; -# -# Alternatively, you may wish to tailor this script to the individual -# needs of your project. Make it a source file, e.g. "etc/ae-svn-ci.sh" -# and then use the following: -# -# integrate_pass_notify_command = -# "$sh ${s etc/ae-svn-ci} $project $change http://svn.site.com/svn/trunk --username svn_user"; -# - -USAGE="Usage: $0 [-hnq] <project> <change> <url> [<co_options>]" - -PRINT="echo" -EXECUTE="eval" - -while getopts "hnq" FLAG -do - case ${FLAG} in - h ) - echo "${USAGE}" - exit 0 - ;; - n ) - EXECUTE=":" - ;; - q ) - PRINT=":" - ;; - * ) - echo "$0: unknown option ${FLAG}" >&2 - exit 1 - ;; - esac -done - -shift `expr ${OPTIND} - 1` - -case $# in -[012]) - echo "${USAGE}" 1>&2 - exit 1 - ;; -*) - project=$1 - change=$2 - svn_url=$3 - shift 3 - svn_co_flags=$* - ;; -esac - -here=`pwd` - -AEGIS_PROJECT=$project -export AEGIS_PROJECT -AEGIS_CHANGE=$change -export AEGIS_CHANGE - -module=`echo $project | sed 's|[.].*||'` - -baseline=`aegis -cd -bl` - -if test X${TMPDIR} = X; then TMPDIR=/var/tmp; fi - -TMP=${TMPDIR}/ae-svn-ci.$$ -mkdir ${TMP} -cd ${TMP} - -PWD=`pwd` -if test X${PWD} != X${TMP}; then - echo "$0: ended up in ${PWD}, not ${TMP}" >&2 - exit 1 -fi - -fail() -{ - set +x - cd $here - rm -rf ${TMP} - echo "FAILED" 1>&2 - exit 1 -} -trap "fail" 1 2 3 15 - -Command() -{ - ${PRINT} "$*" - ${EXECUTE} "$*" -} - -# -# Create a new Subversion work area. -# -# Note: this assumes the module is checked-out into a directory of the -# same name. Is there a way to ask Subversion where it is going to put a -# module, so we can always get the "cd" right? -# -${PRINT} svn co $svn_url $module $svn_co_flags -${EXECUTE} svn co $svn_url $module $svn_co_flags > LOG 2>&1 -if test $? -ne 0; then cat LOG; fail; fi -${EXECUTE} cd $module - -# -# Now we need to extract the sources from Aegis and drop them into the -# Subversion work area. There are two ways to do this. -# -# The first way is to use the generated tarball. -# This has the advantage that it has the Makefile.in file in it, and -# will work immediately. -# -# The second way is to use aetar, which will give exact sources, and -# omit all derived files. This will *not* include the Makefile.in, -# and so will not be readily compilable. -# -# gunzip < $baseline/export/${project}.tar.gz | tardy -rp ${project} | tar xf - -aetar -send -comp-alg=gzip -o - | tar xzf - - -# -# If any new directories have been created we will need to add them -# to Subversion before we can add the new files which we know are in them, -# or they would not have been created. Do this only if the -n option -# isn't used, because if it is, we won't have actually checked out the -# source and we'd erroneously report that all of them need to be added. -# -if test "X${EXECUTE}" != "X:" -then - find . -name .svn -prune -o -type d -print | - xargs --max-args=1 | - while read dir - do - if [ ! -d "$dir/.svn" ] - then - Command svn add -N "$dir" - fi - done -fi - -# -# Use the Aegis meta-data to perform some commands that Subversion can't -# figure out for itself. We use an inline "aer" report script to identify -# when a remove-create pair are actually due to a move. -# -aegis -rpt -nph -f - <<_EOF_ | -auto cs; -cs = project[project_name()].state.branch.change[change_number()]; - -columns({width = 1000;}); - -auto file, moved; -for (file in cs.src) -{ - if (file.move != "") - moved[file.move] = 1; -} - -auto action; -for (file in cs.src) -{ - if (file.action == "remove" && file.move != "") - action = "move"; - else - action = file.action; - /* - * Suppress printing of any files created as the result of a move. - * These are printed as the destination when printing the line for - * the file that was *removed* as a result of the move. - */ - if (action != "create" || ! moved[file.file_name]) - print(sprintf("%s %s \\"%s\\" \\"%s\\"", file.usage, action, file.file_name, file.move)); -} -_EOF_ -while read line -do - eval set -- "$line" - usage="$1" - action="$2" - srcfile="$3" - dstfile="$4" - case $action in - create) - Command svn add $srcfile - ;; - remove) - Command rm -f $srcfile - Command svn remove $srcfile - ;; - move) - Command mv $dstfile $dstfile.move - Command svn move $srcfile $dstfile - Command cp $dstfile.move $dstfile - Command rm -f $dstfile.move - ;; - *) - ;; - esac -done - -# -# Extract the brief description. We'd like to do this using aesub -# or something, like so: -# -# message=`aesub '${version} - ${change description}'` -# -# but the expansion of ${change description} has a lame hard-coded max of -# 80 characters, so we have to do this by hand. (This has the slight -# benefit of preserving backslashes in front of any double-quotes in -# the text; that will have to be handled if we go back to using aesub.) -# -description=`aegis -ca -l | sed -n 's/brief_description = "\(.*\)";$/\1/p'` -version=`aesub '${version}'` -message="$version - $description" - -# -# Now commit all the changes. -# -Command svn commit -m \"$message\" - -# -# All done. Clean up and go home. -# -cd $here -rm -rf ${TMP} -exit 0 diff --git a/bin/ae2cvs b/bin/ae2cvs deleted file mode 100644 index e7cb22b..0000000 --- a/bin/ae2cvs +++ /dev/null @@ -1,579 +0,0 @@ -#! /usr/bin/env perl - -$revision = "src/ae2cvs.pl 0.04.D001 2005/08/14 15:13:36 knight"; - -$copyright = "Copyright 2001, 2002, 2003, 2004, 2005 Steven Knight."; - -# -# All rights reserved. This program is free software; you can -# redistribute and/or modify under the same terms as Perl itself. -# - -use strict; -use File::Find; -use File::Spec; -use Pod::Usage (); - -use vars qw( @add_list @args @cleanup @copy_list @libraries - @mkdir_list @remove_list - %seen_dir - $ae_copy $aedir $aedist - $cnum $comment $commit $common $copyright - $cvs_command $cvsmod $cvsroot - $delta $description $exec $help $indent $infile - $proj $pwd $quiet $revision - $summary $usedir $usepath ); - -$aedist = 1; -$cvsroot = undef; -$exec = undef; -$indent = ""; - -sub version { - print "ae2cvs: $revision\n"; - print "$copyright\n"; - exit 0; -} - -{ - use Getopt::Long; - - Getopt::Long::Configure('no_ignore_case'); - - my $ret = GetOptions ( - "aedist" => sub { $aedist = 1 }, - "aegis" => sub { $aedist = 0 }, - "change=i" => \$cnum, - "d=s" => \$cvsroot, - "file=s" => \$infile, - "help|?" => \$help, - "library=s" => \@libraries, - "module=s" => \$cvsmod, - "noexecute" => sub { $exec = 0 }, - "project=s" => \$proj, - "quiet" => \$quiet, - "usedir=s" => \$usedir, - "v|version" => \&version, - "x|execute" => sub { $exec++ if ! defined $exec || $exec != 0 }, - "X|EXECUTE" => sub { $exec = 2 if ! defined $exec || $exec != 0 }, - ); - - Pod::Usage::pod2usage(-verbose => 0) if $help || ! $ret; - - $exec = 0 if ! defined $exec; -} - -$cvs_command = $cvsroot ? "cvs -d $cvsroot -Q" : "cvs -Q"; - -# -# Wrap up the $quiet logic in one place. -# -sub printit { - return if $quiet; - my $string = join('', @_); - $string =~ s/^/$indent/msg if $indent; - print $string; -} - -# -# Wrappers for executing various builtin Perl functions in -# accordance with the -n, -q and -x options. -# -sub execute { - my $cmd = shift; - printit "$cmd\n"; - if (! $exec) { - return 1; - } - ! system($cmd); -} - -sub _copy { - my ($source, $dest) = @_; - printit "cp $source $dest\n"; - if ($exec) { - use File::Copy; - copy($source, $dest); - } -} - -sub _chdir { - my $dir = shift; - printit "cd $dir\n"; - if ($exec) { - chdir($dir) || die "ae2cvs: could not chdir($dir): $!"; - } -} - -sub _mkdir { - my $dir = shift; - printit "mkdir $dir\n"; - if ($exec) { - mkdir($dir); - } -} - -# -# Put some input data through an external filter and capture the output. -# -sub filter { - my ($cmd, $input) = @_; - - use FileHandle; - use IPC::Open2; - - my $pid = open2(*READ, *WRITE, $cmd) || die "Cannot exec '$cmd': $!\n"; - print WRITE $input; - close(WRITE); - my $output = join('', <READ>); - close(READ); - return $output; -} - -# -# Parse a change description, in both 'aegis -l cd" and "aedist" formats. -# -# Returns an array containing the project name, the change number -# (if any), the delta number (if any), the SUMMARY, the DESCRIPTION -# and the lines describing the files in the change. -# -sub parse_change { - my $output = shift; - - my ($p, $c, $d, $c_or_d, $sum, $desc, $filesection, @flines); - - # The project name line comes after NAME in "aegis -l cd" format, - # and PROJECT in "aedist" format. In both cases, the project name - # and the change/delta name are separated a comma. - ($p = $output) =~ s/(?:NAME|PROJECT)\n([^\n]*)\n.*/$1/ms; - ($p, $c_or_d) = (split(/,/, $p)); - - # In "aegis -l cd" format, the project name actually comes after - # the string "Project" and is itself enclosed in double quotes. - $p =~ s/Project "([^"]*)"/$1/; - - # The change or delta string was the right-hand side of the comma. - # "aegis -l cd" format spells it "Change 123." or "Delta 123." while - # "aedist" format spells it "change 123." - if ($c_or_d =~ /\s*[Cc]hange (\d+).*/) { $c = $1 }; - if ($c_or_d =~ /\s*[Dd]elta (\d+).*/) { $d = $1 }; - - # The SUMMARY line is always followed the DESCRIPTION section. - # It seems to always be a single line, but we grab everything in - # between just in case. - ($sum = $output) =~ s/.*\nSUMMARY\n//ms; - $sum =~ s/\nDESCRIPTION\n.*//ms; - - # The DESCRIPTION section is followed ARCHITECTURE in "aegis -l cd" - # format and by CAUSE in "aedist" format. Explicitly under it if the - # string is only "none," which means they didn't supply a description. - ($desc = $output) =~ s/.*\nDESCRIPTION\n//ms; - $desc =~ s/\n(ARCHITECTURE|CAUSE)\n.*//ms; - chomp($desc); - if ($desc eq "none" || $desc eq "none\n") { $desc = undef } - - # The FILES section is followed by HISTORY in "aegis -l cd" format. - # It seems to be the last section in "aedist" format, but stripping - # a non-existent HISTORY section doesn't hurt. - ($filesection = $output) =~ s/.*\nFILES\n//ms; - $filesection =~ s/\nHISTORY\n.*//ms; - - @flines = split(/\n/, $filesection); - - ($p, $c, $d, $sum, $desc, \@flines) -} - -# -# -# -$pwd = Cwd::cwd(); - -# -# Fetch the file list either from our aedist input -# or directly from the project itself. -# -my @filelines; -if ($aedist) { - local ($/); - undef $/; - my $infile_redir = ""; - my $contents; - if (! $infile || $infile eq "-") { - $contents = join('', <STDIN>); - } else { - open(FILE, "<$infile") || die "Cannot open '$infile': $!\n"; - binmode(FILE); - $contents = join('', <FILE>); - close(FILE); - if (! File::Spec->file_name_is_absolute($infile)) { - $infile = File::Spec->catfile($pwd, $infile); - } - $infile_redir = " < $infile"; - } - - my $output = filter("aedist -l -unf", $contents); - my ($p, $c, $d, $s, $desc, $fl) = parse_change($output); - - $proj = $p if ! defined $proj; - $summary = $s; - $description = $desc; - @filelines = @$fl; - - if (! $exec) { - printit qq(MYTMP="/tmp/ae2cvs-ae.\$\$"\n), - qq(mkdir \$MYTMP\n), - qq(cd \$MYTMP\n); - printit q(perl -MMIME::Base64 -e 'undef $/; ($c = <>) =~ s/.*\n\n//ms; print decode_base64($c)'), - $infile_redir, - qq( | zcat), - qq( | cpio -i -d --quiet\n); - $aedir = '$MYTMP'; - push(@cleanup, $aedir); - } else { - $aedir = File::Spec->catfile(File::Spec->tmpdir, "ae2cvs-ae.$$"); - _mkdir($aedir); - push(@cleanup, $aedir); - _chdir($aedir); - - use MIME::Base64; - - $contents =~ s/.*\n\n//ms; - $contents = filter("zcat", decode_base64($contents)); - - open(CPIO, "|cpio -i -d --quiet"); - print CPIO $contents; - close(CPIO); - } - - $ae_copy = sub { - foreach my $dest (@_) { - my $source = File::Spec->catfile($aedir, "src", $dest); - execute(qq(cp $source $dest)); - } - } -} else { - $cnum = $ENV{AEGIS_CHANGE} if ! defined $cnum; - $proj = $ENV{AEGIS_PROJECT} if ! defined $proj; - - $common = "-lib " . join(" -lib ", @libraries) if @libraries; - $common = "$common -proj $proj" if $proj; - - my $output = `aegis -l cd $cnum -unf $common`; - my ($p, $c, $d, $s, $desc, $fl) = parse_change($output); - - $delta = $d; - $summary = $s; - $description = $desc; - @filelines = @$fl; - - if (! $delta) { - print STDERR "ae2cvs: No delta number, exiting.\n"; - exit 1; - } - - $ae_copy = sub { - execute(qq(aegis -cp -ind -delta $delta $common @_)); - } -} - -if (! $usedir) { - $usedir = File::Spec->catfile(File::Spec->tmpdir, "ae2cvs.$$"); - _mkdir($usedir); - push(@cleanup, $usedir); -} - -_chdir($usedir); - -$usepath = $usedir; -if (! File::Spec->file_name_is_absolute($usepath)) { - $usepath = File::Spec->catfile($pwd, $usepath); -} - -if (! -d File::Spec->catfile($usedir, "CVS")) { - $cvsmod = (split(/\./, $proj))[0] if ! defined $cvsmod; - - execute(qq($cvs_command co $cvsmod)); - - _chdir($cvsmod); - - $usepath = File::Spec->catfile($usepath, $cvsmod); -} - -# -# Figure out what we have to do to accomplish everything. -# -foreach (@filelines) { - my @arr = split(/\s+/, $_); - my $type = shift @arr; # source / test - my $act = shift @arr; # modify / create - my $file = pop @arr; - - if ($act eq "create" or $act eq "modify") { - # XXX Do we really only need to do this for - # ($act eq "create") files? - my (undef, $dirs, undef) = File::Spec->splitpath($file); - my $absdir = $usepath; - my $reldir; - my $d; - foreach $d (File::Spec->splitdir($dirs)) { - next if ! $d; - $absdir = File::Spec->catdir($absdir, $d); - $reldir = $reldir ? File::Spec->catdir($reldir, $d) : $d; - if (! -d $absdir && ! $seen_dir{$reldir}) { - $seen_dir{$reldir} = 1; - push(@mkdir_list, $reldir); - } - } - - push(@copy_list, $file); - - if ($act eq "create") { - push(@add_list, $file); - } - } elsif ($act eq "remove") { - push(@remove_list, $file); - } else { - print STDERR "Unsure how to '$act' the '$file' file.\n"; - } -} - -# Now go through and mkdir() the directories, -# adding them to the CVS tree as we do. -if (@mkdir_list) { - if (! $exec) { - printit qq(# The following "mkdir" and "cvs -Q add" calls are not\n), - qq(# necessary for any directories that already exist in the\n), - qq(# CVS tree but which aren't present locally.\n); - } - foreach (@mkdir_list) { - if (! $exec) { - printit qq(if test ! -d $_; then\n); - $indent = " "; - } - _mkdir($_); - execute(qq($cvs_command add $_)); - if (! $exec) { - $indent = ""; - printit qq(fi\n); - } - } - if (! $exec) { - printit qq(# End of directory creation.\n); - } -} - -# Copy in any files in the change, before we try to "cvs add" them. -$ae_copy->(@copy_list) if @copy_list; - -if (@add_list) { - execute(qq($cvs_command add @add_list)); -} - -if (@remove_list) { - execute(qq(rm -f @remove_list)); - execute(qq($cvs_command remove @remove_list)); -} - -# Last, commit the whole bunch. -$comment = $summary; -$comment .= "\n" . $description if $description; -$commit = qq($cvs_command commit -m '$comment' .); -if ($exec == 1) { - printit qq(# Execute the following to commit the changes:\n), - qq(# $commit\n); -} else { - execute($commit); -} - -_chdir($pwd); - -# -# Directory cleanup. -# -sub END { - my $dir; - foreach $dir (@cleanup) { - printit "rm -rf $dir\n"; - if ($exec) { - finddepth(sub { - # print STDERR "unlink($_)\n" if (!-d $_); - # print STDERR "rmdir($_)\n" if (-d $_ && $_ ne "."); - unlink($_) if (!-d $_); - rmdir($_) if (-d $_ && $_ ne "."); - 1; - }, $dir); - rmdir($dir) || print STDERR "Could not remove $dir: $!\n"; - } - } -} - -__END__; - -=head1 NAME - -ae2cvs - convert an Aegis change set to CVS commands - -=head1 SYNOPSIS - -ae2cvs [-aedist|-aegis] [-c change] [-d cvs_root] [-f file] [-l lib] - [-m module] [-n] [-p proj] [-q] [-u dir] [-v] [-x] [-X] - - -aedist use aedist format from input (default) - -aegis query aegis repository directly - -c change change number - -d cvs_root CVS root directory - -f file read aedist from file ('-' == stdin) - -l lib Aegis library directory - -m module CVS module - -n no execute - -p proj project name - -q quiet, don't print commands - -u dir use dir for CVS checkin - -v print version string and exit - -x execute the commands, but don't commit; - two or more -x options commit changes - -X execute the commands and commit changes - -=head1 DESCRIPTION - -The C<ae2cvs> utility can convert an Aegis change into a set of CVS (and -other) commands to make the corresponding change(s) to a carbon-copy CVS -repository. This can be used to keep a front-end CVS repository in sync -with changes made to an Aegis project, either manually or automatically -using the C<integrate_pass_notify_command> attribute of the Aegis -project. - -By default, C<ae2cvs> makes no changes to any software, and only prints -out the necessary commands. These commands can be examined first for -safety, and then fed to any Bourne shell variant (sh, ksh, or bash) to -make the actual CVS changes. - -An option exists to have C<ae2cvs> execute the commands directly. - -=head1 OPTIONS - -The C<ae2cvs> utility supports the following options: - -=over 4 - -=item -aedist - -Reads an aedist change set. -By default, the change set is read from standard input, -or a file specified with the C<-f> option. - -=item -aegis - -Reads the change directly from the Aegis repository -by executing the proper C<aegis> commands. - -=item -c change - -Specify the Aegis change number to be used. -The value of the C<AEGIS_CHANGE> environment variable -is used by default. - -=item -d cvsroot - -Specify the CVS root directory to be used. -This option is passed explicitly to each executed C<cvs> command. -The default behavior is to omit any C<-d> options -and let the executed C<cvs> commands use the -C<CVSROOT> environment variable as they normally would. - -=item -f file - -Reads the aedist change set from the specified C<file>, -or from standard input if C<file> is C<'-'>. - -=item -l lib - -Specifies an Aegis library directory to be searched for global states -files and user state files. - -=item -m module - -Specifies the name of the CVS module to be brought up-to-date. -The default is to use the Aegis project name, -minus any branch numbers; -for example, given an Aegis project name of C<foo-cmd.0.1>, -the default CVS module name is C<foo-cmd>. - -=item -n - -No execute. Commands are printed (including a command for a final -commit of changes), but not executed. This is the default. - -=item -p proj - -Specifies the name of the Aegis project from which this change is taken. -The value of the C<AEGIS_PROJECT> environment variable -is used by default. - -=item -q - -Quiet. Commands are not printed. - -=item -u dir - -Use the already checked-out CVS tree that exists at C<dir> -for the checkins and commits. -The default is to use a separately-created temporary directory. - -=item -v - -Print the version string and exit. - -=item -x - -Execute the commands to bring the CVS repository up to date, -except for the final commit of the changes. Two or more -C<-x> options will cause the change to be committed. - -=item -X - -Execute the commands to bring the CVS repository up to date, -including the final commit of the changes. - -=back - -=head1 ENVIRONMENT VARIABLES - -=over 4 - -=item AE2CVS_FLAGS - -Specifies any options to be used to initialize -the C<ae2cvs> utility. -Options on the command line override these values. - -=back - -=head1 AUTHOR - -Steven Knight (knight at baldmt dot com) - -=head1 BUGS - -If errors occur during the execution of the Aegis or CVS commands, and -the -X option is used, a partial change (consisting of those files for -which the command(s) succeeded) will be committed. It would be safer to -generate code to detect the error and print a warning. - -When a file has been deleted in Aegis, the standard whiteout file can -cause a regex failure in this script. It doesn't necessarily happen all -the time, though, so this needs more investigation. - -=head1 TODO - -Add an explicit test for using ae2cvs in the Aegis -integrate_pass_notify_command field to support fully keeping a -repository in sync automatically. - -=head1 COPYRIGHT - -Copyright 2001, 2002, 2003, 2004, 2005 Steven Knight. - -=head1 SEE ALSO - -aegis(1), cvs(1) |