#! /bin/sh
SHELL=/bin/sh ; export SHELL
case $0 in
/*) sanprog=$0 ;;
*/*)
sanprog=$0
sandir=`dirname $sanprog`
sandir=`(cd $sandir; pwd)`
sanprog=$sandir/`basename $sanprog`
;;
*) sanprog=$0 ;;
esac
workdir=/tmp
cleaned=${workdir}/$$San.clean
keepers=${workdir}/$$San.keep
losers=${workdir}/$$San.lose
sandd=${workdir}/$$San.temp
sanStatus=1
trap 'rm -f ${cleaned} ${keepers} ${sandd} ${losers} ; exit $sanStatus' 0
if [ ! -f .Sanitize ] ; then
echo '***' No .Sanitize file in `pwd`! 1>&2
exit 1
else
true
fi
if ( egrep '^Things-to-lose:$' < .Sanitize > /dev/null ) ; then
losingthings=true
else
losingthings=
fi
if [ -n "${losingthings}" ] ; then
egrep '^Do-first:$|^Things-to-keep:$|^Things-to-lose:|^Do-last:$' < .Sanitize > ${sandd}
diff ${sandd} - <<EOF
Do-first:
Things-to-keep:
Things-to-lose:
Do-last:
EOF
else
egrep '^Do-first:$|^Things-to-keep:$|^Do-last:$' < .Sanitize > ${sandd}
diff ${sandd} - <<EOF
Do-first:
Things-to-keep:
Do-last:
EOF
fi
if [ "$?" != "0" ] ; then
echo '***' ${sanprog}: Some required trigger lines are missing 1>&2
echo '***' or out-of-order in `pwd`/.Sanitize 1>&2
exit 1
else
true
fi
set -e
if ( echo $* | egrep verbose > /dev/null ) ; then
verbose=true
else
verbose=
fi
no_action=
for opt in $*
do
case $opt in
-n)
no_action=true
;;
*)
;;
esac
done
THISDIR=`pwd`
egrep -v "^#" < .Sanitize | sed -e '/^$/d' > ${cleaned}
sed -e '/^Things\-to\-keep:$/,$d' -e '1d' ${cleaned} > ${sandd}
if [ -s ${sandd} ] ; then
if [ -n "${no_action}" ] ; then
echo ". ${sandd} $*"
else
. ${sandd} $*
fi
else
if [ -n "${verbose}" ] ; then
echo "No \`Do-first' fragment to execute."
else
true
fi
fi
sed -e '1,/^Things\-to\-keep:$/d' ${cleaned} > ${sandd}
if [ -n "${losingthings}" ] ; then
sed -e '/^Things\-to\-lose:$/,$d' ${sandd} > ${keepers}
else
sed -e '/^Do-last:$/,$d' ${sandd} > ${keepers}
fi
if [ -n "${keep_these_too}" ] ; then
for i in ${keep_these_too} ; do
if [ -n "${verbose}" ] ; then
echo Keeping $i
else
true
fi
echo $i >> ${keepers}
done
else
true
fi
if [ -n "${losingthings}" ] ; then
sed -e '1,/^Things\-to\-lose:$/d' \
-e '/^Do\-last:$/,$d' ${cleaned} \
> ${losers}
else
cat /dev/null > ${losers}
fi
if [ -n "${lose_these_too}" ] ; then
for i in ${lose_these_too} ; do
if [ -n "${verbose}" ] ; then
echo Losing $i
else
true
fi
echo $i >> ${losers}
done
else
true
fi
if ( echo $* | egrep recover > /dev/null ) ; then
if [ -d .Recover ] ; then
cd .Recover
replace=`ls -a | egrep -v '^\.$|^\.\.$'`
if [ -n "${no_action}" ] ; then
echo "cd .Recover"
echo "mv ${replace} .."
echo "cd .."
cd .. echo "rmdir .Recover"
else
if [ -n "${verbose}" ] ; then
echo Replacing ${replace}
fi
mv ${replace} ..
cd ..
rmdir .Recover
fi
else
true
fi
for i in `egrep -v CVS ${keepers} | egrep -v \\.Recover` ; do
if [ -d "$i" ] ; then
if [ -n "${no_action}" ] ; then
echo "cd $i"
else
if [ -n "${verbose}" ] ; then
echo Running ${sanprog} on ${THISDIR}/$i
else
true
fi
fi
(cd $i ; ${sanprog} $*) | sed 's/^/ /'
else
true
fi
done
sanStatus=0
exit 0
else
if ( echo $* | egrep test > /dev/null ) ; then
echo CVS >> ${keepers}
echo .Sanitize >> ${keepers}
echo .Recover >> ${keepers}
if [ -n "${no_action}" ] ; then
echo "mkdir .Recover"
else
if [ -n "${verbose}" ] ; then
echo Keeping CVS, .Sanitize, .cvsignore, and .Recover
echo Creating ${THISDIR}/.Recover to hold unclean files...
else
true
fi
mkdir .Recover
fi
safe=safe
else
if [ -n "${verbose}" ] ; then
echo Losing .Sanitize
else
true
fi
echo .Sanitize >> ${losers}
if ( echo $* | egrep keep-cvs > /dev/null ) ; then
if [ -n "${verbose}" ] ; then
echo Keeping CVS else
true
fi
echo CVS >> ${keepers}
else
if [ -n "${verbose}" ] ; then
echo Losing CVS else
true
fi
echo CVS >> ${losers}
fi
fi
fi
tolose=`sed -e 's/[ ]*$//' ${losers}`
if [ -n "${tolose}" ] ; then
for i in ${tolose} ; do
if [ -f $i -o -d $i ]; then
if [ -n "${safe}" ] ; then
if [ -n "${no_action}" ] ; then
echo "mv $i .Recover"
else
if [ -n "${verbose}" ] ; then
echo Caching $i in .Recover...
else
true
fi
mv $i .Recover
fi
else
if [ -n "${no_action}" ] ; then
echo "rm -rf $i"
else
if [ -n "${verbose}" ] ; then
echo Removing ${THISDIR}/$i
else
true
fi
rm -rf $i
fi
fi
else
echo '***' "Can't" remove expected file/directory ${THISDIR}/$i - not found. 1>&2
fi
done
else
true
fi
tolose=`(ls -a | egrep -v '^\.$|^\.\.$' ; \
sed -e 's/[ ]*$//' ${keepers}) | sort | uniq -u`
if [ -n "${tolose}" ] ; then
for i in ${tolose} ; do
if [ -f $i -o -d $i ]; then
if [ -n "${safe}" ] ; then
if [ -n "${no_action}" ] ; then
echo "mv $i .Recover"
else
echo '***' Caching unexpected file ${THISDIR}/$i in .Recover... 1>&2
mv $i .Recover
fi
else
if [ -n "${no_action}" ] ; then
echo "rm -rf $i"
else
echo '***' Removing unexpected file ${THISDIR}/$i 1>&2
rm -rf $i
fi
fi
else
echo '***' "Can't" keep expected file ${THISDIR}/$i - not found. 1>&2
fi
done
else
true
fi
for i in `egrep -v CVS ${keepers} | egrep -v \\.Recover` ; do
if [ -d $i ] ; then
if [ -n "${no_action}" ] ; then
echo "cd $i"
else
if [ -n "${verbose}" ] ; then
echo Running ${sanprog} on ${THISDIR}/$i
else
true
fi
fi
(cd $i ; ${sanprog} $*) | sed 's/^/ /'
else
true
fi
done
sed -e '1,/^Do\-last:$/d' ${cleaned} > ${sandd}
if [ -s ${sandd} ] ; then
if [ -n "${no_action}" ] ; then
echo ". ${sandd} $*"
else
. ${sandd} $*
fi
else
if [ -n "${verbose}" ] ; then
echo "No \`Do-last' fragment to execute."
else
true
fi
fi
if ( echo $* | egrep test > /dev/null ) ; then
if [ -n "${safe}" -a "`cd .Recover ; (echo empty ; ls -a) | \
egrep -v '^\.$|^\.\.$'`" = "empty" ] ; then
if [ -n "${no_action}" ] ; then
echo "rmdir .Recover"
else
if [ -n "${verbose}" ] ; then
echo Removing .Recover. It was not needed.
else
true
fi
rmdir .Recover
fi
fi
fi
sanStatus=0