1
0
Files
irix-657m-src/eoe/cmd/pcp/tools/p_force
2022-09-29 17:59:04 +03:00

350 lines
7.7 KiB
Bash
Executable File

#!/bin/sh
#
# p_force local_census remote signature
#
# remote_signature is assumed to have been created by p_signature
# from the census file on the remote system
#
# $Id: p_force,v 1.11 1997/12/19 03:13:31 markgw Exp $
#
tmp=/var/tmp/$$
status=1
trap "cd /; rm -rf $tmp.* $tmp; exit \$status" 0 1 2 3 15
MSG="rv: kenmcd@engr pv: 484961 - sync up common source from pcp to kudzu isms"
# needed to make ptools (and in particular p_tupdate -o) behave in the
# presence of possible file name clashes in /var/tmp
#
rm -rf $tmp
mkdir $tmp
if [ ! -d $tmp ]
then
echo "Warning: failed to make private temporary directory \"$tmp\", reverting to the default"
else
TMPDIR=$tmp
export TMPDIR
fi
# set MAGIC in the environment to turn on -x tracing for hard to
# debug problems in this script
#
[ ! -z "${MAGIC+x}" ] && set -x
_ans()
{
if $default_ans
then
ans=""
echo ""
else
read ans </dev/tty
fi
}
_usage()
{
echo "Usage: p_force [options] local_census remote_signature"
echo "Options:"
echo " -d automatically take default responses to all questions"
echo " -N show me, don't change anything"
echo " -V more verbose output"
}
# would not be necessary if they had a useful exit status!
_check_ptools()
{
if grep ERROR $1 >/dev/null 2>&1
then
echo "Error: you must fix the ptools failure and try again"
exit
fi
}
# serious error, give user chance to abort or continue
_err()
{
echo "Skip this file (s), or abort p_force (a)? [s] \c"
_ans
case "$ans"
in
""|s)
;;
*)
exit
;;
esac
}
_p_signature()
{
# ignore the rcs ident strings, they are often wrong!
# use the checksum to see if the source we have here is the same
# as expected ... note, use the same rcs ident dodging scheme
# dodge non-ascii files as special case bullets
# ... all of this has to match p_signature
case $1
in
*.rgb|*.gif|*.jpg|*.sc|*.0|*.index|*.meta|*.pag|*.dir)
chk=`sum <$1`
;;
*)
if [ `(cat $1;echo "") | wc -c | sed -e 's/ //g'` = `(cat $1;echo "") | sed -n p | wc -c | sed -e 's/ //g'` ]
then
chk=`(cat $1;echo "") \
| sed \
-e '/\$Id/d' \
-e '/\$Header/d' \
-e '/\$Revision/d' \
| sum`
else
chk=`sum <$1`
fi
;;
esac
}
_grind()
{
rev=`p_tupdate -o $1 2>&1 | tee $tmp.tmp | nawk '{print $NF}'`
if [ -z "$rev" ]
then
echo "Error: failed to extract revision from \"p_tupdate -o $1\"" >$tmp.err
cat $tmp.tmp >>$tmp.err
echo failed
exit
fi
if [ -f ${1}${rev} ]
then
_p_signature ${1}${rev}
rm -f ${1}${rev}
if [ "$chk" = "$2 $3" ]
then
echo "same"
return
fi
else
echo "Error: failed to checkout file from \"p_tupdate -o $1\"" >$tmp.err
echo " or bogus revision \"$rev\"" >>$tmp.err
cat $tmp.tmp >>$tmp.err
echo failed
exit
fi
echo "different"
}
ECHO=":"
FINAL="p_finalize"
INTEG="p_integrate"
STATE="p_state"
UNMOD="p_unmodify"
UNINTEG="p_unintegrate"
TUPDATE="p_tupdate"
EXIT_ERR="_err"
BUGMAIL=true
default_ans=false
while getopts 'dNV?' c
do
case $c
in
d) # take defaults
default_ans=true
;;
N) # show-me
FINAL="echo + p_finalize"
INTEG="echo + p_integrate"
UNMOD="echo + p_unmodify"
UNINTEG="echo + p_unintegrate"
TUPDATE="echo + p_tupdate"
EXIT_ERR="echo + _err"
BUGMAIL=false
;;
V) # verbose
ECHO="echo"
;;
\?) _usage
exit
;;
esac
done
shift `expr $OPTIND - 1`
if [ $# -ne 2 ]
then
_usage
exit
fi
if [ ! -f $1 ]
then
echo "p_force: cannot open local_census \"$1\""
exit
fi
if [ ! -f $2 ]
then
echo "p_force: cannot open remote_signature \"$2\""
exit
fi
# Note: skip FORMAT and non-PCP lines
#
sed -n <$1 \
-e '/^FORMAT/d' \
-e 's/|.*//' \
-e 's/%.*%/ /' \
-e '/eoe\/cmd\/pcp\/pmdas\/irix/{
/root_irix/p
d
}' \
-e '/eoe\/cmd\/pcp/p' \
-e '/eoe\/lib\/libpcp/p' \
-e '/eoe\/lib\/libpcp_dev/p' \
-e '/eoe\/lib\/libpcp_pmda/p' \
-e '/eoe\/man\/man1/p' \
-e '/eoe\/man\/man4/p' \
-e '/eoe\/man\/man5/p' \
| sort -u > $tmp.old
# go to base of the kudzu tree
#
cd $WORKAREA
HOME=`pwd`
echo "=== relocate to $HOME ==="
if $BUGMAIL
then
echo "+" >>$WORKAREA/final.$USER
echo "+PARTIAL TAKE 484961 - reconcile differences between kudzu and pcp isms" >>$WORKAREA/final.$USER
echo "+`date`" >>$WORKAREA/final.$USER
eval `sed -e 's/[ ]*:[ ]*/ : /' $WORKAREA/.workarea | awk '
/^workarea.sm_machine/ { host=$3; next }
/^workarea.sm_location/ { loc=$3; next }
END { print "where=" host ":" loc }'`
echo "+The following file(s) were checked into $where" >>$WORKAREA/final.$USER
echo "+to sync up this source tree with the remote PCP source tree" >>$WORKAREA/final.$USER
echo "+" >>$WORKAREA/final.$USER
echo '+! vi(1) instructions to cleanup take mail' >>$WORKAREA/final.$USER
echo '+! :1,/vi(1)/' >>$WORKAREA/final.$USER
echo '+! :.,$v/^+/d' >>$WORKAREA/final.$USER
echo '+! :1,$s/^+//' >>$WORKAREA/final.$USER
echo '+! :g/^!/d' >>$WORKAREA/final.$USER
fi
join -a1 -a2 -e \# -o 1.1,2.1,1.2,2.2,2.3,2.4 $tmp.old $2 \
| while read f_old f_new v_old v_new chk_1 chk_2
do
$ECHO $f_old $f_new $v_old $v_new $chk_1 $chk_2
if [ "$f_new" = "#" ]
then
# normally do not care about this
$ECHO "$f_old: Warning: file missing, needs p_remove or p_source_tree_remove?"
else
if [ ! -f $f_new ]
then
# this is fatal
echo "$f_new: Error: file expected, and not here"
$EXIT_ERR
continue
fi
_p_signature $f_new
if [ "$chk" != "$chk_1 $chk_2" ]
then
# this is fatal
echo "$f_new: Error: checksum here [$chk], expected [$chk_1 $chk_2]"
$EXIT_ERR
continue
fi
if [ "$f_old" = "#" ]
then
grind=`_grind $f_new $chk_1 $chk_2`
if [ "$grind" = same ]
then
echo "$f_new: same as t-o-t, skip new"
$UNINTEG $f_old >/dev/null 2>&1
$UNMOD $f_old >/dev/null 2>&1
$TUPDATE $f_old
continue
elif [ "$grind" = failed ]
then
echo "$f_new: catastrophe ... abandon this one"
cat $tmp.err
rm -f $tmp.err
continue
fi
echo "$f_new: new $v_new"
# no text as description for new files
$FINAL -B -m "Dummy first version" $f_new 2>&1 | tee $tmp.out
_check_ptools $tmp.out
if [ "$v_new" != "1.1" ]
then
# initial version is not 1.1, so force version to right value
$INTEG -E $f_new 2>&1 | tee $tmp.out
_check_ptools $tmp.out
$FINAL -B -m "$MSG" -r$v_new $f_new 2>&1 | tee $tmp.out
_check_ptools $tmp.out
$BUGMAIL && echo "+ $f_new - $v_new" >>$WORKAREA/final.$USER
else
$BUGMAIL && echo "+ $f_new - 1.1" >>$WORKAREA/final.$USER
fi
elif [ "$v_new" != "$v_old" ]
then
if `echo "$v_new" "$v_old" \
| sed -e 's/\./ /g' \
| awk '{ if (0+$1 > 0+$3 || (0+$1 == 0+$3 && 0+$2 > 0+$4)) exit(1) }'`
then
# this is fatal
echo "$f_old: Error: version regressed from $v_old to $v_new!"
$EXIT_ERR
continue
else
grind=`_grind $f_new $chk_1 $chk_2`
if [ "$grind" = same ]
then
echo "$f_old: same as t-o-t, skip update $v_new"
$UNINTEG $f_old >/dev/null 2>&1
$UNMOD $f_old >/dev/null 2>&1
$TUPDATE $f_old
continue
elif [ "$grind" = failed ]
then
echo "$f_old: catastrophe ... abandon this one"
cat $tmp.err
rm -f $tmp.err
continue
fi
echo "$f_old: update $v_new"
case `p_state $f_old`
in
*"trunk state"*)
$INTEG -O -E $f_new 2>&1 | tee $tmp.out
_check_ptools $tmp.out
;;
*"modified state"*)
$INTEG -O $f_new 2>&1 | tee $tmp.out
_check_ptools $tmp.out
;;
esac
$FINAL -B -m "$MSG" -r$v_new $f_new 2>&1 | tee $tmp.out
_check_ptools $tmp.out
$BUGMAIL && echo "+ $f_new - $v_new" >>$WORKAREA/final.$USER
fi
else
# wish more of them were like this ...
$ECHO "$f_old: no change"
fi
fi
done
$BUGMAIL && echo "+ -$MSG" >>$WORKAREA/final.$USER
status=0
exit