blob: 02b154427e9a20baa73c0ba39039ab9288d2beda (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
#!/usr/local/bin/tclsh7.4
#
# $FreeBSD$
#############################################################################
### Do we already have this delta ?
#############################################################################
proc find_delta {nbr} {
global CTMname CTMdest
if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 }
if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 }
return 0
}
#############################################################################
### The top level code...
#############################################################################
set CTMSW /home/ctm/SW
cd $CTMSW
# Defaults...
set CTMapply 1
set CTMignore {^///}
set CTMbogus {\.core$}
set CTMmail {}
set CTMqueue {}
set CTMqueuemail {}
set CTMmaxctm 10000000
set CTMmaxmsg 100000
set CTMsuff {}
set CTMdate [exec date -u +%Y%m%d%H%M%SZ]
set CTMtmp {}
set CTMcopy {}
set CTMdest {}
set CTMprefix .
set CTMtest 0
set CTMspecial 0
set CTMscan .
set CTMfirst 0
set max_damage 100
set damage 0
set changes 0
source $argv
exec sh -c "date -u '+%Y%m%d%H%M%S $argv'" >> ${CTMSW}/log
if {$CTMtmp == ""} {
set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff}
}
if {$CTMcopy == ""} {
set CTMcopy $CTMSW/../$CTMname
}
if {$CTMdest == ""} {
set CTMdest $CTMSW/../CTM-pub/$CTMname
}
# Make sure we only run one at a time...
set CTMlock Lck.${CTMname}.${CTMdate}.[pid]
exec rm -f ${CTMlock}
exec echo starting > ${CTMlock}
if {[catch "exec ln $CTMlock LCK.$CTMname" a]} {
puts "Not going, lock exists..."
exec rm -f $CTMlock
exit 1
}
exec rm -f $CTMlock
set CTMlock LCK.$CTMname
set CTMscratch ${CTMtmp}.tmp
while 1 {
if { ! $CTMspecial} {
if {$CTMfirst} {
set CTMnbr 0
} else {
set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1]
}
if {$CTMnbr > 0 && ![find_delta $CTMnbr]} {
puts "$CTMname delta $CTMnbr doesn't exist..."
exec rm -f $CTMlock
exit 1
}
incr CTMnbr
if {[find_delta $CTMnbr]} {
puts "$CTMname delta $CTMnbr does already exist..."
exec rm -f $CTMlock
exit 1
}
set fo [open $CTMref/.ctm_status w]
puts $fo "$CTMname $CTMnbr"
close $fo
incr changes -1
} else {
set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1]
}
puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate"
flush stdout
exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout
set nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff]
set x1 $CTMcopy
if {$x1 == ""} {
exec mkdir ${CTMtmp}.dir
set x1 ${CTMtmp}.dir
}
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]
if {$r1} {
if {[lindex $errorCode 2] == 4} {
puts "No changes, stopping."
exec rm -f $CTMlock
exit 0
}
puts "problems, stopping now."
puts "errorCode $errorCode"
puts "$r2"
exec rm -f $CTMlock
exit 1
}
puts "mkctm done"
if {$CTMtest} {
puts "testing, stopping now."
exec rm -f $CTMlock
exit 0
}
if {$CTMapply} {
puts "Applying delta"
flush stdout
exec echo now applying > $CTMlock
exec sh -e -c "cd $CTMcopy ; $CTMSW/ctm -v -v -v ${CTMtmp}:${nm}.gz" >& ${CTMtmp}.apply
exec echo did apply > $CTMlock
}
puts "Moving delta"
flush stdout
exec mv ${CTMtmp}:${nm}.gz $CTMdest/.CTMtmp_${nm}.gz >&@ stdout
exec mv $CTMdest/.CTMtmp_${nm}.gz $CTMdest/${nm}.gz >&@ stdout
exec echo moved > $CTMlock
exec sh -c "rm -rf ${CTMtmp}.*" >&@ stdout
if {$CTMmail != ""} {
puts "Mailing delta"
flush stdout
exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm $CTMdest/${nm}.gz $CTMmail >&@ stdout
if {$CTMqueue != "" && $CTMqueuemail != ""} {
puts "Queueing delta"
flush stdout
exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm -q $CTMqueue $CTMdest/${nm}.gz $CTMqueuemail >&@ stdout
puts "Sending initial two deltas"
flush stdout
exec $CTMSW/ctm_dequeue -n 2 $CTMqueue >&@ stdout
}
}
exec echo mailed > $CTMlock
# If we did an absolute delta: stop.
if {$CTMsuff != ""} break
# Make an absolute delta (!) every 100 deltas
if {$CTMnbr == 0 || ($CTMnbr % 100)} break
# Make an absolute delta too...
set CTMref $CTMcopy
set CTMsuff A
set CTMcopy ""
set CTMmail ""
set CTMqueue ""
set CTMqueuemail ""
set CTMapply 0
set CTMspecial 1
exec rm -f $CTMlock
}
puts "done."
exec rm -f $CTMlock
|