Properly handle an error return from udev2dev().
[dragonfly.git] / usr.sbin / ctm / mkCTM / mkCTM
1 #!/usr/local/bin/tclsh7.4
2
3 #############################################################################
4 ### Do we already have this delta ?
5 #############################################################################
6
7 proc 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
18 set CTMSW       /home/ctm/SW
19
20 cd $CTMSW
21
22 # Defaults...
23 set CTMapply 1
24 set CTMignore {^///}
25 set CTMbogus {\.core$}
26 set CTMmail {}
27 set CTMqueue {}
28 set CTMqueuemail {}
29 set CTMmaxctm 10000000
30 set CTMmaxmsg 100000
31 set CTMsuff {}
32 set CTMdate     [exec date -u +%Y%m%d%H%M%SZ]
33 set CTMtmp  {}
34 set CTMcopy  {}
35 set CTMdest  {}
36 set CTMprefix  .
37 set CTMtest 0
38 set CTMspecial 0
39 set CTMscan .
40 set CTMfirst 0
41 set max_damage 100
42
43 set damage 0
44 set changes 0
45
46 source $argv
47 exec sh -c "date -u '+%Y%m%d%H%M%S $argv'" >> ${CTMSW}/log
48
49 if {$CTMtmp == ""} {
50     set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff}
51 }
52 if {$CTMcopy == ""} {
53     set CTMcopy $CTMSW/../$CTMname
54 }
55 if {$CTMdest == ""} {
56     set CTMdest $CTMSW/../CTM-pub/$CTMname
57 }
58
59 # Make sure we only run one at a time...
60
61 set CTMlock Lck.${CTMname}.${CTMdate}.[pid]
62 exec rm -f ${CTMlock}
63 exec echo starting > ${CTMlock}
64 if {[catch "exec ln $CTMlock LCK.$CTMname" a]} {
65         puts "Not going, lock exists..."
66         exec rm -f $CTMlock
67         exit 1
68 }
69 exec rm -f $CTMlock
70 set CTMlock LCK.$CTMname
71
72 set CTMscratch ${CTMtmp}.tmp
73
74 while 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 }
185 puts "done."
186 exec rm -f $CTMlock