#!/bin/bash

TOPDIR=$(dirname $0)
if [ "$TOPDIR" = "." ] ; then
    TOPDIR=`pwd`
fi
export TOPDIR

. $TOPDIR/settings.sh

BUILDLOCK=$HOME/.debian-cd.lock
export PUBDIRJIG=$PUBDIR/daily-builds
if [ "$BUILDNUM"x = ""x ]; then
    BUILDNUM=1
fi
export DATE_BUILD="$DATE-$BUILDNUM"
export TESTING_SUITE=${CODENAME}
BUILDS_RUNNING=""

export NI_WANTED=1
export TESTING_WANTED=0

if [ "$RELEASE_BUILD"x = ""x ] ; then
    export SID_WANTED=1
    export OUT_FREE_TST=${PUBDIRJIG}/${TESTING_SUITE}_d-i/${DATE_BUILD}
    export OUT_FW_TST=${PUBDIRJIG}-firmware/${TESTING_SUITE}_d-i/${DATE_BUILD}
    export OUT_FREE_SID=${PUBDIRJIG}/sid_d-i/${DATE_BUILD}
    export OUT_FW_SID=${PUBDIRJIG}-firmware/sid_d-i/${DATE_BUILD}
    export RSYNC_TARGET_FREE=${OUT_BASE}/daily-builds
    export RSYNC_TARGET_FIRMWARE=${OUT_BASE}/unofficial/non-free/cd-including-firmware/daily-builds
else
    echo "Don't support release builds of dailies! Use cronjob.weekly instead"
    exit 1
fi

. $TOPDIR/common.sh

# Make sure the machine isn't rebooted while we're busy
reboot_lock

finalise_arch_dir () {
    ARCH=$1

    for OUT_DIR in $OUT_FREE_SID $OUT_FW_SID; do # $OUT_FREE_TST $OUT_FW_TST 
	ARCH_DIR=$OUT_DIR/$ARCH
        # Only keep things / do any work here if there are any files in the ARCH_DIR
	NUM_FILES=`find $ARCH_DIR -type f | wc -l`
	if [ $NUM_FILES = 0 ] ; then
	    rm -rf $ARCH_DIR
	else
	    ARCH_ISO_DIR=${ARCH_DIR}/iso-cd
	    ARCH_JIGDO_DIR=${ARCH_DIR}/jigdo-cd

	    DATESTRING=`date -u`
	    case $ARCH_ISO_DIR in
		*firmware*)
		    FIRMWARE="firmware"
		    INFILE=$TOPDIR/daily-firmware.html;;
		*)
		    FIRMWARE=""
		    INFILE=$TOPDIR/daily.html;;
	    esac
	    sed "s/ARCH/$ARCH/g;s/DATE/$DATESTRING/g;s/BUILDNUM/$BUILDNUM/g;s/CODENAME/$CODENAME/g" \
		$INFILE > $ARCH_DIR/HEADER.html

	    generate_checksums_for_arch $ARCH $ARCH_JIGDO_DIR
	    ~/build.${CODENAME}/generate_headers ~/build.${CODENAME}/HEADER.html.in $ARCH_DIR $ARCH $FIRMWARE

	    cd $ARCH_DIR
	    echo "Signing checksums files using the automatic key"
	    ~/build.${CODENAME}/sign-images $OUT_DIR $ARCH
	    ~/build.${CODENAME}/mklist iso-cd/*iso
	    cd $TOPDIR
	fi
    done
}

cd $TOPDIR &&
if lockfile -r0 $BUILDLOCK ; then

#    echo "NOT checking for git updates"
    echo "git update debian-cd"
    cd debian-cd && git pull ; cd ..

    cd $TOPDIR

    . images4testing_d-i

    # Allow desktop selection in isolinux menu for i386 and amd64
    # For other arches this is a harmless no-op
    export DESKTOP=all
    export KERNEL_PARAMS="desktop=all"

    for arch in $ARCHES; do
        # We don't do source daily builds
        if [ "$arch" = "source" ] ; then
            continue
        fi

	rm -rf $PUBDIRJIG/$arch
	arch_error=""
	arch_start=`now`

	for OUT_DIR in $OUT_FREE_SID $OUT_FW_SID; do # $OUT_FREE_TST $OUT_FW_TST 
	    mkdir -p ${OUT_DIR}/${arch}/iso-cd ${OUT_DIR}/${arch}/jigdo-cd
	done

        if [ "$arch" = "multi-arch" ] ; then
	    if $(arch_has_firmware $arch) ; then
		if [ "$SID_WANTED" = "1" ] ; then
		    if [ "$NI_WANTED" = "1" ] ; then
			build_started SIDNIFIRMWARE
			OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			    NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=C \
			    FORCE_FIRMWARE=1 CDNAME=firmware \
			    TASK=debian-installer+kernel LOGAPPEND="-1" \
			    MAXISOS=ALL MAXJIGDOS=ALL \
			    DI=sid DI_DIST="$DI_DIST" VARIANTS=xen \
			    DI_DIR="$ARCH_DI_DIR" \
			    DI_WWW_HOME=default ./testingcds "amd64 i386" &
		    fi
		fi

		if [ "$TESTING_WANTED" = "1" ] ; then
		    if [ "$NI_WANTED" = "1" ] ; then
			build_started TESTINGNIFIRMWARE
			OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			    NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=C \
			    FORCE_FIRMWARE=1 CDNAME=firmware \
			    TASK=debian-installer+kernel LOGAPPEND="-1" \
			    MAXISOS=ALL MAXJIGDOS=ALL \
			    DI=${TESTING_SUITE} DI_DIST="$DI_DIST" VARIANTS=xen \
			    ./testingcds "amd64 i386" &
		    fi
		fi
	    fi

	    if [ "$SID_WANTED" = "1" ] ; then
		if [ "$NI_WANTED" = "1" ] ; then
		    build_started SIDNI
		    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=2 \
			TASK=debian-installer+kernel LOGAPPEND="-1" \
			MAXISOS=ALL MAXJIGDOS=ALL \
			DI=sid DI_DIST="$DI_DIST" VARIANTS=xen \
			DI_DIR="$ARCH_DI_DIR" \
			DI_WWW_HOME=default ./testingcds "amd64 i386" &
		fi
	    fi

	    if [ "$TESTING_WANTED" = "1" ] ; then
		if [ "$NI_WANTED" = "1" ] ; then
		    build_started TESTINGNI
		    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=2 \
			TASK=debian-installer+kernel LOGAPPEND="-1" \
			MAXISOS=ALL MAXJIGDOS=ALL \
			DI=${TESTING_SUITE} DI_DIST="$DI_DIST" VARIANTS=xen \
			./testingcds "amd64 i386" &
		fi
	    fi

	    catch_parallel_builds
	    rm -rf $PUBDIRJIG/$arch
	    if [ "$arch_error"x = "none"x ] ; then
		finalise_arch_dir $arch
	    fi

        else # end of m-a

	    if $(arch_has_firmware $arch) ; then
		if [ "$SID_WANTED" = "1" ] ; then
		    if [ "$NI_WANTED" = "1" ] ; then
			build_started SIDNIFIRMWARE
			OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			    FORCE_FIRMWARE=1 CDNAME=firmware \
			    NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=C \
			    TASK=debian-installer+kernel MAXISOS=ALL MAXJIGDOS=ALL \
			    DI=sid DI_WWW_HOME=default \
			    DI_DIR="$ARCH_DI_DIR" \
			    ./testingcds "$arch" &
		    fi
		fi

		if [ "$TESTING_WANTED" = "1" ] ; then
		    if [ "$NI_WANTED" = "1" ] ; then
			build_started TESTINGNIFIRMWARE
			OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			    FORCE_FIRMWARE=1 CDNAME=firmware \
			    NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=C \
			    TASK=debian-installer+kernel MAXISOS=ALL MAXJIGDOS=ALL \
			    DI=${TESTING_SUITE} DI_DIST="$DI_DIST" \
			    ./testingcds "$arch" &
		    fi
		fi
	    fi

	    if [ "$SID_WANTED" = "1" ] ; then
		if [ "$NI_WANTED" = "1" ] ; then
		    build_started SIDNI
		    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=2 \
			TASK=debian-installer+kernel MAXISOS=ALL MAXJIGDOS=ALL \
			DI=sid DI_WWW_HOME=default \
			DI_DIR="$ARCH_DI_DIR" \
			./testingcds "$arch" &
		fi
	    fi

	    if [ "$TESTING_WANTED" = "1" ] ; then
		if [ "$NI_WANTED" = "1" ] ; then
		    build_started TESTINGNI
		    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=2 \
			TASK=debian-installer+kernel MAXISOS=ALL MAXJIGDOS=ALL \
			DI=${TESTING_SUITE} DI_DIST="$DI_DIST" \
			./testingcds "$arch" &
		fi
	    fi

	    # Special Mac-only builds
	    if [ "$arch" = "i386" ] || [ "$arch" = "amd64" ] ; then
		if [ "$SID_WANTED" = "1" ] ; then
		    if [ "$NI_WANTED" = "1" ] ; then
			build_started SIDMACNI
			OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			    NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=F \
			    TASK=debian-installer+kernel MAXISOS=ALL MAXJIGDOS=ALL \
			    BOOT_METHODS=BIOS CDNAME="debian-mac" \
			    DI=sid DI_WWW_HOME=default \
			    DI_DIR="$ARCH_DI_DIR" \
			    ./testingcds "$arch" &
		    fi
		fi

		if [ "$TESTING_WANTED" = "1" ] ; then
		    if [ "$NI_WANTED" = "1" ] ; then
			build_started TESTINGMACNI
			OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			    NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=F \
			    TASK=debian-installer+kernel MAXISOS=ALL MAXJIGDOS=ALL \
			    BOOT_METHODS=BIOS CDNAME="debian-mac" \
			    DI=${TESTING_SUITE} DI_DIST="$DI_DIST" \
			    ./testingcds "$arch" &
		    fi
		fi
	    fi


	    # Special debian-edu builds, only minor tweaks. #846006
	    if [ "$NOEDU"x = ""x ] ; then
		if [ "$arch" = "i386" ] || [ "$arch" = "amd64" ] ; then
		    if [ "$SID_WANTED" = "1" ] ; then
			if [ "$NI_WANTED" = "1" ] ; then
			    build_started SIDEDUNI
			    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			        NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=G \
				CDNAME=debian-edu \
				DI=sid DI_WWW_HOME=default \
				DEBIAN_EDU=1 \
				KERNEL_PARAMS="modules=debian-edu-install-udeb" \
				DESKTOP=xfce VARIANTS=xen \
				EXCLUDE=debian-edu-exclude \
				UDEB_EXCLUDE="$BASEDIR"/data/$CODENAME/udeb_exclude \
				TASK=Debian-edu-netinst \
				MAXISOS=1 MAXJIGDOS=1 \
				DI=${DI} DI_DIST=${DI} \
				DI_DIR="$ARCH_DI_DIR" \
				./testingcds "$arch" &

			    build_started SIDEDUNIFIRMWARE
			    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
				NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=H \
				FORCE_FIRMWARE=1 \
				CDNAME=firmware-edu \
				DI=sid DI_WWW_HOME=default \
				DEBIAN_EDU=1 \
				KERNEL_PARAMS="modules=debian-edu-install-udeb" \
				DESKTOP=xfce VARIANTS=xen \
				EXCLUDE=debian-edu-exclude \
				UDEB_EXCLUDE="$BASEDIR"/data/$CODENAME/udeb_exclude \
				TASK=Debian-edu-netinst \
				MAXISOS=1 MAXJIGDOS=1 \
				DI=${DI} DI_DIST=${DI} \
				DI_DIR="$ARCH_DI_DIR" \
				./testingcds "$arch" &
			fi
		    fi

		    if [ "$TESTING_WANTED" = "1" ] ; then
			if [ "$NI_WANTED" = "1" ] ; then
			    build_started TESTINGEDUNI
			    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
			        NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=G \
				CDNAME=debian-edu \
				DEBIAN_EDU=1 \
				KERNEL_PARAMS="modules=debian-edu-install-udeb" \
				DESKTOP=xfce VARIANTS=xen \
				EXCLUDE=debian-edu-exclude \
				UDEB_EXCLUDE="$BASEDIR"/data/$CODENAME/udeb_exclude \
				TASK=Debian-edu-netinst \
				MAXISOS=1 MAXJIGDOS=1 \
				DI=${TESTING_SUITE} DI_DIST="$DI_DIST" \
				./testingcds "$arch" &

			    build_started TESTINGEDUNIFIRMWARE
			    OMIT_RELEASE_NOTES=1 OMIT_MANUAL=1 NORECOMMENDS=1 \
				NOSUGGESTS=1 COMPLETE=0 INSTALLER_CD=H \
				FORCE_FIRMWARE=1 \
				CDNAME=firmware-edu \
				DEBIAN_EDU=1 \
				KERNEL_PARAMS="modules=debian-edu-install-udeb" \
				DESKTOP=xfce VARIANTS=xen \
				EXCLUDE=debian-edu-exclude \
				UDEB_EXCLUDE="$BASEDIR"/data/$CODENAME/udeb_exclude \
				TASK=Debian-edu-netinst \
				MAXISOS=1 MAXJIGDOS=1 \
				DI=${TESTING_SUITE} DI_DIST="$DI_DIST" \
				./testingcds "$arch" &
			fi
		    fi
		fi
	    fi

	    catch_parallel_builds
	    rm -rf $PUBDIRJIG/$arch
	    if [ "$arch_error"x = "none"x ] ; then
		finalise_arch_dir $arch
	    fi

        fi # end of normal arch build
    done

    if [ "$NOSYNC"x = ""x ] ; then
        echo "Clean up old builds on build machine:"
        for DIR in $PUBDIRJIG/* $PUBDIRJIG-firmware/* ; do
	    cd $DIR
	    for THIS in 20* ; do
                if [ $THIS != $DATE-$BUILDNUM ] ; then
		    echo "  Deleting $DIR/$THIS"
		    rm -rf $DIR/$THIS
                fi
	    done
        done

	echo "Sync normal builds across to output dir: $RSYNC_TARGET_FREE"
        rsync -rHlt $PUBDIRJIG/ $RSYNC_TARGET_FREE/
	echo "Sync firmware builds across to output dir: $RSYNC_TARGET_FIRMWARE"
        rsync -rHlt $PUBDIRJIG-firmware/ $RSYNC_TARGET_FIRMWARE/

        echo "Remove extra builds:"
        ~/bin/remove_extra_dailies
	
        echo "$DATE-$BUILDNUM" > $RSYNC_TARGET_FREE/daily-trace

	if [ $(hostname) = casulana ]; then
	    (cd ${RSYNC_TARGET_FREE}/sid_d-i/${DATE_BUILD} && find . -name '*.iso' > .iso-wanted)
	    (cd ${RSYNC_TARGET_FIRMWARE}/sid_d-i/${DATE_BUILD}/ && find . -name '*.iso' > .iso-wanted)
	    rsync_to_pettersson ${RSYNC_TARGET_FREE}/sid_d-i/${DATE_BUILD}/ \
				daily-builds/sid_d-i/${DATE_BUILD}/ \
				'--exclude *.iso'
	    publish_on_pettersson daily-builds/sid_d-i/${DATE_BUILD}

	    rsync_to_pettersson ${RSYNC_TARGET_FIRMWARE}/sid_d-i/${DATE_BUILD}/ \
				unofficial/non-free/cd-including-firmware/daily-builds/sid_d-i/${DATE_BUILD}/ \
				'--exclude *.iso'
	    publish_on_pettersson unofficial/non-free/cd-including-firmware/daily-builds/sid_d-i/${DATE_BUILD}

	    rsync_to_pettersson ${OUT_BASE}/cd-sources/ cd-sources/
	    publish_on_pettersson cd-sources
	fi

    fi

    cd $TOPDIR
    rm -f $BUILDLOCK
fi

