mkCTM revision 19892
1#!/usr/local/bin/tclsh7.4
2
3#############################################################################
4### Do we already have this delta ?
5#############################################################################
6
7proc find_delta {nbr} {
8    global CTMname CTMdest
9    if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 }
10    if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 }
11    return 0
12}
13
14#############################################################################
15### The top level code...
16#############################################################################
17
18set CTMSW	/home/ctm/SW
19
20cd $CTMSW
21
22# Defaults...
23set CTMapply 1
24set CTMignore {^///}
25set CTMbogus {\.core$}
26set CTMmail {}
27set CTMqueue {}
28set CTMqueuemail {}
29set CTMmaxctm 10000000
30set CTMmaxmsg 100000
31set CTMsuff {}
32set CTMdate     [exec date -u +%Y%m%d%H%M%SZ]
33set CTMtmp  {}
34set CTMcopy  {}
35set CTMdest  {}
36set CTMprefix  .
37set CTMtest 0
38set CTMspecial 0
39set CTMscan .
40set CTMfirst 0
41set max_damage 100
42
43set damage 0
44set changes 0
45
46source $argv
47exec sh -c "date -u '+%y%m%d%H%M%S $argv'" >> ${CTMSW}/log
48
49if {$CTMtmp == ""} {
50    set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff}
51}
52if {$CTMcopy == ""} {
53    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	if {[lindex $errorCode 2] == 4} {
120		puts "No changes, stopping."
121		exec rm -f $CTMlock
122		exit 0
123	}
124	puts "problems, stopping now."
125        puts "errorCode $errorCode"
126	puts "$r2"
127        exec rm -f $CTMlock
128	exit 1
129    }
130	
131    puts "mkctm done"
132
133    if {$CTMtest} {
134	puts "testing, stopping now."
135        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