Subject: Re: Updating /etc after upgrade
To: Frederick Bruckman <fb@enteract.com>
From: Johan Danielsson <joda@pdc.kth.se>
List: current-users
Date: 08/10/2000 23:29:34
Frederick Bruckman <fb@enteract.com> writes:

> "diff -r -u /etc.old /etc | less". No, sorry. :-P

I keep a copy of the unmodified etc-files, and then use this script to
merge any changes I've made. Works quite well for me.

/Johan

#! /bin/sh
BASE=base-files
EVAL=echo
VERBOSE=echo

add_file () {
	eval "$1=\"\$$1 $2\""
}

unchanged=""
updated=""
needs_merge=""
binary=""
removed=""
needs_remove=""
locally_removed=""
for i in `find . -type f | sed -e 's/.\///'`; do
	if cmp -s $i /etc/$i; then
		add_file unchanged "$i"
		continue
	fi
	if [ -f /etc/$BASE/$i ]; then
		if [ -f /etc/$i ]; then
			diff3 -m /etc/$i /etc/$BASE/$i $i > /tmp/out.$$ 2> /dev/null
			case "$?" in
			0)
				add_file updated "$i"
				$VERBOSE "merging $i"
				$EVAL "cp /tmp/out.$$ /etc/$i"
				;;
			1)	
				add_file needs_merge "$i"
				$VERBOSE "update $i manually"
				$EVAL "cp /tmp/out.$$ /etc/$i.merge"
				;;
			2)	
				add_file binary "$i"
				$VERBOSE "failed to merge $i"
				;;
			esac
		else
			add_file locally_removed "$i"
			$VERBOSE "$i is removed"
		fi
	else
		if [ -f /etc/$i ]; then
			add_file needs_merge "$i"
			$VERBOSE "update $i manually"
			$EVAL "cp -p $i /etc/$i.merge"
		else
			add_file updated "$i"
			$EVAL "cp -p $i /etc/$i"
		fi
	fi
done
NEW=`pwd`
cd /etc/$BASE
for i in `find . -type f | sed -e 's/.\///'`; do 
	if [ ! -f $NEW/$i ]; then
		if [ -f /etc/$i ]; then
			if cmp -s $i /etc/$i; then
				add_file removed "$i"
				$VERBOSE "removing $i"
				$EVAL "rm -f /etc/$i"
			else
				add_file needs_remove "$i"
				$VERBOSE "removed file $i is modified"
			fi
		fi
	fi
done

echo "The following files have been successfully updated:"
for i in $updated; do
	echo "  $i"
done | sort
echo "The following obsolete files have been removed:"
for i in $removed; do
	echo "  $i"
done | sort
echo "These files needs to be manually updated:"
for i in $needs_merge $binary; do
	echo "  $i"
done | sort
echo "These files have been locally removed:"
for i in $locally_removed; do
	echo "  $i"
done | sort
echo "These obsolete files have been modified:"
for i in $needs_remove; do
	echo "  $i"
done | sort