#!/bin/sh

cd ~

export BK_LICENSE=ACCEPTED

kmajor=2
kminor=$1

date=`date '+%b%Y'`
log=~/log/snapshot-2$kminor-$date.log
bktmp=~/tmp
repo="$bktmp/linux-$kmajor.$kminor"
dontdiff=~/lib/dontdiff
snapbase="/pub/linux/kernel/v2.$kminor/snapshots"
tmpzpatch="$bktmp/patch-$kmajor.$kminor.gz"
tmppatch="$bktmp/patch-$kmajor.$kminor"
tmplog="$bktmp/patch-$kmajor.$kminor.log"
tmpkey="$bktmp/patch-$kmajor.$kminor.key"
homerepo=~/repo/linux-$kmajor.$kminor
getver=/home/jgarzik/bin/get-version.pl

#
# clean up any previous run leavings, timestamp start of this run
#
rm -rf $repo $tmppatch $tmpzpatch $tmplog $tmpkey
echo "" >> $log
echo "" >> $log
date >> $log

#
# pull updates, if any, into $homerepo. default 'bk parent' is used
#
cd $homerepo
echo pull >> $log
bk pull -q 2>&1 >> $log
bk changes -k | head -1 > $tmpkey

#
# discover most recent kernel version
#
tmptagver=`bk changes | grep 'TAG: v' | head -1 | awk '{print $2}'`
kmicro=`echo $tmptagver | $getver -m`
kextra=`echo $tmptagver | $getver -e`
kversion="$kmajor.$kminor.$kmicro$kextra"
snapdir="$snapbase"		# /$kversion
echo "found kernel version $kversion" >> $log

#
# find and destroy old snapshots, where "old" is defined as any snapshot
# for a kernel prior to the current one
#
echo "checking for old snapshots" >> $log
rm -f $bktmp/tmp*
ls $snapdir | grep patch | grep -v "$kversion" > $bktmp/tmp1
if [ -s $bktmp/tmp1 ]; then
	echo "moving old snapshots:" >> $log
	cat $bktmp/tmp1 >> $log

	( cd $snapdir ; mv `cat $bktmp/tmp1` "$snapdir/old" )
fi
rm -f $bktmp/tmp*

#
# figure out snapshot number of snapshot being created
#
snapnum=1
prevsnap=x
while [ -f "$snapdir/patch-$kversion-bk$snapnum.gz" ]
do
	prevsnap=$snapnum
	snapnum=`expr $snapnum + 1`
done
echo "creating snapshot number $snapnum, previous: $prevsnap" >> $log

snapfn="$snapdir/patch-$kversion-bk$snapnum.gz"
prevsnaplog="$snapdir/patch-$kversion-bk$prevsnap.log"
snaplog="$snapdir/patch-$kversion-bk$snapnum.log"
snapkey="$snapdir/patch-$kversion-bk$snapnum.key"

#
# see if there are any changes yet in a new kernel version
#
bk export -tpatch -h -T -du -rv$kversion, > $tmppatch
if [ ! -s "$tmppatch" ]; then
	echo "no BK-only changes yet, skipping snapshot" >> $log
	rm -rf $repo $tmppatch $tmpzpatch $tmplog $tmpkey
	exit 0
fi
rm -f $tmppatch

#
# create changelog for BK-only change,s and use that
# output as metric for deciding if this snapshot would be equal
# to the previous one
#
echo "generating change log" >> $log
bk changes -rv$kversion.. > $tmplog

if [ -f "$prevsnaplog" ]; then
	if cmp -s "$prevsnaplog" "$tmplog"
	then
		echo "no change in patches, skipping snapshot" >> $log
		rm -rf $repo $tmpzpatch $tmplog $tmpkey
		exit 0
	fi
fi

#
# create a throwaway clone, that will contain our EXTRAVERSION update
#
echo clone >> $log
bk clone -ql $homerepo $repo 2>&1 >> $log

#
# update EXTRAVERSION/SUBLEVEL
#
cd $repo
echo "hacking makefile" >> $log
bk edit -q Makefile 2>&1 >> $log
sed -e "s/^SUBLEVEL.*=.*$/SUBLEVEL = $kmicro/g" < Makefile > x
mv x Makefile
sed -e "s/^EXTRAVERSION.*=.*$/EXTRAVERSION = $kextra-bk$snapnum/g" < Makefile > x
mv x Makefile
bk delta "-yrelease bk$snapnum" -q Makefile 2>&1 >> $log
bk commit "-yrelease bk$snapnum" -q 2>&1 >> $log

#
# generate GNU patch snapshot, containing all changes past
# the point of the last released kernel
#
echo "generating and compressing patch" >> $log
bk export -tpatch -h -T -du -rv$kversion, | gzip -9c > $tmpzpatch

#
# log info about the patch, and send it out to FTP site
#
echo "patch file details:" >> $log
ls -l $tmpzpatch 2>&1 >> $log
md5sum $tmpzpatch 2>&1 >> $log

echo "moving patch and cleaning up" >> $log
mv $tmpzpatch $snapfn
mv $tmplog $snaplog
mv $tmpkey $snapkey
cd ~
rm -rf $repo
exit 0

