mkCTM revision 19813
166458Sdfr#!/usr/local/bin/tclsh7.4
266458Sdfr
366458Sdfr#############################################################################
466458Sdfr### Do we already have this delta ?
566458Sdfr#############################################################################
666458Sdfr
766458Sdfrproc find_delta {nbr} {
866458Sdfr    global CTMname CTMdest
966458Sdfr    if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 }
1066458Sdfr    if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 }
1169811Smarcel    return 0
1266458Sdfr}
1366458Sdfr
1485532Sru#############################################################################
1585532Sru### The top level code...
1666458Sdfr#############################################################################
1766458Sdfr
1866458Sdfrset CTMSW	/home/ctm/SW
1966458Sdfr
20169612Swkoszekcd $CTMSW
2166458Sdfr
2266458Sdfr# Defaults...
2366458Sdfrset CTMapply 1
2466458Sdfrset CTMignore {^///}
2566458Sdfrset CTMbogus {\.core$}
2666458Sdfrset CTMmail {}
2766458Sdfrset CTMqueue {}
2879014Simpset CTMqueuemail {}
2966458Sdfrset CTMmaxctm 10000000
3066458Sdfrset CTMmaxmsg 100000
3185909Simpset CTMsuff {}
3266458Sdfrset CTMdate     [exec date -u +%Y%m%d%H%M%SZ]
33115084Smarcelset CTMtmp  {}
34115084Smarcelset CTMcopy  {}
35105022Smarcelset CTMdest  {}
36105022Smarcelset CTMprefix  .
3766458Sdfrset CTMtest 0
3866458Sdfrset CTMspecial 0
3966458Sdfrset CTMscan .
4066458Sdfrset CTMfirst 0
4166458Sdfrset max_damage 100
4266458Sdfr
4369135Speterset damage 0
4466458Sdfrset changes 0
4569135Speter
4666458Sdfrsource $argv
4769135Speterexec sh -c "date -u '+%y%m%d%H%M%S $argv'" >> ${CTMSW}/log
4866458Sdfr
4966458Sdfrif {$CTMtmp == ""} {
5066458Sdfr    set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff}
5186276Simp}
5286276Simpif {$CTMcopy == ""} {
5385909Simp    set CTMcopy $CTMSW/../$CTMname
54}
55if {$CTMdest == ""} {
56    set CTMdest $CTMSW/../CTM-pub/$CTMname
57}
58
59# Make sure we only run one at a time...
60
61set CTMlock Lck.${CTMname}.${CTMdate}.[pid]
62exec rm -f ${CTMlock}
63exec echo starting > ${CTMlock}
64if {[catch "exec ln $CTMlock LCK.$CTMname" a]} {
65	puts "Not going, lock exists..."
66	exec rm -f $CTMlock
67	exit 1
68}
69exec rm -f $CTMlock
70set CTMlock LCK.$CTMname
71
72set CTMscratch ${CTMtmp}.tmp
73
74while 1 {
75    if { ! $CTMspecial} {
76	if {$CTMfirst} {
77		set CTMnbr 0
78	} else {
79		set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1]
80	}
81
82	if {$CTMnbr > 0 && ![find_delta $CTMnbr]} {
83	    puts "$CTMname delta $CTMnbr doesn't exist..."
84	    exec rm -f $CTMlock
85	    exit 1
86	}
87
88	incr CTMnbr
89
90	if {[find_delta $CTMnbr]} {
91	    puts "$CTMname delta $CTMnbr does already exist..."
92	    exec rm -f $CTMlock
93	    exit 1
94	}
95
96	set fo [open $CTMref/.ctm_status w]
97	puts $fo "$CTMname $CTMnbr"
98	close $fo
99	incr changes -1
100
101    } else {
102	set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1]
103    }
104
105    puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate"
106    flush stdout
107    exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout
108
109    set  nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff]
110
111    set x1 $CTMcopy
112    if {$x1 == ""} {
113	exec mkdir ${CTMtmp}.dir
114	set x1 ${CTMtmp}.dir
115    }
116    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]
117
118    if {$r1} {
119	puts "problems, stopping now."
120        puts "errorCode $errorCode"
121	puts "$r2"
122        exec rm -f $CTMlock
123	exit 1
124    }
125	
126    puts "mkctm done"
127
128    if {$CTMtest} {
129	puts "testing, stopping now."
130        exec rm -f $CTMlock
131	exit 0
132    }
133    if {$CTMapply} {
134	    puts "Applying delta"
135	    flush stdout
136	    exec echo now applying > $CTMlock
137	    exec sh -e -c "cd $CTMcopy ; $CTMSW/ctm -v -v -v ${CTMtmp}:${nm}.gz" >& ${CTMtmp}.apply
138	    exec echo did apply > $CTMlock
139    }
140    puts "Moving delta"
141    flush stdout
142    exec mv ${CTMtmp}:${nm}.gz $CTMdest/.CTMtmp_${nm}.gz >&@ stdout
143    exec mv $CTMdest/.CTMtmp_${nm}.gz $CTMdest/${nm}.gz >&@ stdout
144    exec echo moved > $CTMlock
145
146    exec sh -c "rm -rf ${CTMtmp}.*" >&@ stdout
147
148    if {$CTMmail != ""} {
149	puts "Mailing delta"
150	flush stdout
151	exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm $CTMdest/${nm}.gz $CTMmail >&@ stdout
152	if {$CTMqueue != "" && $CTMqueuemail != ""} {
153	    puts "Queueing delta"
154	    flush stdout
155	    exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm -q $CTMqueue $CTMdest/${nm}.gz $CTMqueuemail >&@ stdout
156	    puts "Sending initial two deltas"
157	    flush stdout
158	    exec $CTMSW/ctm_dequeue -n 2 $CTMqueue >&@ stdout
159	}
160    }
161    exec echo mailed > $CTMlock
162
163    # If we did an absolute delta: stop.
164    if {$CTMsuff != ""} break
165
166    # Make a absolute delta (!) every 100 deltas
167    if {$CTMnbr == 0 || ($CTMnbr % 100)} break
168
169    # Make an absolute delta too...
170    set CTMref $CTMcopy
171    set CTMsuff A
172    set CTMcopy ""
173    set CTMmail ""
174    set CTMqueue ""
175    set CTMqueuemail ""
176    set CTMapply 0
177    set CTMspecial 1
178    exec rm -f $CTMlock
179}
180puts "done."
181exec rm -f $CTMlock
182