#!/bin/sh
#
# Copyright © 1995-1998 Ian Jackson <ian@chiark.greenend.org.uk>
# Copyright © 1998 Heiko Schlittermann <heiko@lotte.sax.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 dated June, 1991.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

set -e
vardir="$1"
method=$2
option=$3
iarch=`dpkg --print-architecture`

cd "$vardir/methods/$method"

. ./shvar.$option

#debug() { echo "DEBUG: $@"; }
debug() { true; }
ismulti() { debug $1 $2; test -e "$1/.disk/info" || test -e "$1$2/.disk/info"; }

packages=0
for f in main ctb nf nonus nonusctb nonusnf lcl
do
    eval 'this_packages=$p_'$f'_packages'

    if [ -n "$this_packages" ]
    then
	packages=1
    fi
done

if [ $packages eq 0 ]
then
	echo '
No Packages files available, cannot update available packages list.
Hit RETURN to continue.  '
	read response
	exit 0
fi

xit=1
trap '
	rm -f packages-{main,ctb,nf,nonus,nonusctb,nonusnf,lcl}
	if [ -n "$umount" ]
	then
		umount "$umount" >/dev/null 2>&1
	fi
	exit $xit
' 0

if [ ! -b "$p_blockdev" ]
then
	loop=",loop"
fi

if [ -n "$p_blockdev" ]
then
	umount="$p_mountpoint"
	mount -rt "$p_fstype" -o nosuid,nodev${loop} "$p_blockdev" "$p_mountpoint"
fi

if [ -n "$p_nfs" ]
then
	umount="$p_mountpoint"
	mount -rt nfs "$p_nfs" -o nosuid,nodev "$p_mountpoint"
fi

updatetype=update

if [ -z "$p_multi" ]; then
	exit 1
fi

for f in main ctb nf nonus nonusctb nonusnf lcl
do
	eval 'this_packages=$p_'$f'_packages'
	case "$this_packages" in
	'')
		continue
		;;
	scan)
		eval 'this_binary=$p_'$f'_binary'
		if [ -z "$this_binary" ]; then continue; fi
		if [ "$updatetype" = update ]
		then
			dpkg --clear-avail
			updatetype=merge
		fi
		echo Running dpkg --record-avail -R "$p_mountpoint$this_binary"
		dpkg --record-avail -R "$p_mountpoint$this_binary"
		;;
	*)
		packagesfile="$p_mountpoint$this_packages"
		case "$packagesfile" in
		*.gz | *.Z | *.GZ | *.z)
			echo -n "Uncompressing $packagesfile ... "
			zcat <"$packagesfile" >packages-$f
			echo done.
			dpkg --$updatetype-avail packages-$f
			updatetype=merge
			;;
		'')
			;;
		*)
			dpkg --$updatetype-avail "$packagesfile"
			updatetype=merge
			;;
		esac
		;;
	esac
done

cp -f $vardir/available $vardir/methods/$method

echo -n 'Update OK.  Hit RETURN.  '
read response

xit=0
