mkCTM revision 19835
190792Sgshapiro#!/usr/local/bin/tclsh7.4
2261363Sgshapiro
390792Sgshapiro#############################################################################
490792Sgshapiro### Do we already have this delta ?
590792Sgshapiro#############################################################################
690792Sgshapiro
790792Sgshapiroproc find_delta {nbr} {
890792Sgshapiro    global CTMname CTMdest
9266692Sgshapiro    if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 }
1090792Sgshapiro    if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 }
1190792Sgshapiro    return 0
1290792Sgshapiro}
1390792Sgshapiro
1490792Sgshapiro#############################################################################
1590792Sgshapiro### The top level code...
1690792Sgshapiro#############################################################################
1790792Sgshapiro
1890792Sgshapiroset CTMSW	/home/ctm/SW
1990792Sgshapiro
2090792Sgshapirocd $CTMSW
2190792Sgshapiro
2290792Sgshapiro# Defaults...
2390792Sgshapiroset CTMapply 1
2490792Sgshapiroset CTMignore {^///}
2590792Sgshapiroset CTMbogus {\.core$}
2690792Sgshapiroset CTMmail {}
2790792Sgshapiroset CTMqueue {}
2890792Sgshapiroset CTMqueuemail {}
2990792Sgshapiroset CTMmaxctm 10000000
3090792Sgshapiroset CTMmaxmsg 100000
31132943Sgshapiroset CTMsuff {}
3290792Sgshapiroset CTMdate     [exec date -u +%Y%m%d%H%M%SZ]
3390792Sgshapiroset CTMtmp  {}
34132943Sgshapiroset CTMcopy  {}
3590792Sgshapiroset CTMdest  {}
3690792Sgshapiroset CTMprefix  .
3790792Sgshapiroset CTMtest 0
3890792Sgshapiroset CTMspecial 0
39132943Sgshapiroset CTMscan .
40132943Sgshapiroset CTMfirst 0
41132943Sgshapiroset max_damage 100
4290792Sgshapiro
4390792Sgshapiroset damage 0
4490792Sgshapiroset changes 0
4590792Sgshapiro
4690792Sgshapirosource $argv
47132943Sgshapiroexec sh -c "date -u '+%y%m%d%H%M%S $argv'" >> ${CTMSW}/log
4890792Sgshapiro
4990792Sgshapiroif {$CTMtmp == ""} {
50132943Sgshapiro    set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff}
5190792Sgshapiro}
5290792Sgshapiroif {$CTMcopy == ""} {
5390792Sgshapiro    set CTMcopy $CTMSW/../$CTMname
5490792Sgshapiro}
5590792Sgshapiroif {$CTMdest == ""} {
5690792Sgshapiro    set CTMdest $CTMSW/../CTM-pub/$CTMname
5790792Sgshapiro}
5890792Sgshapiro
5990792Sgshapiro# Make sure we only run one at a time...
6090792Sgshapiro
6190792Sgshapiroset CTMlock Lck.${CTMname}.${CTMdate}.[pid]
6290792Sgshapiroexec rm -f ${CTMlock}
6390792Sgshapiroexec echo starting > ${CTMlock}
6490792Sgshapiroif {[catch "exec ln $CTMlock LCK.$CTMname" a]} {
6590792Sgshapiro	puts "Not going, lock exists..."
6690792Sgshapiro	exec rm -f $CTMlock
6790792Sgshapiro	exit 1
6890792Sgshapiro}
6990792Sgshapiroexec rm -f $CTMlock
7090792Sgshapiroset CTMlock LCK.$CTMname
7190792Sgshapiro
7290792Sgshapiroset CTMscratch ${CTMtmp}.tmp
7390792Sgshapiro
7490792Sgshapirowhile 1 {
7590792Sgshapiro    if { ! $CTMspecial} {
7690792Sgshapiro	if {$CTMfirst} {
7790792Sgshapiro		set CTMnbr 0
7890792Sgshapiro	} else {
7990792Sgshapiro		set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1]
8090792Sgshapiro	}
8190792Sgshapiro
8290792Sgshapiro	if {$CTMnbr > 0 && ![find_delta $CTMnbr]} {
8390792Sgshapiro	    puts "$CTMname delta $CTMnbr doesn't exist..."
8490792Sgshapiro	    exec rm -f $CTMlock
8590792Sgshapiro	    exit 1
8690792Sgshapiro	}
8790792Sgshapiro
8890792Sgshapiro	incr CTMnbr
8990792Sgshapiro
9090792Sgshapiro	if {[find_delta $CTMnbr]} {
9190792Sgshapiro	    puts "$CTMname delta $CTMnbr does already exist..."
9290792Sgshapiro	    exec rm -f $CTMlock
9390792Sgshapiro	    exit 1
9490792Sgshapiro	}
9590792Sgshapiro
9690792Sgshapiro	set fo [open $CTMref/.ctm_status w]
9790792Sgshapiro	puts $fo "$CTMname $CTMnbr"
9890792Sgshapiro	close $fo
9990792Sgshapiro	incr changes -1
10090792Sgshapiro
10190792Sgshapiro    } else {
10290792Sgshapiro	set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1]
10390792Sgshapiro    }
10490792Sgshapiro
10590792Sgshapiro    puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate"
10690792Sgshapiro    flush stdout
10790792Sgshapiro    exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout
10890792Sgshapiro
10990792Sgshapiro    set  nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff]
11090792Sgshapiro
11190792Sgshapiro    set x1 $CTMcopy
11290792Sgshapiro    if {$x1 == ""} {
11390792Sgshapiro	exec mkdir ${CTMtmp}.dir
11490792Sgshapiro	set x1 ${CTMtmp}.dir
11590792Sgshapiro    }
11690792Sgshapiro    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]
11790792Sgshapiro
11890792Sgshapiro    if {$r1} {
11990792Sgshapiro	if {[lindex $errorCode 2] == 4} {
12090792Sgshapiro		puts "No changes, stopping."
12190792Sgshapiro		exec rm -f $CTMlock
12290792Sgshapiro		exit 0
123132943Sgshapiro	}
12490792Sgshapiro	puts "problems, stopping now."
12590792Sgshapiro        puts "errorCode $errorCode"
126132943Sgshapiro	puts "$r2"
12790792Sgshapiro        exec rm -f $CTMlock
12890792Sgshapiro	exit 1
12990792Sgshapiro    }
13090792Sgshapiro	
13190792Sgshapiro    puts "mkctm done"
13290792Sgshapiro
13390792Sgshapiro    if {$CTMtest} {
13490792Sgshapiro	puts "testing, stopping now."
13590792Sgshapiro        exec rm -f $CTMlock
136	exit 0
137    }
138    if {$CTMapply} {
139	    puts "Applying delta"
140	    flush stdout
141	    exec echo now applying > $CTMlock
142	    exec sh -e -c "cd $CTMcopy ; $CTMSW/ctm -v -v -v ${CTMtmp}:${nm}.gz" >& ${CTMtmp}.apply
143	    exec echo did apply > $CTMlock
144    }
145    puts "Moving delta"
146    flush stdout
147    exec mv ${CTMtmp}:${nm}.gz $CTMdest/.CTMtmp_${nm}.gz >&@ stdout
148    exec mv $CTMdest/.CTMtmp_${nm}.gz $CTMdest/${nm}.gz >&@ stdout
149    exec echo moved > $CTMlock
150
151    exec sh -c "rm -rf ${CTMtmp}.*" >&@ stdout
152
153    if {$CTMmail != ""} {
154	puts "Mailing delta"
155	flush stdout
156	exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm $CTMdest/${nm}.gz $CTMmail >&@ stdout
157	if {$CTMqueue != "" && $CTMqueuemail != ""} {
158	    puts "Queueing delta"
159	    flush stdout
160	    exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm -q $CTMqueue $CTMdest/${nm}.gz $CTMqueuemail >&@ stdout
161	    puts "Sending initial two deltas"
162	    flush stdout
163	    exec $CTMSW/ctm_dequeue -n 2 $CTMqueue >&@ stdout
164	}
165    }
166    exec echo mailed > $CTMlock
167
168    # If we did an absolute delta: stop.
169    if {$CTMsuff != ""} break
170
171    # Make a absolute delta (!) every 100 deltas
172    if {$CTMnbr == 0 || ($CTMnbr % 100)} break
173
174    # Make an absolute delta too...
175    set CTMref $CTMcopy
176    set CTMsuff A
177    set CTMcopy ""
178    set CTMmail ""
179    set CTMqueue ""
180    set CTMqueuemail ""
181    set CTMapply 0
182    set CTMspecial 1
183    exec rm -f $CTMlock
184}
185puts "done."
186exec rm -f $CTMlock
187