# Common handy shell script functions

l=/var/run/reboot-lock

reboot_lock () {
    exec 3<$l
    if ! flock --shared -w 0 3; then
	echo 2>&1 "Cannot acquire reboot lock."
	#exit 1
    fi
}

reboot_unlock () {
    flock --shared -u 3
}

now () {
    date -u +%F:%H:%M:%S
}

build_description () {
    case $1 in
        NI)
	    DESC="Netinst CD";;
        MACNI)
	    DESC="Mac Netinst CD";;
        CD)
	    DESC="Full CD";;
        DVD)
            DESC="Full DVD";;
        BD)
            DESC="Blu-ray";;
        DLBD)
            DESC="Dual-layer Blu-ray";;
        KDECD)
	    DESC="KDE CD";;
        GNOMECD)
	    DESC="GNOME CD";;
        LIGHTCD)
	    DESC="XFCE/lxde CD";;
        XFCECD)
	    DESC="XFCE CD";;
        LXDECD)
	    DESC="lxde CD";;
	*)
	    DESC="UNKNOWN";;
    esac
    echo "$DESC"
}    

calc_time () {
    echo $1 $2 | awk '
    {
        split($1, start, ":")
        start_time = (3600*start[2]) + (60*start[3]) + start[4]
        split($2, end, ":")
        end_time = (3600*end[2]) + (60*end[3]) + end[4]
        # Cope with going to a new day; do not worry about more than 1 day!
        if (start[1] != end[1]) { end_time += 86400 }
        time_taken = end_time - start_time
        hours = int(time_taken / 3600)
        time_taken -= (hours * 3600)
        minutes = int(time_taken / 60)
        time_taken -= (minutes * 60)
        seconds = time_taken
        printf("%dh%2.2dm%2.2ds\n", hours, minutes, seconds)
    }'
}

build_started () {
    export BUILDNAME=$1
    BUILDS_RUNNING="$BUILDS_RUNNING $BUILDNAME"
    export ${BUILDNAME}START=`now`
}

build_finished () {
    ARCH="$1"
    BUILDNAME="$2"
    BUILDNAMESTART="${BUILDNAME}START"
    start=${!BUILDNAMESTART}

    . $PUBDIRJIG/$ARCH/$BUILDNAME-trace

    time_spent=`calc_time $start $end`
    echo "  $ARCH $BUILDNAME build started at $start, ended at $end (took $time_spent), error $error"
    if [ $error -ne 0 ] ; then
        arch_error="$arch_error "$BUILDNAME"FAIL/$error/$end/$logfile"
    fi
    case $BUILDNAME in
	*FIRMWARE*)
	    mkdir -p $PUBDIRJIG-firmware/$ARCH
	    cp log/$logfile $PUBDIRJIG-firmware/$ARCH/$BUILDNAME.log
	    ;;
	*)
	    mkdir -p $PUBDIRJIG/$ARCH
	    cp log/$logfile $PUBDIRJIG/$ARCH/$BUILDNAME.log
	    ;;
    esac
}

catch_parallel_builds () {
    # Catch parallel builds here                                                                                               
    while [ "$BUILDS_RUNNING"x != ""x  ] ; do
	BUILDS_STILL_RUNNING=""
	for BUILDNAME in $BUILDS_RUNNING; do
            if [ -e $PUBDIRJIG/$arch/$BUILDNAME-trace ] ; then
		build_finished $arch $BUILDNAME
            else
		BUILDS_STILL_RUNNING="$BUILDS_STILL_RUNNING $BUILDNAME"
            fi
	done
	BUILDS_RUNNING=$BUILDS_STILL_RUNNING
	if [ "$BUILDS_RUNNING"x != ""x  ] ; then
            sleep 1
	fi
    done
    if [ "$arch_error"x = ""x ] ; then
	arch_error="none"
    fi
    arch_end=`now`
    arch_time=`calc_time $arch_start $arch_end`
    echo "$arch build started at $arch_start, ended at $arch_end (took $arch_time), error(s) $arch_error"
}

# Slightly complicated setup
# iso-*   dirs have checksums for ISO files only
# bt-*    dirs have checksums for ISO and torrrent files only
# jigdo-* dirs have checksums for ISO and jigdo files only
#
# Uses the imagesums tool from debian-cd to grab pre-calculated ISO
# checksums from the jigdo files where possible, to save a lot of time
generate_checksums_for_arch () {
    ARCH=$1
    JIGDO_DIR=$2
    ISO_DIR=$(echo $JIGDO_DIR | sed 's,jigdo-,iso-,g')
    BT_DIR=$(echo $JIGDO_DIR | sed 's,jigdo-,bt-,g')

    # Do the torrents first, if they exist
    if [ -e $BT_DIR ]; then
	$TOPDIR/debian-cd/tools/imagesums $BT_DIR $EXTENSION > /dev/null
    fi

    # Now do the jigdos, if they exist
    if [ -e $JIGDO_DIR ]; then
	$TOPDIR/debian-cd/tools/imagesums $JIGDO_DIR $EXTENSION > /dev/null
	# And grep out the .iso checksums from there to the iso directory
	for file in $JIGDO_DIR/*SUMS*${EXTENSION}; do
	    out=$ISO_DIR/$(basename $file)
	    grep \\.iso $file > $out
	done
	if [ -e $BT_DIR ]; then
	    # Ditto for the bt directory
	    for file in $JIGDO_DIR/*SUMS*${EXTENSION}; do
		out=$BT_DIR/$(basename $file)
		grep \\.iso $file >> $out
	    done
	fi
    else
	# No jigdos, so do the ISOs by hand
	$TOPDIR/debian-cd/tools/imagesums $ISO_DIR $EXTENSION > /dev/null
	if [ -e $BT_DIR ]; then
	    for file in $ISO_DIR/*SUMS*${EXTENSION}; do
		out=$BT_DIR/$(basename $file)
		grep \\.iso $file >> $out
	    done
	fi
    fi
}

catch_live_builds () {
    # Catch parallel build types here

    if [ "$NOLIVE"x = ""x ] && [ "$NOOPENSTACK"x = ""x ] ; then
	return
    fi
    
    while [ ! -f $PUBDIRLIVETRACE ] || [ ! -f $PUBDIROSTRACE ] ; do
	sleep 1
    done

    . $PUBDIROSTRACE
    time_spent=`calc_time $start $end`
    echo "openstack build started at $start, ended at $end (took $time_spent), error $error"

    . $PUBDIRLIVETRACE
    time_spent=`calc_time $start $end`
    echo "live builds started at $start, ended at $end (took $time_spent), error $error"

}

arch_has_firmware () {
    arch=$1
    for arch1 in $ARCHES_FIRMWARE; do
        if [ "$arch" = "$arch1" ] ; then
	    return 0
	fi
    done
    return 1
}

get_archive_serial () {
    trace_file="$MIRROR/project/trace/ftp-master.debian.org"
    if [ -f "$trace_file" ]; then
        awk '/^Archive serial: / {print $3}' "$trace_file"
    else
        echo 'unknown'
    fi
}

rsync_to_pettersson () {
    LOCAL=$1
    REMOTE=$2
    OPTIONS="$3"
    rsync -az --delete $OPTIONS $LOCAL sync-to-pettersson:$REMOTE
}

publish_on_pettersson () {
    TARGETS="$@"
    echo "$TARGETS" | ssh publish-on-pettersson ./bin/receive_from_casulana
}

