190 lines
4.8 KiB
Bash
Executable File
190 lines
4.8 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# update-cttree.sh
|
|
#
|
|
# Usage:
|
|
#
|
|
# update-cttree.sh [opts] hostname
|
|
#
|
|
# Uses rsh and rdist to update the indicated host with a fresh copy of the
|
|
# current project tree.
|
|
#
|
|
# This script must be executed from within a project tree.
|
|
#
|
|
# Options:
|
|
#
|
|
# -u username Specify the login name on the remote host.
|
|
#
|
|
# -d dir Specify the player install dir on the remote host. This
|
|
# the directory above the project-tree-specific directory
|
|
# like 'panda' or 'tool'. The default is 'player'.
|
|
#
|
|
# -t Touch the build-request timestamp file after updating.
|
|
# This assumes there's a cron job running on the remote
|
|
# machine checking the date on this file from time to time.
|
|
#
|
|
# -f Assume the user knows what he/she is doing, and don't bother
|
|
# to check that there are no files checked out in the vobs
|
|
# before releasing. This can save considerable time when the
|
|
# system is extremely slow; however, it can be dangerous
|
|
# to accidentally release a checked-out file (because the
|
|
# file will then be write-access on the remote host, and
|
|
# neartool will not be able to track local changes made to it.)
|
|
#
|
|
#ENDCOMMENT
|
|
|
|
username=`whoami`
|
|
dirname=player
|
|
touch_request=
|
|
cocky_user=
|
|
|
|
while getopts "u:d:tfh" flag; do
|
|
case $flag in
|
|
u) username=$OPTARG;;
|
|
d) dirname=$OPTARG;;
|
|
t) touch_request=y;;
|
|
f) cocky_user=y;;
|
|
h) sed '/#ENDCOMMENT/,$d' <$0 >&2
|
|
exit 1;;
|
|
\?) exit 1;
|
|
esac
|
|
done
|
|
|
|
shift `expr $OPTIND - 1`
|
|
remote_host=$1
|
|
projroot=`ctproj -r`
|
|
|
|
if [ -z "$projroot" ]; then
|
|
echo ""
|
|
echo "You must execute this script in a project tree."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$remote_host" ]; then
|
|
echo ""
|
|
echo "You must specify a remote hostname. -h for help."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d /usr/atria ]; then
|
|
echo ""
|
|
echo "This script is intended to be run on an actual ClearCase vobs."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
|
|
projname=`basename $projroot`
|
|
projtop=`dirname $projroot`
|
|
|
|
if [ "$projname" = "tool" ]; then
|
|
echo ""
|
|
echo "This script should not be used on the tool tree."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
|
|
outfile=/tmp/uc.$username.$projname.$remote_host.out
|
|
errfile=/tmp/uc.$username.$projname.$remote_host.err
|
|
rm -f $outfile $errfile
|
|
|
|
# Check to make sure we can run rsh to the remote machine, and that
|
|
# the remote machine doesn't have anything checked out.
|
|
|
|
if rsh $remote_host -l $username "cd $dirname; find $projname -name .ct0.\* -print" >$outfile 2>$errfile; then
|
|
if [ ! -f $outfile ]; then
|
|
echo ""
|
|
echo "Error in processing; unable to generate $outfile."
|
|
echo ""
|
|
rm -f $outfile $errfile
|
|
exit 1
|
|
fi
|
|
if [ ! -f $errfile ]; then
|
|
echo ""
|
|
echo "Error in processing; unable to generate $errfile."
|
|
echo ""
|
|
rm -f $outfile $errfile
|
|
exit 1
|
|
fi
|
|
if [ -s $errfile ]; then
|
|
echo ""
|
|
echo "Unable to scan project tree $dirname/$projname on $remote_host."
|
|
echo ""
|
|
rm -f $outfile $errfile
|
|
exit 1
|
|
fi
|
|
if [ -s $outfile ]; then
|
|
echo ""
|
|
echo "Cannot update $remote_host; files still checked out on remote:"
|
|
sed 's/^/ /;s/\.ct0\.//' $outfile
|
|
rm -f $outfile $errfile
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
else
|
|
echo ""
|
|
echo "Cannot rsh to $remote_host as $username."
|
|
echo ""
|
|
rm -f $outfile $errfile
|
|
exit 1
|
|
fi
|
|
|
|
# Check to make sure the local machine doesn't have anything checked out.
|
|
if [ -z "$cocky_user" ]; then
|
|
cd $projroot
|
|
cleartool lsco -s -me -recurse >$outfile
|
|
if [ -s $outfile ]; then
|
|
echo ""
|
|
echo "Cannot update from "`hostname`"; files still checked out in vobs:"
|
|
sed 's/^/ /;s/\.ct0\.//' $outfile
|
|
rm -f $outfile $errfile
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
rm -f $outfile $errfile
|
|
|
|
|
|
#
|
|
# Get the complete list of files in the tree we need to update.
|
|
#
|
|
cd $projtop
|
|
filelist=${outfile}.files
|
|
rm -f $filelist
|
|
cleartool find $projname -nxn -print | grep -v '/lost+found' > $filelist
|
|
|
|
#
|
|
# Now build up a number of rdist files, as needed, to update these files.
|
|
# We have to do this in stages because there seems to be a limit of about
|
|
# 2000 files in one rdist file.
|
|
#
|
|
numlines=`wc -l $filelist | awk '{ print $1 }'`
|
|
echo $projname contains $numlines files.
|
|
|
|
startline=1
|
|
while [ $startline -le $numlines ]; do
|
|
echo "FILES = (" >> $outfile
|
|
tail +$startline $filelist | head -2000 >> $outfile
|
|
echo ")" >> $outfile
|
|
|
|
echo '${FILES} -> '$username@$remote_host >>$outfile
|
|
echo " install $dirname;" >> $outfile
|
|
|
|
if [ $touch_request ]; then
|
|
echo " cmdspecial \"touch $dirname/$projname/build-request\" ;" >>$outfile
|
|
fi
|
|
|
|
if rdist -onochkowner,nochkgroup,numchkgroup,whole,nodescend -f $outfile; then
|
|
rm -f $outfile
|
|
else
|
|
echo "Error in rdist."
|
|
rm -f $outfile $filelist $errfile
|
|
exit 1
|
|
fi
|
|
startline=`expr $startline + 2000`
|
|
done
|
|
|
|
rm -f $filelist $errfile
|