#!/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 potato (2.2r0) to the latest release level
#

set -e

# Configuration goes here.

# Where is your mirror?
MIRROR_NORM=/mirror/debian
MIRROR_AMD64=/mirror/debian-amd64

# 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=1

# What release version is this?
VER=3.1r1

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

# Path to use with mkisofs/mkhybrid
#MKISOFS=${MKISOFS:-"mkhybrid"}
MKISOFS=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=/mirror/sarge-update

# Building woody cd set ...
CODENAME=sarge

# Path where the images will be written
OUT=/mirror/sarge-update

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

# 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=/mirror/lists/$CODENAME/r0-r1.diff #~/r3.diff

CDSIZE=620 # megabytes, leaving space for metadata
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

ARCHLIST="alpha arm hppa i386 ia64 m68k mips mipsel powerpc s390 sparc source" # amd64 # all dealt with specially

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=`echo $FILE | sed 's?/[-_\.A-Za-z0-9\+]*$??'`
    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 [ $JTE = 1 ] ; then
		${MKISOFS} -J -r -V "Debian $VER update CD" -o \
			/dev/null \
			-jigdo-jigdo $OUT/debian-update-$VER-$THISARCH-$THISNUM.jigdo \
			-jigdo-template $OUT/debian-update-$VER-$THISARCH-$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/debian-update-$VER-$THISARCH-$THISNUM.jigdo \
			debian-update-$VER-$THISARCH-$THISNUM.iso \
			$OUT debian-update-$VER-$THISARCH-$THISNUM.template \
			"Debian GNU/Linux $VERSPACE - $OFFICIAL $THISARCH $FIRSTVER->$VER update CD #$THISNUM"
		echo $SNAPSHOT >> $OUT/debian-update-$VER-$THISARCH-$THISNUM.jigdo
	else
		${MKISOFS} -J -r -V "Debian $VER update CD" -o \
		$OUT/$CODENAME-update-$THISARCH-$THISNUM.raw \
		$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

	if [ $THISARCH = amd64 ] ; then
		MIRROR=$MIRROR_AMD64
	else
		MIRROR=$MIRROR_NORM
	fi

	rm -f $UPD/md5-check
	$GRAB_MD5 $MIRROR $THISARCH $CODENAME $UPD/md5-check
	if [ "$NONUS"x != ""x ] ; then
		$GRAB_MD5 $NONUS $THISARCH $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 CD$CDNUM for source (part $THISNUM)"
			else
				echo "Creating CD$CDNUM for binary-$THISARCH (part $THISNUM)"
			fi
			mkdir $UPD/CD$CDNUM $UPD/CD$CDNUM/.disk
			INFO="Debian GNU/Linux $VER Update CD $DATE: $THISARCH CD $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