#! /bin/sh -

prefix=/usr
exec_prefix=/usr
bindir=/usr/bin
trackfs=$bindir/trackfs

usage() {
	echo >&2 "usage: $0 [-o <restore-file>] [--] command [arg ...]"
	exit 1
}

rstpkg=restore.sh
while true; do
	case $1 in
		--) shift; break;;
		-o) test -n "$2" || usage; rstpkg=$2; shift; shift;;
		-o*) rstpkg=${1#-o}; shift;;
		-*) usage;;
		*) break;;
	esac
done
test -n "$1" || usage

set -C
exec 3> "$rstpkg" || exit 1
set +C

tmp=$(mktemp -d) || exit 1
trap "rm -rf '$tmp'" 0
backup=$tmp/backup.cpio
chglog=$tmp/changed.log

$trackfs -b "$backup" -l "$chglog" -- "$@"; status=$?

cat << EOF >&3
#! /bin/sh -
exec 3< "\$0"
debug=\${debug+echo}
tmp=\$(mktemp -d) || exit 1
trap "rm -rf '\$tmp'" 0
cd "\$tmp" || exit 1
ldconfig=false
dlist=
c() {
	if test -f "\$1" || test -L "\$1"
	then \$debug rm -f "\$1"
	elif test -d "\$1"
	then dlist="\$1
\$dlist"
	fi
}
d() {
	\$debug mv -f ".\$1" "\$1"
}
u() {
	if test /etc/ld.so.cache = "\$1"
	then ldconfig=true
	else d "\$@"
	fi
}
\$debug eval "sed '1,/^exit\$/d' <&3 | zcat | cpio -i -m -d"
EOF

grep '^[cdu] ' "$chglog" | sort -k2 >&3

cat << EOF >&3
test -n "\$dlist" && echo -n "\$dlist" | sort -ru | xargs -d '\n' \$debug rmdir
! \$ldconfig || \$debug ldconfig
exit
EOF

gzip -c9 < $backup >&3

exec 3>&-

echo "Use \"$rstpkg\" to undo command"
chmod +x "$rstpkg"

exit $status
