115702Sphk#!/usr/local/bin/tclsh7.4
2108533Sschweikh#
3108533Sschweikh# $FreeBSD$
42886Sphk
56563Sphk#############################################################################
66563Sphk### Do we already have this delta ?
76563Sphk#############################################################################
86563Sphk
96563Sphkproc find_delta {nbr} {
106563Sphk    global CTMname CTMdest
116563Sphk    if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 }
126563Sphk    if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 }
136563Sphk    return 0
146563Sphk}
156563Sphk
166563Sphk#############################################################################
176563Sphk### The top level code...
186563Sphk#############################################################################
196563Sphk
206563Sphkset CTMSW	/home/ctm/SW
216563Sphk
226563Sphkcd $CTMSW
236563Sphk
246563Sphk# Defaults...
256563Sphkset CTMapply 1
2619813Sphkset CTMignore {^///}
2719813Sphkset CTMbogus {\.core$}
286563Sphkset CTMmail {}
2918110Speterset CTMqueue {}
3018110Speterset CTMqueuemail {}
3118110Speterset CTMmaxctm 10000000
3218110Speterset CTMmaxmsg 100000
336563Sphkset CTMsuff {}
346563Sphkset CTMdate     [exec date -u +%Y%m%d%H%M%SZ]
356563Sphkset CTMtmp  {}
366563Sphkset CTMcopy  {}
376563Sphkset CTMdest  {}
386563Sphkset CTMprefix  .
396563Sphkset CTMtest 0
406777Sphkset CTMspecial 0
417463Sphkset CTMscan .
427463Sphkset CTMfirst 0
4319813Sphkset max_damage 100
446563Sphk
456563Sphkset damage 0
466563Sphkset changes 0
476563Sphk
486563Sphksource $argv
4942832Sdannyexec sh -c "date -u '+%Y%m%d%H%M%S $argv'" >> ${CTMSW}/log
506563Sphk
516563Sphkif {$CTMtmp == ""} {
526563Sphk    set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff}
536563Sphk}
546563Sphkif {$CTMcopy == ""} {
556563Sphk    set CTMcopy $CTMSW/../$CTMname
566563Sphk}
576563Sphkif {$CTMdest == ""} {
586563Sphk    set CTMdest $CTMSW/../CTM-pub/$CTMname
596563Sphk}
606563Sphk
616788Sphk# Make sure we only run one at a time...
626788Sphk
6315702Sphkset CTMlock Lck.${CTMname}.${CTMdate}.[pid]
646788Sphkexec rm -f ${CTMlock}
656788Sphkexec echo starting > ${CTMlock}
667463Sphkif {[catch "exec ln $CTMlock LCK.$CTMname" a]} {
676788Sphk	puts "Not going, lock exists..."
686788Sphk	exec rm -f $CTMlock
6919813Sphk	exit 1
706788Sphk}
716788Sphkexec rm -f $CTMlock
726788Sphkset CTMlock LCK.$CTMname
736788Sphk
746563Sphkset CTMscratch ${CTMtmp}.tmp
756563Sphk
762886Sphkwhile 1 {
776777Sphk    if { ! $CTMspecial} {
787463Sphk	if {$CTMfirst} {
797463Sphk		set CTMnbr 0
807463Sphk	} else {
817463Sphk		set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1]
827463Sphk	}
832886Sphk
847463Sphk	if {$CTMnbr > 0 && ![find_delta $CTMnbr]} {
856563Sphk	    puts "$CTMname delta $CTMnbr doesn't exist..."
866788Sphk	    exec rm -f $CTMlock
8719813Sphk	    exit 1
886563Sphk	}
892886Sphk
906563Sphk	incr CTMnbr
912886Sphk
926563Sphk	if {[find_delta $CTMnbr]} {
936563Sphk	    puts "$CTMname delta $CTMnbr does already exist..."
946788Sphk	    exec rm -f $CTMlock
9519813Sphk	    exit 1
966563Sphk	}
972886Sphk
986563Sphk	set fo [open $CTMref/.ctm_status w]
996563Sphk	puts $fo "$CTMname $CTMnbr"
1006563Sphk	close $fo
1016563Sphk	incr changes -1
1023833Sphk
1036563Sphk    } else {
1046563Sphk	set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1]
1056777Sphk    }
1066777Sphk
1076777Sphk    puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate"
1086563Sphk    flush stdout
1096563Sphk    exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout
1102886Sphk
11119813Sphk    set  nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff]
1122886Sphk
11319813Sphk    set x1 $CTMcopy
11419813Sphk    if {$x1 == ""} {
11519813Sphk	exec mkdir ${CTMtmp}.dir
11619813Sphk	set x1 ${CTMtmp}.dir
1175014Sphk    }
11819892Sphk    set r1 [catch "exec ${CTMSW}/mkctm -I ${CTMignore} -B ${CTMbogus} -l ${CTMtmp}.log -D $max_damage $CTMname $CTMnbr $CTMdate . $x1 $CTMref | md5 -p | gzip -9 > ${CTMtmp}:${nm}.gz 2>@ stderr" r2]
1195014Sphk
12019813Sphk    if {$r1} {
12119835Sphk	if {[lindex $errorCode 2] == 4} {
12219835Sphk		puts "No changes, stopping."
12319835Sphk		exec rm -f $CTMlock
12419835Sphk		exit 0
12519835Sphk	}
12619813Sphk	puts "problems, stopping now."
12719813Sphk        puts "errorCode $errorCode"
12819813Sphk	puts "$r2"
1296788Sphk        exec rm -f $CTMlock
13019813Sphk	exit 1
1316563Sphk    }
13219813Sphk	
13319813Sphk    puts "mkctm done"
1342886Sphk
1356563Sphk    if {$CTMtest} {
1366563Sphk	puts "testing, stopping now."
1376788Sphk        exec rm -f $CTMlock
1386563Sphk	exit 0
1396563Sphk    }
1406563Sphk    if {$CTMapply} {
1416563Sphk	    puts "Applying delta"
1426563Sphk	    flush stdout
1436788Sphk	    exec echo now applying > $CTMlock
14419813Sphk	    exec sh -e -c "cd $CTMcopy ; $CTMSW/ctm -v -v -v ${CTMtmp}:${nm}.gz" >& ${CTMtmp}.apply
1456788Sphk	    exec echo did apply > $CTMlock
1466563Sphk    }
1476563Sphk    puts "Moving delta"
1486563Sphk    flush stdout
1496563Sphk    exec mv ${CTMtmp}:${nm}.gz $CTMdest/.CTMtmp_${nm}.gz >&@ stdout
1506563Sphk    exec mv $CTMdest/.CTMtmp_${nm}.gz $CTMdest/${nm}.gz >&@ stdout
1516788Sphk    exec echo moved > $CTMlock
1526563Sphk
15319813Sphk    exec sh -c "rm -rf ${CTMtmp}.*" >&@ stdout
15419813Sphk
1556563Sphk    if {$CTMmail != ""} {
1566563Sphk	puts "Mailing delta"
1576563Sphk	flush stdout
15818110Speter	exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm $CTMdest/${nm}.gz $CTMmail >&@ stdout
15918110Speter	if {$CTMqueue != "" && $CTMqueuemail != ""} {
16018110Speter	    puts "Queueing delta"
16118110Speter	    flush stdout
16218110Speter	    exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm -q $CTMqueue $CTMdest/${nm}.gz $CTMqueuemail >&@ stdout
16318115Speter	    puts "Sending initial two deltas"
16418115Speter	    flush stdout
16518115Speter	    exec $CTMSW/ctm_dequeue -n 2 $CTMqueue >&@ stdout
16618110Speter	}
1676563Sphk    }
1686788Sphk    exec echo mailed > $CTMlock
1696563Sphk
1706563Sphk    # If we did an absolute delta: stop.
1716563Sphk    if {$CTMsuff != ""} break
1726563Sphk
173108533Sschweikh    # Make an absolute delta (!) every 100 deltas
1747463Sphk    if {$CTMnbr == 0 || ($CTMnbr % 100)} break
1756563Sphk
1766563Sphk    # Make an absolute delta too...
1776563Sphk    set CTMref $CTMcopy
1786563Sphk    set CTMsuff A
1796563Sphk    set CTMcopy ""
1806563Sphk    set CTMmail ""
18118110Speter    set CTMqueue ""
18218110Speter    set CTMqueuemail ""
1836563Sphk    set CTMapply 0
1846777Sphk    set CTMspecial 1
1857463Sphk    exec rm -f $CTMlock
1865014Sphk}
1876563Sphkputs "done."
1886788Sphkexec rm -f $CTMlock
189