#!/bin/bash
#
# $Id$
# 
# (c) Steve McIntyre <stevem@chiark.greenend.org.uk> Released under
# GNU GPL v2 1st January 2001
#
# Quick and dirty script to create update CDs for people to upgrade
# from an initial stable release (r0) to the latest point release level
#

set -e

# Configuration goes here.

# Where is your mirror?
MIRROR_NORM=/org/cdbuilder.debian.org/src/ftp/debian
MIRROR_AMD64=/org/cdbuilder.debian.org/src/ftp/debian-amd64/debian

# If you have a non-US mirror, where is it? Leave blank if you don't have one.
# NONUS=${NONUS:-/mirror/debian-non-US}

# Do you want non-free? 1 for yes, 0 for no
NONFREE=0

# What release version is this?
VER=4.0r1

# Is this an official CD?
OFFICIAL=Official
# OFFICIAL="Unofficial snapshot"

# Path to use with mkisofs/mkhybrid
#MKISOFS=${MKISOFS:-"mkhybrid"}
MKISOFS=$PWD/../mkisofs/usr/bin/mkisofs

# Use JTE extensions to mkisofs to make jigdo files?
JTE=1

# The working directory to use. MUST be on the same partition as the mirror.
TDIR=/org/cdbuilder.debian.org/src/deb-cd/tmp/etch-update/cd-work

# Building etch cd set ...
CODENAME=etch

# Path where the images will be written
OUT=/org/cdbuilder.debian.org/src/deb-cd/tmp/etch-update/cd-out

# Location(s) for the snapshot(s)
SNAPSHOT='Debian=http://us.cdimage.debian.org/cdimage/snapshot/Debian/ --try-last'

# Type of disc image, cd or dvd (lower case)
if [ "$1"x = ""x ] ; then
    TYPE=cd
else
    TYPE=$1
fi
case $TYPE in
    cd|CD)
    TYPE=cd
    TYPEUP=CD;;
    dvd|DVD)
    TYPE=dvd
    TYPEUP=DVD;;
    *)
    echo "Specify a disk type..."
    exit 1;;
esac

# Location of the diff file to use to determine the changes. If you leave
# this blank, we'll try to determine the changes from the ChangeLog files,
# which is probably less accurate. 
DIFF=/home/deb-cd/r0-r1.diff

if [ "$TYPE" = "cd" ] ; then
    CDSIZE=610 # megabytes, leaving space for metadata
else
    CDSIZE=4300 # megabytes, leaving space for metadata
fi

REL=Debian"$VER"
CLOG=dists/$CODENAME/ChangeLog
NUCLOG=dists/$CODENAME/non-US/ChangeLog
UPD=$TDIR/$CODENAME-update
DATE=`date +%Y%m%d`
BASEDIR=`pwd`
SECTS="main non-free contrib"
VERBOSE=2
GRAB_MD5=$BASEDIR/tools/grab_md5
export VERBOSE BASEDIR SECTS

FIRSTVER=`echo $VER | sed 's?r.*$?r0?g'`
VERSPACE=`echo $VER | sed 's?r? r?g'`
CAPCODE=`perl -e "print ucfirst("$CODENAME")"`

export FIRSTVER VERSPACE CAPCODE

if [ "$ARCHLIST"x = ""x ] ; then
    ARCHLIST="alpha amd64 arm hppa i386 ia64 mips mipsel powerpc s390 sparc source" # amd64 # all dealt with specially
fi

export TDIR NONFREE NONUS VER MIRROR CODENAME OUT BASEDIR

CDSIZE=$(($CDSIZE * 1024))

scanpackages=$BASEDIR/tools/scanpackages.old
scansources=$BASEDIR/tools/scansources.old
set_mkisofs_opts=$BASEDIR/tools/set_mkisofs_opts
addfiles=$BASEDIR/tools/add_files

create_control_files () {
    CDDIR=$1
    shift
    ARCHES=$*
    echo "  Creating control files for \"$ARCHES\" on $CDDIR"
    for ARCH in $ARCHES
    do
        case "$ARCH" in
            source)
                echo "    source"
                for SECT in $SECTS
                do
                    mkdir -p $CDDIR/dists/$CODENAME/$SECT/source
                    mkdir -p $CDDIR/dists/$CODENAME/non-US/$SECT/source
                done
                cd $UPD
                $scansources $CDDIR >/dev/null 2>&1
                ;;
            all)
                ;;
            *)
                echo "    $ARCH"
                for SECT in $SECTS
                do
                    mkdir -p $CDDIR/dists/$CODENAME/$SECT/binary-$ARCH
                    mkdir -p $CDDIR/dists/$CODENAME/non-US/$SECT/binary-$ARCH
                done
                ARCH=$ARCH $scanpackages scan $CDDIR >/dev/null 2>&1
                ARCH=$ARCH $scanpackages -noPackages.cd install $CDDIR >/dev/null 2>&1
                rm -f $CDDIR/*.Packages* >/dev/null 2>&1
                ;;
        esac
    done
}

copy_file () {
    ROOTDIR=$1
	shift
	FILE=$1
    DIR=`dirname $FILE`
    if [ ! -d $ROOTDIR/$DIR ] ; then
        mkdir -p $ROOTDIR/$DIR
    fi
	if [ -e $MIRROR/$FILE ] ; then
		cp -l $MIRROR/$FILE $ROOTDIR/$FILE
	elif [ -e $NONUS/$FILE ] ; then
		cp -l $NONUS/$FILE $ROOTDIR/$FILE
	else
		echo
		echo "File $FILE not found!"
		exit 1
	fi
}

make_cd () {
	CDNUM=$1
	shift
	THISNUM=$1
	shift
	THISARCH=$1
	shift
	SRCFILES=$1
	shift
	ARCHFILES=$1
	shift
	ALLFILES=$1
	echo
	echo "  Creating Packages and Sources files for CD$CDNUM"
	cd $UPD
	create_control_files CD$CDNUM $THISARCH
	echo "  Creating image for CD$CDNUM ($SRCFILES source files, $ARCHFILES $ARCH debs, $ALLFILES all debs)"
	echo -n "    "
	if [ ! -d $OUT/$THISARCH/iso-$TYPE ] ; then
	    mkdir -p $OUT/$THISARCH/iso-$TYPE
	fi
	if [ $JTE = 1 ] ; then
	    if [ ! -d $OUT/$THISARCH/jigdo-$TYPE ] ; then
		mkdir -p $OUT/$THISARCH/jigdo-$TYPE
	    fi
		${MKISOFS} -J -r -V "Debian $VER update $TYPEUP" -o \
			$OUT/$THISARCH/iso-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.iso \
			-jigdo-jigdo $OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.jigdo \
			-jigdo-template $OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.template \
			-jigdo-map Debian=$MIRROR/ \
			-jigdo-map Non-US=$NONUS/ \
			-jigdo-force-md5 /pool/ \
			-md5-list $UPD/md5-check \
			$UPD/CD$CDNUM 2>&1 | grep "extents written"
		$BASEDIR/tools/jigdo_cleanup \
			$OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.jigdo \
			debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.iso \
			$OUT debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.template \
			"Debian GNU/Linux $VERSPACE - $OFFICIAL $THISARCH $FIRSTVER->$VER update $TYPEUP #$THISNUM"
		echo $SNAPSHOT >> $OUT/$THISARCH/jigdo-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.jigdo
        # Make sure that the ISO is as new/newer than the jigdo file; #587774
        touch $OUT/$THISARCH/iso-$TYPE/debian-update-$VER-$THISARCH-$TYPEUP-$THISNUM.iso
	else
		${MKISOFS} -J -r -V "Debian $VER update $TYPEUP" -o \
		$OUT/iso-$TYPE/$CODENAME-update-$THISARCH-$TYPEUP-$THISNUM.iso \
		$UPD/CD$CDNUM 2>&1 | grep "extents written"
	fi
}


echo Cleaning up
rm -rf $UPD
mkdir -p $UPD
CDNUM=1

echo Creating file list

if [ ! -e $DIFF ] ; then
	echo "NO DIFF FOUND. ABORT!"
	exit 1
fi

cp $DIFF $UPD/list
if [ "$NONUS"x == ""x ] ; then
	echo "Removing non-US files from the list"
	grep -v non-US $UPD/list > $UPD/list1
	mv -f $UPD/list1 $UPD/list
fi
if [ "$NONFREE"x != "1"x ] ; then
	echo "Removing non-free files from the list"
	grep -v non-free $UPD/list > $UPD/list1
	mv -f $UPD/list1 $UPD/list
fi

for THISARCH in $ARCHLIST
do
	THISNUM=0

	MIRROR=$MIRROR_NORM

	rm -f $UPD/md5-check
	$GRAB_MD5 $MIRROR $THISARCH $CODENAME $CODENAME $UPD/md5-check
	if [ "$NONUS"x != ""x ] ; then
		$GRAB_MD5 $NONUS $THISARCH $CODENAME $CODENAME $UPD/md5-check
	fi

	for file in `cat $UPD/list`
	do
		if [ ! -d $UPD/CD$CDNUM ] ; then
			echo
			cd $MIRROR
			THISNUM=$((THISNUM + 1))
			if [ $THISARCH = "source" ] ; then
				echo "Creating $TYPEUP$CDNUM for source (part $THISNUM)"
			else
				echo "Creating $TYPEUP$CDNUM for binary-$THISARCH (part $THISNUM)"
			fi
			mkdir $UPD/CD$CDNUM $UPD/CD$CDNUM/.disk
			INFO="Debian GNU/Linux $VER Update $TYPEUP $DATE: $THISARCH $TYPEUP $THISNUM"
	   		echo $INFO > $UPD/CD$CDNUM/.disk/info
			SIZE_USED=0
			SRCFILES=0
			ARCHFILES=0
			ALLFILES=0
		fi

		SIZE_USED=`du -sk $UPD/CD$CDNUM | awk '{print $1}'`

		if [ $SIZE_USED -gt $CDSIZE ] ; then
			make_cd $CDNUM $THISNUM $THISARCH $SRCFILES $ARCHFILES $ALLFILES
			CDNUM=$(($CDNUM + 1))
			continue
		fi

        case "$THISARCH" in
            source)
				case "$file" in
					*.gz|*.dsc)
						copy_file $UPD/CD$CDNUM $file
						SRCFILES=$(($SRCFILES + 1))
						;;
				esac
				echo -en "\r$SRCFILES copied"
				;;
			*)
				case "$file" in
					*_$THISARCH.deb)
						copy_file $UPD/CD$CDNUM $file
						ARCHFILES=$(($ARCHFILES + 1))
						;;
					*_all.deb)
						copy_file $UPD/CD$CDNUM $file
						ALLFILES=$(($ALLFILES + 1))
						;;
				esac
				echo -en "\r$THISARCH:$ARCHFILES all:$ALLFILES copied"
				;;
		esac
	done
	make_cd $CDNUM $THISNUM $THISARCH $SRCFILES $ARCHFILES $ALLFILES
	CDNUM=$(($CDNUM + 1))
done

