#!/bin/sh
#
# Debian-cd helper script for making ISO / jigdo images
#

set -e

DIR=$1
ARCHES="$2"
OUT=$3
DEBVERSION=$4
MIRROR=$5
MKISOFS=$6
MKISOFS_OPTS=$7
JIGDO_OPTS=$8
JIGDO_CLEANUP=$9

NUM_ARCHES=`echo $ARCHES | wc -w`

if [ "$CD"x = ""x ] ; then
    echo "Generating the $ARCHES iso/jigdo images ..."
    FILES=$DIR/*.volid
else
    echo "Generating $ARCHES iso/jigdo image number $CD ..."
    FILES=$DIR/$CD.volid
fi

NUM_CDS=`ls -1 $FILES | wc -l`

last_minute_update () {
    echo "  Last-minute updates:"
    # Aaargh. Only now that we know how many CDs we're making can we
    # fill in the TOTALNUM number in README.{html,txt} (and therefore also
    # update the md5sum.txt entries for those files)
    for file in README.html README.txt
    do
        echo "    $file"
        OLD_MD5=`md5sum ./$file`
        sed -i "s?TOTALNUM?$NUM_CDS?" $file
        NEW_MD5=`md5sum ./$file`
        sed -i "s?$OLD_MD5?$NEW_MD5?" md5sum.txt
    done
}

# Grab the xorriso version and turn it into a number we can use
xorriso_version() {
    $MKISOFS --version 2>&1 | awk '
	/^xorriso version/ {
	    split($4, ver, ".")
	    print ver[1]*10000+ver[2]*100+ver[3]
	}'
}

for file in $FILES
do
    dir=${file%%.volid}
    n=${dir##$DIR/}
    dir=$DIR/CD$n

    cd $dir
    # Anything last-minute that can only be done now?
    last_minute_update

    cd $dir/..

    opts=`cat $DIR/$n.mkisofs_opts` || true
    dirs=`cat $DIR/$n.mkisofs_dirs` || true
    volid=`cat $DIR/$n.volid`
    relname=`echo $DEBVERSION | sed -e 's/ //g'`
    DISKINFO=`cat $DIR/$n.diskinfo`

    ARCHLIST=`echo "$ARCHES" | tr ' ' '-'`
    OUTFILE="${CDNAME:-debian}-$relname-$ARCHLIST-$DISKTYPE-$n"

    # Clean up any old files
    rm -f $OUT/$OUTFILE.iso $OUT/$OUTFILE.jigdo $OUT/$OUTFILE.template

    date

    # Work out whether we want ISO, jigdo or both
    if [ "$MAXISOS"x = ""x ] || [ "$MAXISOS" = "all" ] || \
        [ "$MAXISOS" = "ALL" ] || [ "$n" -le "$MAXISOS" ] ; then
        ISO_WANTED=1
    else
        ISO_WANTED=0
    fi
    if [ "$MAXJIGDOS"x = ""x ] || [ "$MAXJIGDOS" = "all" ] || \
        [ "$MAXJIGDOS" = "ALL" ] || [ "$n" -le "$MAXJIGDOS" ] ; then
        JIGDO_WANTED=1
    else
        JIGDO_WANTED=0
    fi

    # Work out common jigdo options if needed
    if [ $JIGDO_WANTED = 1 ]; then
	XOR_VER=$(xorriso_version)
	if [ $XOR_VER -lt 10502 ]; then
	    # Only supports jigdo format v1
	    case "$JIGDO_CHECKSUM"x in
		"md5"x|x)
		    JIGDO_CHECKSUM_OPTS="-md5-list $DIR/checksum-check \
		    			 -jigdo-force-md5 /pool/"
		    ;;
		*)
		    echo "Older xorriso version $XOR_VER does not support jigdo checksum algorithm $JIGDO_CHECKSUM"
		    exit 1
		    ;;
	    esac
	else
	    JIGDO_CHECKSUM_OPTS="-checksum-list $DIR/checksum-check \
	                         -jigdo-checksum-algorithm $JIGDO_CHECKSUM \
				 -jigdo-force-checksum /pool/"
	fi

	JIGDO_OPTS="$JIGDO_CHECKSUM_OPTS $JIGDO_OPTS \
            -jigdo-jigdo $OUT/$OUTFILE.jigdo \
            -jigdo-template $OUT/$OUTFILE.template \
            -jigdo-map Debian=$MIRROR/ \
            -jigdo-exclude boot$n"
    fi

    # Actually make the ISO/jigdo images. Long command lines
    # here, with lots of stuff included :-(
    CMD=
    if [ $JIGDO_WANTED = 0 ] && [ $ISO_WANTED = 1 ] ; then

        CMD="$MKISOFS $MKISOFS_OPTS -V '$volid' \
            -o $OUT/$OUTFILE.iso $opts $dirs CD$n"

    elif [ $JIGDO_WANTED = 1 ] && [ $ISO_WANTED = 1 ] ; then

        CMD="$MKISOFS $MKISOFS_OPTS -V '$volid' \
            -o $OUT/$OUTFILE.iso \
            $JIGDO_OPTS $opts $dirs CD$n"

    elif [ $JIGDO_WANTED = 1 ] && [ $ISO_WANTED = 0 ] ; then

        CMD="$MKISOFS $MKISOFS_OPTS -V '$volid' \
            -o /dev/null \
            $JIGDO_OPTS $opts $dirs CD$n"

    else
        echo "Neither jigdo nor iso wanted for CD$n"
    fi
    if [ "$CMD" ]; then
        echo $CMD
        echo $CMD > CD$n/.disk/mkisofs
        eval "$CMD"
	    if [ $ISO_WANTED = 1 ] ; then
	        chmod +r $OUT/$OUTFILE.iso
	    fi

        # Generate our listfile while we have the information to hand easily
        find CD$n/pool -type f | sed 's?^.*/??g' | pigz -9nm > $OUT/$OUTFILE.list.gz
    fi

    # If we've made jigdo files, tweak them with extra info now
    if [ "$JIGDO_WANTED" = 1 ] ; then
        SNAPSHOT_DATE=`cat $DIR/DATE-zulu`
        if [ "$SNAPURL"x != ""x ] ; then
            SNAPSHOTURL=`echo "$SNAPURL" | sed "s/SNAPDATETIME/$SNAPSHOT_DATE/g"`
        fi
        $JIGDO_CLEANUP $OUT/$OUTFILE.jigdo \
            $OUTFILE.iso $DIR/CD$n \
            "`echo "$JIGDOTEMPLATEURL" | sed -e 's|%ARCH%|$ARCH|g'`$OUTFILE.template" \
            "$DISKINFO" \
            "$SNAPSHOTURL" \
            $JIGDOFALLBACKURLS
        if [ "$ISO_WANTED" = 1 ] ; then
            # Make sure that the ISO is as new/newer than the jigdo file; #587774
            touch $OUT/$OUTFILE.iso
        fi
    fi
done
