#!/bin/bash
#
# start_new_disc
#
# Start a new temporary disc tree, including all the basic metadata
# needed

set -e
#set -x

BASEDIR=$1
MIRROR=$2
TDIR=$3
CODENAME=$4
ARCHES="$5"
DISKNUM=$6
SOURCEDISK=0
BINARYDISK=0

BDIR=$TDIR/$CODENAME
CDDIR=$BDIR/CD${DISKNUM}
DATE=`cat $BDIR/DATE`
DI_DATA_DIR=$BASEDIR/data/$DI_CODENAME

CAPCODENAME=`perl -e "print ucfirst("$CODENAME")"`

NUM_ARCHES=`echo $ARCHES | wc -w`

if [ $NUM_ARCHES = 1 ] ; then
	case $ARCHES in
		source)
			SOURCEDISK=1
			export DISKINFO="Debian GNU/Linux $DEBVERSION \"$CAPCODENAME\" - $OFFICIAL $DISKTYPE Source-$DISKNUM $BUILD_DATE"
			export VOLID="Debian $DEBVERSION Src-$DISKNUM"
			export SOURCEONLY=yes
			;;
		*)
			BINARYDISK=1
			export DISKINFO="Debian GNU/Linux $DEBVERSION \"$CAPCODENAME\" - $OFFICIAL $ARCHES $DISKTYPE Binary-$DISKNUM $BUILD_DATE"
			if [ $ARCHES = powerpc ] ; then
				export VOLID="Debian $DEBVERSION ppc Bin-$DISKNUM"
			else
				export VOLID="Debian $DEBVERSION $ARCHES Bin-$DISKNUM"
			fi
			;;
	esac
    export ARCHDEF=$ARCHES
else
	BINARYDISK=1
	case "$ARCHES" in
		*source*) SOURCEDISK=1;;
	esac
	export ARCHDEF=`echo $ARCHES | sed 's? ?/?g'`
	export DISKINFO="Debian GNU/Linux $DEBVERSION \"$CAPCODENAME\" - $OFFICIAL Multi-architecture $ARCHDEF $DISKTYPE #$DISKNUM $BUILD_DATE"
	export VOLID="Debian $DEBVERSION M-A $DISKNUM"
fi

echo "Starting new $ARCHDEF $DISKTYPE $DISKNUM at $CDDIR"

mkdir -p $CDDIR
echo "  Adding the required directories"

if [ ! -e $CDDIR/debian ] ; then
    ln -sf . $CDDIR/debian
fi

if [ ! -d $CDDIR/dists/$CODENAME ] ; then
    mkdir -p $CDDIR/dists/$CODENAME
    for name in stable unstable frozen testing; do
	ln -sf $CODENAME $CDDIR/dists/$name
    done
fi

# Commodity link for tools which want local in dists/local/local ...
if [ -n "$LOCAL" ]
then
    ln -sf $CODENAME $CDDIR/dists/local
fi

if [ ! -d $CDDIR/.disk ] ; then
    mkdir $CDDIR/.disk
fi

if [ "$DISC_START_HOOK"x != ""x ] ; then
    echo "  Calling start hook: $DISC_START_HOOK"
    $DISC_START_HOOK $TDIR $MIRROR $DISKNUM $CDDIR "$ARCHES"
fi

echo "  Generating the image label and volume id"
echo -n $DISKINFO                   > $CDDIR/.disk/info
echo -n "$DISKINFO ($DATE)"         >  $BDIR/$DISKNUM.diskinfo
echo '#define DISKNAME ' $DISKINFO  >  $CDDIR/README.diskdefines
echo '#define ARCH ' $ARCHDEF       >> $CDDIR/README.diskdefines
for ARCH in $ARCHES
do
	echo '#define ARCH'$ARCH ' 1'       >> $CDDIR/README.diskdefines
done
echo '#define DISKNUM ' $DISKNUM    >> $CDDIR/README.diskdefines
echo '#define DISKNUM'$DISKNUM ' 1' >> $CDDIR/README.diskdefines
echo -n $VOLID                      >  $BDIR/$DISKNUM.volid

if [ $BINARYDISK = 1 ] ; then
	echo '#define TYPEbinary  1'        >> $CDDIR/README.diskdefines
	$BASEDIR/tools/set_mkisofs_opts bin $DISKNUM       >> $BDIR/$DISKNUM.mkisofs_opts
fi
if [ $SOURCEDISK = 1 ] ; then
	echo '#define TYPEsource  1'        >> $CDDIR/README.diskdefines
	$BASEDIR/tools/set_mkisofs_opts src $DISKNUM       >> $BDIR/$DISKNUM.mkisofs_opts
fi

if [ $DISKNUM = 1 ] ; then
	if [ "$OMIT_DOC_TOOLS" != "1" ]; then
		if [ ! -e $MIRROR/tools ] || [ ! -e $MIRROR/doc ]; then
			echo "You need a Debian mirror with the doc, tools and"
			echo "indices directories ! "
			exit 1
		fi
	fi
		
	# Add install stuff
	if [ "$SOURCEONLY"x != "yes"x ] && [ "$OMIT_DOC_TOOLS" != "1" ]; then
		echo "  Adding tools to CD1"
		$BASEDIR/tools/add_files $CDDIR $MIRROR tools
	fi

	echo "  Adding .disk/base_components"
	echo "main" > $CDDIR/.disk/base_components
	if [ -n "$LOCAL" ] ; then
		echo "local" >> $CDDIR/.disk/base_components
	fi

	echo "  Adding .disk/cd_type"
	if [ "$COMPLETE"x = "1"x ]; then
            if [ $DISKTYPE = DVD ]; then
		if [ "$MAXCDS"x = "1"x ]; then
		    echo "dvd/single" > $CDDIR/.disk/cd_type
		else
		    echo "dvd" > $CDDIR/.disk/cd_type
		fi
	    else
		if [ "$MAXCDS"x = "1"x ]; then
		    echo "full_cd/single" > $CDDIR/.disk/cd_type
		else
		    echo "full_cd" > $CDDIR/.disk/cd_type
		fi
	    fi
	else
            echo "not_complete" > $CDDIR/.disk/cd_type
	fi

	if [ $NUM_ARCHES -gt 1 ]; then
		echo "  Adding .disk/multi_arch"
		touch $CDDIR/.disk/multi_arch
	fi

	echo "  Adding udeb/base includes/excludes"

	for ARCH in $ARCHES
	do
		if [ $ARCH != source ] ; then
			# Netinst/businesscard CD have different
			# udeb_include and udeb_exclude files
			if [ -z "$UDEB_INCLUDE" ] ; then
				case "$INSTALLER_CD"x in
					"1"x)
						UDEB_INCLUDE=$DI_DATA_DIR/"$ARCH"_businesscard_udeb_include;;
					"2"x)
						UDEB_INCLUDE=$DI_DATA_DIR/"$ARCH"_netinst_udeb_include;;
					*)
						UDEB_INCLUDE=$DI_DATA_DIR/"$ARCH"_udeb_include;;
				esac
			fi

			if [ -z "$UDEB_EXCLUDE" ] ; then
				case "$INSTALLER_CD"x in
					"1"x)
						UDEB_EXCLUDE=$DI_DATA_DIR/"$ARCH"_businesscard_udeb_exclude;;
					"2"x)
						UDEB_EXCLUDE=$DI_DATA_DIR/"$ARCH"_netinst_udeb_exclude;;
					*)
						UDEB_EXCLUDE=$DI_DATA_DIR/"$ARCH"_udeb_exclude;;
				esac
			fi

			# Sort out the udeb include and exclude files
			if [ -n "$UDEB_INCLUDE" ] ; then
				if [ -r "$UDEB_INCLUDE" ] ; then
					cat "$UDEB_INCLUDE" >> "$CDDIR/.disk/udeb_include"
				else
					echo "ERROR: Unable to read UDEB_INCLUDE file $UDEB_INCLUDE"
				fi
			fi
			if [ -n "$UDEB_EXCLUDE" ] ; then
				if [ -r "$UDEB_EXCLUDE" ] ; then
					cat "$UDEB_EXCLUDE" >> "$CDDIR/.disk/udeb_exclude"
				else
					echo "ERROR: Unable to read UDEB_EXCLUDE file $UDEB_EXCLUDE"
				fi
			fi

			# Ditto the base include and exclude
			if [ -n "$BASE_INCLUDE" ] ; then
				if [ -r "$BASE_INCLUDE" ] ; then
					cat "$BASE_INCLUDE" >> "$CDDIR/.disk/base_include"
				else
					echo "ERROR: Unable to read BASE_INCLUDE file $BASE_INCLUDE"
				fi
			fi
			if [ -n "$BASE_EXCLUDE" ] ; then
				if [ -r "$BASE_EXCLUDE" ] ; then
					cat "$BASE_EXCLUDE" >> "$CDDIR/.disk/base_exclude"
				else
					echo "ERROR: Unable to read BASE_EXCLUDE file $BASE_EXCLUDE"
				fi
			fi
		fi
	done

	if [ "$OMIT_DOC_TOOLS" != "1" ]; then
		echo "  Adding docs to CD1"
		$BASEDIR/tools/add_files $CDDIR $MIRROR doc
		find $CDDIR/doc -name "dedication-*" | grep -v "$DEBVERSION" | xargs rm -f
		find $CDDIR/doc -name "debian-keyring.tar.gz" | xargs rm -f

		if [ ! -e $CDDIR/doc/FAQ/html ] ; then
			echo "  Extracting FAQ on CD1"
			mkdir $CDDIR/doc/FAQ/html
			cd $CDDIR/doc/FAQ/html
			if [ -e "../debian-faq.en.html.tar.gz" ] ; then
				tar xzf ../debian-faq.en.html.tar.gz
			else
				tar xzf ../debian-faq.html.tar.gz
			fi
		fi
	fi

	# Installtools
	mkdir $CDDIR/install
	if [ -x "$BASEDIR/tools/$CODENAME/installtools.sh" ] ; then
		echo "  Adding installtools"
		$BASEDIR/tools/$CODENAME/installtools.sh $CDDIR "$ARCHES"
	fi

	for ARCH in $ARCHES
	do
		if [ -e $MIRROR/dists/$DI_CODENAME/main/disks-$ARCH ] ; then
			echo "  Adding disks-$ARCH stuff ..."
			mkdir -p $CDDIR/dists/$DI_CODENAME/main/disks-$ARCH
			$BASEDIR/tools/add_files $CDDIR/dists/$DI_CODENAME/main/disks-$ARCH $MIRROR/dists/$DI_CODENAME/main/disks-$ARCH . 
			touch $CDDIR/.disk/kernel_installable
			cd $CDDIR/dists/$DI_CODENAME/main/disks-$ARCH
			rm -rf base-images-*
			if [ -L current ] ; then
				CURRENT_LINK=`readlink current`
				mv $CURRENT_LINK .tmp_link
				rm -rf [0123456789]*
				mv .tmp_link $CURRENT_LINK
			elif [ -d current ] ; then
				rm -rf [0123456789]* 
			fi
		fi
	done
fi

# Create an empty dirs file; will be appended to later if needed
> $BDIR/$DISKNUM.mkisofs_dirs

echo "  Adding common docs on CD$DISKNUM"
$BASEDIR/tools/add-bin-doc $DISKNUM "$ARCHES"

# Common stuff for all disks in the set
if [ "$SOURCEONLY"x = "yes"x ] ; then
	echo -n "-J " >> $BDIR/$DISKNUM.mkisofs_opts
fi

echo "  Adding Release files"
# Release files
cd $CDDIR

SECTIONS="main"
if [ "${NONFREE:-0}" != "0" -o "${EXTRANONFREE:-0}" != "0" ] ; then
	SECTIONS="${SECTIONS} non-free"
fi
if [ "${CONTRIB:-0}" != "0" ] ; then
	SECTIONS="${SECTIONS} contrib"
fi

if [ -n "$LOCAL" ] ; then
	SECTIONS="$SECTIONS local"
fi

# these two lines can be inserted below the "Architectures" line below,
# to sort out broken Release files just after the testing --> stable
# transition
#     sed -e "s/^Suite: .*$/Suite: stable/" | \
#     sed -e "s/^Description: .*$/Description: Debian $DEBVERSION/" | \

if [ -e "$MIRROR/dists/$CODENAME/Release" ] ; then
	# Strip the MD5Sum and SHA1 fields
	# Update some other information as well
	sed -e "s/^Architectures: .*$/Architectures: $ARCHES/" \
		$MIRROR/dists/$CODENAME/Release | \
		sed -e "s|^Components: .*$|Components: $SECTIONS|" | \
		perl -ne 'if (/^(MD5Sum|SHA1|SHA256):/i) { $f=1; next } 
		if ($f) { 
		unless (/^ /) { print; $f=0 }
		} else { print }' > dists/$CODENAME/Release
	if [ "$EARLY_BUILD_HACK"x = "1"x ] ; then
	    RDATE=`awk '/^Date:/ { print $2,$3,$4,$5}' dists/$CODENAME/Release`
	    sed -i -e "s/^Suite: .*$/Suite: stable/" dists/$CODENAME/Release
	    sed -i -e "s/^Description: .*$/Description: Debian $DEBVERSION Released $RDATE/" dists/$CODENAME/Release
	fi
else
	echo "ERROR: Release file ($MIRROR/dists/$CODENAME/Release) is missing !"
	exit 1
fi

# Copying individual release files
for ARCH in $ARCHES
do
    for SECT in $SECTIONS
    do
	    # Install the release files
	    if [ -e "$MIRROR/dists/$CODENAME/$SECT/binary-$ARCH/Release" ] ; then
			mkdir -p dists/$CODENAME/$SECT/binary-$ARCH
			cp $MIRROR/dists/$CODENAME/$SECT/binary-$ARCH/Release \
				dists/$CODENAME/$SECT/binary-$ARCH/
			if [ "$DEBVERSION" != "testing" ] ; then
			    sed -i "s/^Archive:.*$/Archive: stable/" dists/$CODENAME/$SECT/binary-$ARCH/Release
			fi
		fi
		if [ -n "$NONUS" -a -e "$NONUS/dists/$CODENAME/non-US/$SECT/binary-$ARCH/Release" ] ; then
			mkdir -p dists/$CODENAME/non-US/$SECT/binary-$ARCH
			cp $NONUS/dists/$CODENAME/non-US/$SECT/binary-$ARCH/Release \
				dists/$CODENAME/non-US/$SECT/binary-$ARCH/
			if [ "$DEBVERSION" != "testing" ] ; then
			    sed -i "s/^Archive:.*$/Archive: stable/" dists/$CODENAME/non-US/$SECT/binary-$ARCH/Release
			fi
		fi
    done

	if [ -n "$LOCALDEBS" -a -n "$LOCAL" ] ; then
		if [ -e $LOCALDEBS/dists/$CODENAME/local/binary-$ARCH/Release ] ; then
			mkdir -p dists/$CODENAME/local/binary-$ARCH
			cp $LOCALDEBS/dists/$CODENAME/local/binary-$ARCH/Release \
				dists/$CODENAME/local/binary-$ARCH/
		fi
	fi

	if [ -e "$MIRROR/dists/$DI_CODENAME/main/debian-installer/binary-$ARCH/Release" ] ; then
		mkdir -p dists/$CODENAME/main/debian-installer/binary-$ARCH
		cp $MIRROR/dists/$DI_CODENAME/main/debian-installer/binary-$ARCH/Release \
			dists/$CODENAME/main/debian-installer/binary-$ARCH/
		if [ "$DEBVERSION" != "testing" ] ; then
		    sed -i "s/^Archive:.*$/Archive: stable/" dists/$CODENAME/main/debian-installer/binary-$ARCH/Release
		fi
	fi
done

# Upgrade packages / kernels
if [ "$SOURCEONLY"x != "yes"x ] ; then
	echo "  Trying to add upgrade* directories"
	if [ -x "$BASEDIR/tools/$CODENAME/upgrade.sh" ] ; then
		$BASEDIR/tools/$CODENAME/upgrade.sh
	fi
fi

for ARCH in $ARCHES
do
	export ARCH=$ARCH
	if [ $ARCH != source ] ; then
		if [ -x "$BASEDIR/tools/$CODENAME/upgrade-$ARCH.sh" ] ; then
			$BASEDIR/tools/$CODENAME/upgrade-$ARCH.sh $DISKNUM $CDDIR
		fi

		echo "  (Optionally) making the image bootable for $ARCH:"
		if [ -f $BASEDIR/tools/boot/$DI_CODENAME/boot-$ARCH ] ; then
			cd $TDIR
			echo "    Running tools/boot/$DI_CODENAME/boot-$ARCH $DISKNUM $CDDIR"
			$BASEDIR/tools/boot/$DI_CODENAME/boot-$ARCH $DISKNUM $CDDIR || booterror=$?
			if [ "$booterror"x != ""x ] ; then
				echo "      FAILED: error $booterror"
				exit $booterror
			fi
		else
			if [ "${IGNORE_MISSING_BOOT_SCRIPT:-0}" = "0" ] ; then
				echo "    No script to make CDs bootable for $ARCH"
				echo "    We've not been asked to ignore this. Aborting."
				exit 1
			fi
		fi
	fi
done

if [ "$DISC_PKG_HOOK"x != ""x ] ; then
    echo "  Calling pkg hook: $DISC_PKG_HOOK"
    $DISC_PKG_HOOK $TDIR $MIRROR $DISKNUM $CDDIR "$ARCHES"
fi

exit 0
