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