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