rev |
line source |
pankso@3512
|
1 #!/bin/sh
|
pankso@3512
|
2 # Tazbb - SliTaz Build Bot.
|
pankso@3512
|
3 # System wide config file: /etc/slitaz/tazbb.conf
|
pankso@3512
|
4 #
|
pankso@3512
|
5 # Tazbb is a tool to automate package building, it can be run manually
|
pankso@3512
|
6 # or via a cron job. On SliTaz build host, tazbb is run in a chroot env.
|
pankso@3512
|
7 #
|
pankso@3512
|
8 # (c) 2009 SliTaz GNU/Linux project - GNU gpl v3
|
pankso@3512
|
9 #
|
pankso@3512
|
10
|
pankso@3512
|
11 # Include config file or exit if no file found.
|
pankso@3512
|
12 if [ -f "./tazbb.conf" ]; then
|
pankso@3512
|
13 . ./tazbb.conf
|
pankso@3512
|
14 elif [ -f "/etc/slitaz/tazbb.conf" ]; then
|
pankso@3512
|
15 . /etc/slitaz/tazbb.conf
|
pankso@3512
|
16 else
|
pankso@3512
|
17 echo -e "\nNo config file found: tazbb.conf...\n" && exit 0
|
pankso@3512
|
18 fi
|
pankso@3512
|
19
|
pankso@3512
|
20 # Tazbb is only for root.
|
pankso@3512
|
21 if test $(id -u) != 0 ; then
|
pankso@3512
|
22 echo -e "\nYou must be root to run: `basename $0`.\n" && exit 0
|
pankso@3512
|
23 fi
|
pankso@3512
|
24
|
pankso@3537
|
25 # Let tazbb finish is work and make sure needed files exist.
|
pankso@3512
|
26 if [ -f $LOCK_FILE ]; then
|
pankso@3512
|
27 case $1 in
|
pankso@3512
|
28 usage|list-*|*block)
|
pankso@3512
|
29 continue ;;
|
pankso@3512
|
30 *)
|
pankso@3512
|
31 echo -e "\nTazbb is already running and locked...\n"
|
pankso@3512
|
32 exit 0 ;;
|
pankso@3512
|
33 esac
|
pankso@3512
|
34 else
|
pankso@3512
|
35 mkdir -p $DB_DIR $LOG_DIR
|
pankso@3512
|
36 touch $LOCK_FILE $DB_DIR/blocked
|
pankso@3512
|
37 fi
|
pankso@3512
|
38
|
pascal@4236
|
39 # Set KERNEL variable
|
pascal@4236
|
40 if [ -s $BUILD_WOK/linux/receipt ]; then
|
pascal@4236
|
41 . $BUILD_WOK/linux/receipt
|
pascal@4236
|
42 KERNEL=$VERSION
|
pascal@4236
|
43 fi
|
pascal@4236
|
44
|
pankso@3512
|
45 usage()
|
pankso@3512
|
46 {
|
pankso@3512
|
47 echo -e "\nSliTaz developers and build host tool\n
|
pankso@3512
|
48 \033[1mUsage: \033[0m `basename $0` [command] [--option]
|
pankso@3512
|
49 \033[1mCommands: \033[0m\n
|
pankso@3512
|
50 usage Print this short usage and command list.
|
pankso@3512
|
51 list-pkgs List last cooked packages with date.
|
pankso@3537
|
52 report Run in report mode and dont cook anything [--verbose].
|
pankso@4110
|
53 cook Cook, install and log a single package build.
|
pankso@3512
|
54 cook-all Cook all missing, modified or unbuilt packages.
|
pankso@3512
|
55 cook-commit Cook all packages affected by a commit in the last update.
|
pankso@3512
|
56 test-pkgs Execute a test suite on all packages [--verbose].
|
pankso@3512
|
57 [un]block Block or unblock a package to skip or enable building.
|
paul@3597
|
58 mail Send mail to package maintainer with tazbbmail.
|
pankso@3512
|
59 clean-up Remove old packages [--verbose|--dry-run].
|
pankso@3512
|
60 clean-log Remove all generated build log files.\n"
|
pankso@3512
|
61 }
|
pankso@3512
|
62
|
pankso@3512
|
63 status()
|
pankso@3512
|
64 {
|
pankso@3512
|
65 local CHECK=$?
|
pankso@3512
|
66 echo -en "\033[70G"
|
pankso@3512
|
67 if [ $CHECK = 0 ]; then
|
pankso@3512
|
68 echo "Done"
|
pankso@3512
|
69 else
|
pankso@3512
|
70 echo "Failed"
|
pankso@3512
|
71 fi
|
pankso@3512
|
72 return $CHECK
|
pankso@3512
|
73 }
|
pankso@3512
|
74
|
pankso@3512
|
75 top_summary()
|
pankso@3512
|
76 {
|
pankso@3512
|
77 cat > $DB_DIR/summary << _EOT_
|
pankso@3512
|
78 Update : `date`
|
pankso@3512
|
79 Revision : $NEW_REV (<a href="$HG_URL/log/$NEW_REV">changelog</a>)
|
pankso@3512
|
80 _EOT_
|
pankso@3512
|
81 }
|
pankso@3512
|
82
|
pankso@3512
|
83 packages_summary()
|
pankso@3512
|
84 {
|
pankso@3512
|
85 if ! grep -q "^Packages" $DB_DIR/summary; then
|
pankso@3512
|
86 cat >> $DB_DIR/summary << _EOT_
|
pankso@3512
|
87 Packages : `ls $BUILD_WOK | wc -l` in the wok, `cat $DB_DIR/cooklist | wc -l` to cook, \
|
pankso@3512
|
88 `cat $DB_DIR/blocked | wc -l` blocked, `cat $DB_DIR/corrupted | wc -l` corrupted
|
pankso@3512
|
89 _EOT_
|
pankso@3512
|
90 fi
|
pankso@3512
|
91 }
|
pankso@3512
|
92
|
pankso@3512
|
93 packages_summary_update()
|
pankso@3512
|
94 {
|
pankso@3512
|
95 sed -i s/"[0-9]* in the wok"/"`ls $BUILD_WOK | wc -l` in the wok"/ \
|
pankso@3512
|
96 $DB_DIR/summary
|
pankso@3512
|
97 sed -i s/"[0-9]* to cook"/"`cat $DB_DIR/cooklist | wc -l` to cook"/ \
|
pankso@3512
|
98 $DB_DIR/summary
|
pankso@3512
|
99 sed -i s/"[0-9]* blocked"/"`cat $DB_DIR/blocked | wc -l` blocked"/ \
|
pankso@3512
|
100 $DB_DIR/summary
|
pankso@3512
|
101 sed -i s/"[0-9]* corrupted"/"`cat $DB_DIR/corrupted | wc -l` corrupted"/ \
|
pankso@3512
|
102 $DB_DIR/summary
|
pankso@3512
|
103 }
|
pankso@3512
|
104
|
pankso@3512
|
105 list_packages()
|
pankso@3512
|
106 {
|
pankso@3512
|
107 cd $PACKAGES_REPOSITORY
|
pankso@3512
|
108 ls -1t *.tazpkg | head -20 | \
|
pankso@3512
|
109 while read file
|
pankso@3512
|
110 do
|
pankso@3512
|
111 echo -n $(stat -c '%y' $PACKAGES_REPOSITORY/$file | cut -d. -f1)
|
pankso@3512
|
112 echo " $file"
|
pankso@3512
|
113 done
|
pankso@3512
|
114 }
|
pankso@3512
|
115
|
pankso@3512
|
116 show_report()
|
pankso@3512
|
117 {
|
pankso@3512
|
118 echo "Cooklist"
|
pankso@3512
|
119 echo "================================================================================"
|
pankso@3512
|
120 cat $DB_DIR/cooklist && echo ""
|
pascal@4447
|
121 echo "Packlist"
|
pascal@4447
|
122 echo "================================================================================"
|
pascal@4447
|
123 cat $DB_DIR/packlist && echo ""
|
pankso@3512
|
124 echo "Blocked"
|
pankso@3512
|
125 echo "================================================================================"
|
pankso@3512
|
126 cat $DB_DIR/blocked && echo ""
|
pankso@3512
|
127 echo ""
|
pankso@3512
|
128 }
|
pankso@3512
|
129
|
pascal@4163
|
130 # URL encoding
|
pascal@4163
|
131 escape()
|
pascal@4163
|
132 {
|
pascal@4163
|
133 echo $1 | sed -e 's/+/%2B/g' -e 's|/|%2F|g' -e 's/:/%3A/g'
|
pascal@4163
|
134 }
|
pascal@4163
|
135
|
pankso@3512
|
136 update_wok()
|
pankso@3512
|
137 {
|
pascal@4447
|
138 local forced
|
pascal@4447
|
139 forced=""
|
pankso@3512
|
140 echo ""
|
pascal@4447
|
141 echo "(updating flavors)" > $DB_DIR/running
|
pascal@4447
|
142 cd $HG_FLAVORS
|
pascal@4447
|
143 LAST_REV=`hg head --template '{rev}\n'`
|
pascal@4447
|
144 hg pull && hg update
|
pascal@4447
|
145 NEW_REV=`hg head --template '{rev}\n'`
|
pascal@4447
|
146 if [ "$NEW_REV" != "$LAST_REV" ]; then
|
pascal@4447
|
147 size=`du -sh $HG_FLAVORS | awk '{ print $1 }'`
|
pascal@4447
|
148 echo -n "Copying Hg flavors to the build flavors ($size)... "
|
pascal@4447
|
149 cp -a $HG_FLAVORS/* $BUILD_FLAVORS
|
pascal@4447
|
150 cp -a $HG_FLAVORS/.hg $BUILD_FLAVORS
|
pascal@4447
|
151 echo -e "Done\n"
|
pascal@4447
|
152 forced="yes"
|
pascal@4447
|
153 fi
|
pankso@3512
|
154 echo "(updating wok)" > $DB_DIR/running
|
pankso@3512
|
155 cd $HG_WOK
|
pankso@3512
|
156 LAST_REV=`hg head --template '{rev}\n'`
|
pankso@3512
|
157 hg pull && hg update
|
pankso@3512
|
158 NEW_REV=`hg head --template '{rev}\n'`
|
pankso@3512
|
159 # Gen a new summary and link last revision for the web interface.
|
pankso@3512
|
160 echo -e "\nHg wok : $HG_WOK ($NEW_REV)"
|
pankso@3512
|
161 echo -e "Build wok : $BUILD_WOK ($LAST_REV)\n"
|
pankso@3512
|
162 top_summary
|
pankso@3512
|
163 # Copy Hg wok if new revision or exit to stop process since nothing
|
pankso@3537
|
164 # have change (--forced can be used).
|
pankso@3512
|
165 if [ "$NEW_REV" != "$LAST_REV" ]; then
|
pankso@3512
|
166 size=`du -sh $HG_WOK | awk '{ print $1 }'`
|
pankso@3512
|
167 echo -n "Copying Hg wok to the build wok ($size)... "
|
pankso@3537
|
168 #rsync -r -n -t $HG_WOK/ $BUILD_WOK/
|
pankso@3512
|
169 cp -a $HG_WOK/* $BUILD_WOK
|
pankso@3512
|
170 cp -a $HG_WOK/.hg $BUILD_WOK
|
pankso@3512
|
171 echo -e "Done\n"
|
pankso@3512
|
172 else
|
pankso@3512
|
173 if [ "$1" = "cook-all" ] || [ "$1" = "cook-commit" ]; then
|
pascal@4447
|
174 if [ "$2" != "--forced" -a -z "$forced" ]; then
|
pankso@3512
|
175 echo -e "Nothing to cook...\n"
|
pankso@3512
|
176 packages_summary
|
pankso@3512
|
177 rm -f $LOCK_FILE && exit 0
|
pankso@3512
|
178 fi
|
pankso@3512
|
179 fi
|
pankso@3512
|
180 fi
|
pankso@3512
|
181 }
|
pankso@3512
|
182
|
pascal@4447
|
183 # Running 'tazbb report' should not pack anything and --verbose option
|
pascal@4447
|
184 # can be used to display more messages.
|
pascal@4447
|
185 check_flavors()
|
pascal@4447
|
186 {
|
pascal@4447
|
187 # Clean up last results.
|
pascal@4447
|
188 rm -f $DB_DIR/packlist && touch $DB_DIR/packlist
|
pascal@4447
|
189 echo ""
|
pascal@4447
|
190 echo "Checking all files in: $HG_FLAVORS"
|
pascal@4447
|
191 echo "================================================================================"
|
pascal@4447
|
192 echo "(checking flavors)" > $DB_DIR/running
|
pascal@4447
|
193 for flavor in $(cd $HG_FLAVORS ; ls)
|
pascal@4447
|
194 do
|
pascal@4447
|
195 [ "$2" = "--verbose" ] && echo "Flavor : $flavor"
|
pascal@4447
|
196 if [ ! -s $PACKAGES_REPOSITORY/$flavor.flavor ]; then
|
pascal@4447
|
197 echo $flavor >> $DB_DIR/packlist
|
pascal@4447
|
198 [ "$1" = "report" ] && echo "Missing : $flavor"
|
pascal@4447
|
199 echo "Missing flavor : $flavor" >> $DB_DIR/report
|
pascal@4447
|
200 continue
|
pascal@4447
|
201 fi
|
pascal@4452
|
202 for i in $(find $HG_FLAVORS/$flavor -type f); do
|
pascal@4447
|
203 [ $PACKAGES_REPOSITORY/$flavor.flavor -nt \
|
pascal@4447
|
204 $i ] && continue
|
pascal@4447
|
205 echo $flavor >> $DB_DIR/packlist
|
pascal@4447
|
206 [ "$1" = "report" ] && echo "Refresh : $flavor"
|
pascal@4447
|
207 echo "Refresh flavor : $flavor" >> $DB_DIR/report
|
pascal@4447
|
208 continue 2
|
pascal@4447
|
209 done
|
pascal@4447
|
210 [ -s $HG_FLAVORS/$flavor/packages.list ] &&
|
pascal@4447
|
211 for i in $(cat $HG_FLAVORS/$flavor/packages.list); do
|
pascal@4447
|
212 [ $PACKAGES_REPOSITORY/$flavor.flavor -nt \
|
pascal@4447
|
213 $BUILD_WOK/$i/taz ] && continue
|
pascal@4447
|
214 echo $flavor >> $DB_DIR/packlist
|
pascal@4447
|
215 [ "$1" = "report" ] && echo "Repack : $flavor"
|
pascal@4447
|
216 echo "Repack flavor : $flavor" >> $DB_DIR/report
|
pascal@4447
|
217 continue 2
|
pascal@4447
|
218 done
|
pascal@4447
|
219 done
|
pascal@4447
|
220 }
|
pascal@4447
|
221
|
pascal@4447
|
222 # Here we pack all flavors found in the packlist.
|
pascal@4447
|
223 pack_flavors()
|
pascal@4447
|
224 {
|
pascal@4447
|
225 [ -s $DB_DIR/packlist ] || return
|
pascal@4447
|
226 [ $PACKAGES_REPOSITORY/packages.list -nt /var/lib/tazpkg/packages.list ] &&
|
pascal@4447
|
227 cp -a $PACKAGES_REPOSITORY/packages.list /var/lib/tazpkg/packages.list
|
pascal@4447
|
228 cd $PACKAGES_REPOSITORY
|
pascal@4447
|
229 for flavor in $(cat $DB_DIR/packlist)
|
pascal@4447
|
230 do
|
pascal@4447
|
231 tazlito pack-flavor $flavor
|
pascal@4447
|
232 # Remove flavor from the packlist and empty lines for HTML <pre>.
|
pascal@4447
|
233 sed -i /"^$flavor$"/d $DB_DIR/packlist
|
pascal@4447
|
234 sed -i '/^$/d' $DB_DIR/packlist
|
pascal@4447
|
235 done
|
pascal@4447
|
236 cd - > /dev/null
|
pascal@4447
|
237 }
|
pascal@4447
|
238
|
pankso@3512
|
239 # Running 'tazbb report' should not cook anything and --verbose option
|
pankso@3512
|
240 # can be used to display more messages.
|
pankso@3512
|
241 check_wok()
|
pankso@3512
|
242 {
|
pankso@3512
|
243 # Clean up last results.
|
pankso@3512
|
244 rm -f $DB_DIR/cooklist && touch $DB_DIR/cooklist
|
pankso@3512
|
245 rm -f $DB_DIR/report && touch $DB_DIR/report
|
pankso@3512
|
246 rm -f $DB_DIR/unbuilt && touch $DB_DIR/unbuilt
|
pankso@3512
|
247 echo "Checking all files in: $HG_WOK"
|
pankso@3512
|
248 echo "================================================================================"
|
pankso@3512
|
249 echo "(checking wok)" > $DB_DIR/running
|
pankso@3512
|
250 for pkg in $HG_WOK/*
|
pankso@3512
|
251 do
|
pankso@3512
|
252 EXTRAVERSION=""
|
pankso@3512
|
253 WANTED=""
|
pankso@3512
|
254 . $pkg/receipt
|
pankso@3512
|
255 [ "$2" = "--verbose" ] && echo "Package : $PACKAGE"
|
pankso@3512
|
256 # Skip blocked packages.
|
pankso@3512
|
257 if grep -qs "^$PACKAGE$" $DB_DIR/blocked; then
|
pankso@3512
|
258 echo "Blocked : $PACKAGE ($VERSION)" && continue
|
pankso@3512
|
259 fi
|
pankso@3512
|
260
|
pascal@4447
|
261 # Some packages may compute VERSION at cook time (bristuff)
|
pascal@4447
|
262 if grep -q ^get_version $pkg/receipt; then
|
pankso@3512
|
263 . $BUILD_WOK/$PACKAGE/taz/*/receipt
|
pankso@3512
|
264 fi
|
pankso@3512
|
265
|
pankso@3537
|
266 # First check if package exit. Package naming _must_ be in the form of:
|
pankso@3512
|
267 # $PACKAGE-$VERSION or $PACKAGE-${VERSION}$EXTRAVERSION (Kernel string).
|
pankso@3512
|
268 if [ ! -f $PACKAGES_REPOSITORY/$PACKAGE-$VERSION.tazpkg ]; then
|
pankso@3512
|
269 [ -z "$EXTRAVERSION" ] && EXTRAVERSION="_$KERNEL"
|
pankso@3512
|
270 if [ ! -f $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg ]; then
|
pankso@3512
|
271 [ "$1" = "report" ] && echo "Missing : $PACKAGE ($VERSION)"
|
pankso@3512
|
272 echo "Missing : $PACKAGE ($VERSION)" >> $DB_DIR/report
|
pankso@3512
|
273 echo "$PACKAGE" >> $DB_DIR/cooklist
|
pankso@3512
|
274 fi
|
pankso@3512
|
275 else
|
pankso@3512
|
276 # Check if package is up-to-date.
|
pascal@4700
|
277 PKG_DATE=`date -u -r $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}${EXTRAVERSION}.tazpkg '+%Y%m%d%H%M'`
|
pankso@3512
|
278 for file in `find $pkg -type f`
|
pankso@3512
|
279 do
|
pascal@4700
|
280 FILE_DATE=`date -u -r $file '+%Y%m%d%H%M'`
|
pankso@3512
|
281 [ "$2" = "--verbose" ] && echo " -> Checking: $file"
|
pankso@3512
|
282 if [ "$FILE_DATE" -gt "$PKG_DATE" ] && ! grep -q $PACKAGE $DB_DIR/cooklist; then
|
pankso@3512
|
283 [ "$1" = "report" ] && echo "Refresh : $PACKAGE ($VERSION)"
|
pankso@3512
|
284 echo "Refresh : $PACKAGE ($VERSION)" >> $DB_DIR/report
|
pankso@3512
|
285 echo "$PACKAGE" >> $DB_DIR/cooklist
|
pankso@3512
|
286 fi
|
pankso@3512
|
287 done
|
pankso@3512
|
288 fi
|
pankso@3537
|
289 # Now check if package is built and not already in the list.
|
pankso@3512
|
290 if [ ! -d $BUILD_WOK/$PACKAGE/taz ] && ! grep -q $PACKAGE $DB_DIR/cooklist; then
|
pankso@3512
|
291 [ "$1" = "report" ] && echo "Unbuilt : $PACKAGE ($VERSION)"
|
pankso@3512
|
292 echo "Unbuilt : $PACKAGE ($VERSION)" >> $DB_DIR/report
|
pankso@3512
|
293 echo "$PACKAGE" >> $DB_DIR/cooklist
|
pankso@3512
|
294 fi
|
pankso@3512
|
295 # Rebuild unbuilt packages list with link to log file. This list
|
pankso@3537
|
296 # is also generated by cook_inslall to have real time stats.
|
pankso@3512
|
297 if [ ! -d $BUILD_WOK/$PACKAGE/taz ]; then
|
pascal@4163
|
298 echo "<a href=\"log.php?package=$(escape $PACKAGE)\">$PACKAGE</a>" \
|
pankso@3512
|
299 >> $DB_DIR/unbuilt
|
pankso@3512
|
300 fi
|
pankso@3512
|
301 done
|
pankso@3512
|
302 packages_summary
|
pankso@3512
|
303 }
|
pankso@3512
|
304
|
pankso@3537
|
305 # Create a new cooklist and summary (dont modify report) so 'tazbb cook-commit'
|
pankso@3512
|
306 # can cook last changes.
|
pankso@3512
|
307 check_commit()
|
pankso@3512
|
308 {
|
pankso@3512
|
309 echo "(checking commit)" > $DB_DIR/running
|
pankso@3512
|
310 cd $HG_WOK
|
pankso@3512
|
311 # Clean up last results.
|
pankso@3512
|
312 rm -f $DB_DIR/cooklist && touch $DB_DIR/cooklist
|
pankso@3512
|
313 # Get the name of modified packages by the revision range. +1 last
|
pankso@3537
|
314 # commit was build by the previous build.
|
pankso@3512
|
315 LAST_REV=$(($LAST_REV+1))
|
pankso@3512
|
316 echo -e "Will cook from revision $LAST_REV to $NEW_REV\n"
|
pankso@3512
|
317 for file in `hg log --rev=$LAST_REV:$NEW_REV --template '{files}\n'`
|
pankso@3512
|
318 do
|
pankso@3512
|
319 pkg=`echo $file | cut -d "/" -f 1`
|
pankso@3512
|
320 if ! grep -q ^$pkg$ $DB_DIR/cooklist; then
|
pankso@3512
|
321 . $pkg/receipt
|
pankso@3512
|
322 echo "Commit : $PACKAGE ($VERSION)" >> $DB_DIR/report
|
pankso@3512
|
323 echo "$PACKAGE" >> $DB_DIR/cooklist
|
pankso@3512
|
324 fi
|
pankso@3512
|
325 done
|
pankso@3512
|
326 packages_summary
|
pankso@3512
|
327 }
|
pankso@3512
|
328
|
pascal@4174
|
329 # Cook one package
|
pascal@4174
|
330 cook_package()
|
pascal@4174
|
331 {
|
pascal@4174
|
332 EXTRAVERSION=""
|
pascal@4174
|
333 DEPENDS=""
|
pascal@4174
|
334 BUILD_DEPENDS=""
|
pascal@4174
|
335 SOURCE=""
|
pascal@4174
|
336 WANTED=""
|
pascal@4174
|
337 echo "(cooking <a href=\"log.php?package=$(escape $pkg)\">$pkg</a>)" > $DB_DIR/running
|
pascal@4174
|
338 tazwok clean $pkg
|
pascal@4174
|
339 script -c "echo 'install' | tazwok cook $pkg" $LOG_DIR/$pkg.log
|
pascal@4174
|
340 # Install new package (important for new shared libs). Note
|
pascal@4174
|
341 # that tests are done separatly with 'test_packages' and should
|
pascal@4174
|
342 # be done by tazwok.
|
pascal@4174
|
343 if [ -f $BUILD_WOK/$pkg/taz/*/receipt ]; then
|
pascal@4174
|
344 . $BUILD_WOK/$pkg/taz/*/receipt
|
pascal@4174
|
345 echo "(installing $PACKAGE-${VERSION}$EXTRAVERSION.tazpkg)" \
|
pascal@4174
|
346 > $DB_DIR/running
|
pascal@4174
|
347 yes | tazpkg install \
|
pascal@4174
|
348 $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg \
|
pascal@4174
|
349 --forced
|
pascal@4174
|
350 return 0
|
pascal@4174
|
351 fi
|
pascal@4174
|
352 return 1
|
pascal@4174
|
353 }
|
pascal@4174
|
354
|
pascal@4174
|
355 # Sort list according WANTED and BUILD_DEPENDS
|
pascal@4174
|
356 sort_cook_list()
|
pascal@4174
|
357 {
|
pascal@4174
|
358 sort | while read pkg; do
|
pascal@4174
|
359 echo -n "$pkg"
|
pascal@4174
|
360 WANTED=""
|
pascal@4174
|
361 BUILD_DEPENDS=""
|
pascal@4174
|
362 . $BUILD_WOK/$pkg/receipt
|
pascal@4185
|
363 MISSING=""
|
pascal@4174
|
364 for i in $WANTED $BUILD_DEPENDS ; do
|
pascal@4174
|
365 if [ ! -f $BUILD_WOK/$i/taz/*/receipt ]; then
|
pascal@4185
|
366 case " $MISSING " in
|
pascal@4185
|
367 *\ $i\ *);;
|
pascal@4185
|
368 *) echo -n " $i";;
|
pascal@4185
|
369 esac
|
pascal@4185
|
370 MISSING="$MISSING $i"
|
pascal@4174
|
371 fi
|
pascal@4174
|
372 done
|
pascal@4174
|
373 echo ""
|
pascal@4185
|
374 done | awk '
|
pascal@4185
|
375 function show(name)
|
pascal@4185
|
376 {
|
pascal@4185
|
377 print name;
|
pascal@4185
|
378 got[name]++;
|
pascal@4185
|
379 if (revdepcnt[name] > 0)
|
pascal@4185
|
380 for (i = split(revdep[name], pkg, " "); i > 0; i--)
|
pascal@4185
|
381 if (--depcnt[pkg[i]] == 0) show(pkg[i]);
|
pascal@4185
|
382 }
|
pascal@4185
|
383
|
pascal@4185
|
384 {
|
pascal@4185
|
385 if ($2 == "") show($1);
|
pascal@4185
|
386 else {
|
pascal@4185
|
387 depcnt[$1] = NF - 1;
|
pascal@4185
|
388 unres = unres " " $1;
|
pascal@4185
|
389 for (i = 2; i <= NF; i++) {
|
pascal@4185
|
390 if (got[$i] > 0) continue;
|
pascal@4185
|
391 revdepcnt[$i]++;
|
pascal@4185
|
392 revdep[$i] = revdep[$i] " " $1;
|
pascal@4174
|
393 }
|
pascal@4174
|
394 }
|
pascal@4185
|
395 }
|
pascal@4185
|
396 END {
|
pascal@4185
|
397 for (i = split(unres, pkg, " "); i > 0; i--)
|
pascal@4185
|
398 if (depcnt[pkg[i]] > 0) print pkg[i];
|
pascal@4185
|
399 }
|
pascal@4174
|
400 '
|
pascal@4174
|
401 }
|
pascal@4174
|
402
|
pankso@3512
|
403 # Here we cook all packages found in the cooklist.
|
pankso@3512
|
404 cook_install()
|
pankso@3512
|
405 {
|
pankso@3512
|
406 echo "" > $DB_DIR/unbuilt
|
pascal@4174
|
407 for pkg in `cat $DB_DIR/cooklist | sort_cook_list`
|
pankso@3512
|
408 do
|
pascal@4174
|
409 if ! cook_package $pkg; then
|
pankso@3512
|
410 # Link to build log.
|
pascal@4163
|
411 echo "<a href=\"log.php?package=$(escape $pkg)\">$pkg</a>" >> \
|
pankso@3512
|
412 $DB_DIR/unbuilt
|
pankso@3512
|
413 fi
|
pankso@3512
|
414 # Remove package from the cooklist and empty lines for HTML <pre>.
|
pankso@3512
|
415 sed -i /"^$pkg$"/d $DB_DIR/cooklist
|
pankso@3512
|
416 sed -i '/^$/d' $DB_DIR/cooklist
|
pankso@3537
|
417 packages_summary_update
|
pankso@3512
|
418 done
|
pankso@3512
|
419 }
|
pankso@3512
|
420
|
pankso@3512
|
421 # Remove old packages in the build wok and clean pkgs repository. The
|
pankso@3512
|
422 # Hg wok is copied into the build wok so packages removed by hg must be
|
pankso@3512
|
423 # removed. To remove old packages in the repository we look into the
|
pankso@3537
|
424 # build wok and dont remove unbuilt packages. Clean-up will also remove
|
pankso@3512
|
425 # all corrupted packages.
|
pankso@3512
|
426 clean_up()
|
pankso@3512
|
427 {
|
pankso@3512
|
428 touch $DB_DIR/removed
|
pankso@3512
|
429 echo -e "\nCleaning the build wok, old and corrupted packages...\n"
|
pankso@3512
|
430 echo "(cleaning)" > $DB_DIR/running
|
pankso@4208
|
431 for pkg in `ls $BUILD_WOK`
|
pankso@3512
|
432 do
|
pankso@4208
|
433 if [ ! -d $HG_WOK/$pkg ]; then
|
pankso@3512
|
434 case $2 in
|
pankso@3512
|
435 --dry-run)
|
pankso@3512
|
436 echo "Removing directory : $pkg" ;;
|
pankso@3512
|
437 --verbose)
|
pankso@3512
|
438 echo "Removing directory : $pkg"
|
pankso@3512
|
439 rm -rf $BUILD_WOK/$pkg ;;
|
pankso@3512
|
440 *)
|
pankso@3512
|
441 rm -rf $BUILD_WOK/$pkg ;;
|
pankso@3512
|
442 esac
|
pankso@3512
|
443 fi
|
pankso@3512
|
444 done
|
pankso@3512
|
445 # Build a packages list with EXTRAVERSION so we can grep into it.
|
pankso@3512
|
446 rm -f $DB_DIR/packaged && touch $DB_DIR/packaged
|
pankso@3512
|
447 for receipt in $BUILD_WOK/*/taz/*/receipt
|
pankso@3512
|
448 do
|
pankso@3512
|
449 EXTRAVERSION=""
|
pankso@3512
|
450 . $receipt
|
pankso@3512
|
451 echo "$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg" >> $DB_DIR/packaged
|
pankso@3512
|
452 done
|
pankso@3512
|
453 for pkg in `cd $PACKAGES_REPOSITORY && ls *.tazpkg`
|
pankso@3512
|
454 do
|
pankso@3512
|
455 if ! grep -q "^$pkg$" $DB_DIR/packaged; then
|
pankso@3512
|
456 case $2 in
|
pankso@3512
|
457 --dry-run)
|
pankso@3512
|
458 echo "Removing package : $pkg" ;;
|
pankso@3512
|
459 --verbose)
|
pankso@3512
|
460 echo "Removing package : $pkg"
|
pankso@3512
|
461 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
462 rm -f $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
463 *)
|
pankso@3512
|
464 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
465 rm -f $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
466 esac
|
pankso@3512
|
467 fi
|
pankso@3512
|
468 done
|
pankso@3512
|
469 # Remove all corrupted packages
|
pankso@3512
|
470 for pkg in `cat $DB_DIR/corrupted | awk '{ print $3 }'`
|
pankso@3512
|
471 do
|
pankso@3512
|
472 case $2 in
|
pankso@3512
|
473 --dry-run)
|
pankso@3512
|
474 echo "Removing corrupted: $pkg" ;;
|
pankso@3512
|
475 --verbose)
|
pankso@3512
|
476 echo "Removing corrupted: $pkg"
|
pankso@3512
|
477 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
478 rm -rf $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
479 *)
|
pankso@3512
|
480 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
481 rm -rf $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
482 esac
|
pankso@3512
|
483 done
|
pankso@3512
|
484 echo ""
|
pankso@3512
|
485 # Keep the 20 last removed packages list.
|
pankso@3512
|
486 cat $DB_DIR/removed | tail -n 20 > /tmp/removed.tail
|
pankso@3512
|
487 mv -f /tmp/removed.tail $DB_DIR/removed
|
pankso@3512
|
488 }
|
pankso@3512
|
489
|
pankso@3512
|
490 blocked_urls()
|
pankso@3512
|
491 {
|
pankso@3512
|
492 rm -f $DB_DIR/blocked.urls
|
pankso@3512
|
493 for pkg in `cat $DB_DIR/blocked`
|
pankso@3512
|
494 do
|
pankso@3512
|
495 if [ -f $LOG_DIR/$pkg.log ]; then
|
pascal@4163
|
496 echo "<a href=\"log.php?package=$(escape $pkg)\">$pkg</a>" >> \
|
pankso@3512
|
497 $DB_DIR/blocked.urls
|
pankso@3512
|
498 else
|
pankso@3512
|
499 echo "$pkg" >> $DB_DIR/blocked.urls
|
pankso@3512
|
500 fi
|
pankso@3512
|
501 done
|
pankso@3512
|
502 }
|
pankso@3512
|
503
|
pankso@3512
|
504 # 4k, not a meta or a get-* package and no files = buggy package
|
pankso@3512
|
505 test_packages()
|
pankso@3512
|
506 {
|
pankso@3512
|
507 echo -e "\nTesting all packages in: $PACKAGES_REPOSITORY"
|
pankso@3512
|
508 echo "================================================================================"
|
pankso@3512
|
509 echo "(testing packages)" > $DB_DIR/running
|
pankso@3512
|
510 rm -f $DB_DIR/corrupted && touch $DB_DIR/corrupted
|
pankso@3512
|
511 for pkg in $PACKAGES_REPOSITORY/*.tazpkg
|
pankso@3512
|
512 do
|
pankso@3512
|
513 tmp=/tmp/bb-test.$$
|
pankso@3512
|
514 CATEGORY=""
|
pankso@3512
|
515 if du $pkg | grep -qw '^4' && ! echo `basename $pkg` | grep -q '^get-'; then
|
pankso@3512
|
516 mkdir -p $tmp && cd $tmp
|
pascal@4700
|
517 cpio -i receipt >/dev/null 2>&1 < $pkg
|
pankso@3512
|
518 . ./receipt
|
pankso@3512
|
519 if [ "$CATEGORY" != "meta" ]; then
|
pankso@3512
|
520 [ "$2" = "--verbose" ] && echo "Testing: $PACKAGE"
|
pascal@4850
|
521 cpio -i fs.cpio.gz fs.cpio.lzma >/dev/null 2>&1 < $pkg
|
pascal@4850
|
522 if [ ! -f fs.cpio.gz -a ! -f fs.cpio.lzma ]; then
|
pankso@3516
|
523 echo "Missing filesystem `basename $pkg`"
|
pankso@3512
|
524 if [ -f $LOG_DIR/$PACKAGE.log ];then
|
pascal@4163
|
525 echo "Missing filesystem `basename $pkg` <a href=\"log.php?package=$(escape $PACKAGE)\">Log</a>" \
|
pankso@3512
|
526 >> $DB_DIR/corrupted
|
pankso@3512
|
527 else
|
pankso@3516
|
528 echo "Missing filesystem `basename $pkg`" \
|
pankso@3512
|
529 >> $DB_DIR/corrupted
|
pankso@3512
|
530 fi
|
pankso@3512
|
531 else
|
pascal@4850
|
532 ( zcat fs.cpio.gz 2> /dev/null || \
|
pascal@4850
|
533 unlzma -c fs.cpio.lzma ) | \
|
pascal@4850
|
534 cpio -id >/dev/null 2>&1
|
pascal@4395
|
535 files=`find fs -type f -o -type l`
|
pankso@3512
|
536 if [ -z "$files" ]; then
|
pankso@3516
|
537 echo "Empty filesystem `basename $pkg`"
|
pankso@3512
|
538 if [ -f $LOG_DIR/$PACKAGE.log ]; then
|
pascal@4163
|
539 echo "Empty filesystem `basename $pkg` <a href=\"log.php?package=$(escape $PACKAGE)\">Log</a>" \
|
pankso@3512
|
540 >> $DB_DIR/corrupted
|
pankso@3512
|
541 else
|
pankso@3516
|
542 echo "Empty filesystem `basename $pkg`" \
|
pankso@3512
|
543 >> $DB_DIR/corrupted
|
pankso@3512
|
544 fi
|
pankso@3512
|
545 fi
|
pankso@3512
|
546 fi
|
pankso@3512
|
547 fi
|
pankso@3512
|
548 cd .. && rm -rf $tmp
|
pankso@3512
|
549 fi
|
pankso@3512
|
550 done
|
pankso@3512
|
551 packages_summary_update
|
pankso@3512
|
552 echo ""
|
pankso@3512
|
553 }
|
pankso@3512
|
554
|
pascal@4447
|
555 # Generate flavor list
|
pascal@4447
|
556 gen_flavor_list()
|
pascal@4447
|
557 {
|
pascal@4447
|
558 cd $PACKAGES_REPOSITORY
|
pascal@4447
|
559 noheader=""
|
pascal@4447
|
560 for i in *.flavor; do
|
pascal@4447
|
561 tazlito show-flavor $i --brief $noheader
|
pascal@4447
|
562 noheader="--noheader"
|
pascal@4447
|
563 done > flavors.list
|
pascal@4447
|
564 cd - > /dev/null
|
pascal@4447
|
565 }
|
pascal@4447
|
566
|
pankso@3512
|
567 case "$1" in
|
pankso@3512
|
568 list-pkgs)
|
pankso@3512
|
569 # List last cooked packages.
|
pankso@3512
|
570 list_packages ;;
|
pankso@3512
|
571 report)
|
pankso@3512
|
572 # Run in report mode. If an update is done we must cook-all to
|
pankso@3512
|
573 # rebuild all updated packages.
|
pankso@3512
|
574 [ "$2" == "--update" ] && update_wok $@ || echo ""
|
pankso@3512
|
575 check_wok $@
|
pascal@4447
|
576 check_flavors $@
|
pankso@3512
|
577 test_packages $@
|
pankso@3512
|
578 show_report ;;
|
pankso@4110
|
579 cook)
|
pankso@4110
|
580 # Cook, install and log a single package build.
|
pankso@4110
|
581 if [ -z $2 ]; then
|
pankso@4110
|
582 echo "Please specify a package on the command line."
|
pankso@4110
|
583 rm -f $LOCK_FILE && exit 0
|
pankso@4110
|
584 fi
|
pankso@4110
|
585 pkg=$2
|
pankso@4110
|
586 echo "Starting to cook and install: $pkg"
|
pascal@4174
|
587 if ! cook_package $pkg; then
|
pankso@4110
|
588 echo "Unable to install: $pkg"
|
pankso@4110
|
589 fi ;;
|
pankso@3512
|
590 cook-all)
|
pankso@3512
|
591 # Update wok, gen report (with cooklist), cook all packages, test,
|
pankso@3512
|
592 # clean, gen new report and lists.
|
pankso@3512
|
593 update_wok $@
|
pankso@3512
|
594 check_wok $@
|
pankso@3512
|
595 cook_install
|
pankso@3512
|
596 test_packages $@
|
pankso@3512
|
597 clean_up $@
|
pankso@3512
|
598 check_wok $@
|
pankso@3512
|
599 echo "(generating lists)" > $DB_DIR/running
|
pankso@3512
|
600 tazwok gen-list --text
|
pascal@4447
|
601 check_flavors $@
|
pascal@4447
|
602 pack_flavors
|
pascal@4447
|
603 gen_flavor_list
|
pankso@3512
|
604 echo "" ;;
|
pankso@3512
|
605 cook-commit)
|
pankso@3512
|
606 # Cook all packages affected by the last commits in the wok.
|
pankso@3529
|
607 # Clean up is done only by cook-all to avoid rebuild of corrupted
|
pankso@3529
|
608 # packages on each commit.
|
pankso@3512
|
609 update_wok $@
|
pankso@3512
|
610 check_commit
|
pankso@3512
|
611 cook_install
|
pankso@3512
|
612 test_packages $@
|
pankso@3512
|
613 check_wok $@
|
pankso@3512
|
614 echo "(generating lists)" > $DB_DIR/running
|
pankso@3512
|
615 tazwok gen-list --text
|
pascal@4447
|
616 check_flavors $@
|
pascal@4447
|
617 pack_flavors
|
pascal@4447
|
618 gen_flavor_list
|
pankso@3512
|
619 echo "" ;;
|
pankso@3512
|
620 block)
|
pankso@3512
|
621 # Add a pkg name to the list of blocked packages.
|
pankso@3512
|
622 echo ""
|
pankso@3512
|
623 if grep -qs "^$2$" $DB_DIR/blocked; then
|
pankso@3512
|
624 echo -e "$2 is already in the blocked packages list."
|
pankso@3512
|
625 else
|
pankso@3512
|
626 echo -n "Adding $2 to : $DB_DIR/blocked... "
|
pankso@3512
|
627 echo "$2" >> $DB_DIR/blocked && echo "Done"
|
pankso@3512
|
628 if grep -q "^$2$" $DB_DIR/cooklist; then
|
pankso@3512
|
629 echo -n "Removing $2 from : $DB_DIR/cooklist... "
|
pankso@3512
|
630 sed -i /"^$2$"/d $DB_DIR/cooklist && echo "Done"
|
pankso@3512
|
631 packages_summary_update
|
pankso@3512
|
632 fi
|
pankso@3512
|
633 fi
|
pankso@3512
|
634 blocked_urls
|
pankso@3512
|
635 echo "" ;;
|
pankso@3512
|
636 unblock)
|
pankso@3512
|
637 # Remove a pkg name from the list of blocked packages.
|
pankso@3512
|
638 echo ""
|
pankso@3512
|
639 if grep -qs "^$2$" $DB_DIR/blocked; then
|
pankso@3512
|
640 echo -n "Removing $2 from : $DB_DIR/blocked... "
|
pankso@3512
|
641 sed -i /"^$2$"/d $DB_DIR/blocked
|
pankso@3512
|
642 sed -i '/^$/d' $DB_DIR/blocked && echo "Done"
|
pankso@3512
|
643 echo -n "Adding $2 to : $DB_DIR/cooklist... "
|
pankso@3512
|
644 echo "$2" >> $DB_DIR/cooklist && echo "Done"
|
pankso@3512
|
645 packages_summary_update
|
pankso@3512
|
646 else
|
pankso@3512
|
647 echo -e "$2 is not in the blocked packages list."
|
pankso@3512
|
648 fi
|
pankso@3512
|
649 blocked_urls
|
pankso@3512
|
650 echo "" ;;
|
pankso@3512
|
651 test-pkgs)
|
pankso@3537
|
652 # Start a test suite on all builded packages.
|
pankso@3512
|
653 test_packages $@ ;;
|
pankso@3512
|
654 test-suite)
|
pankso@3537
|
655 # Start a test suite on all builded package and the wok using
|
pankso@3512
|
656 # the great 'tazwok check'.
|
pankso@3512
|
657 #
|
pankso@3512
|
658 # test_packages > $LOG_DIR/test-suite.log
|
pankso@3512
|
659 # tazwok check >> $LOG_DIR/test-suite.log
|
pankso@3512
|
660 #
|
pankso@3512
|
661 test_packages $@
|
pankso@3512
|
662 script -c "tazwok check" $LOG_DIR/test-suite.log ;;
|
pankso@3590
|
663 mail)
|
pankso@3590
|
664 # Tazbbmail Pythom script wrapper.
|
pankso@3590
|
665 PACKAGE=$2
|
pankso@3590
|
666 tazbbmail $PACKAGE ;;
|
pankso@3512
|
667 clean-up)
|
pankso@3512
|
668 # Remove old packages and generate new packages lists.
|
pankso@3512
|
669 update_wok $@
|
pankso@3512
|
670 clean_up $@
|
pankso@3512
|
671 packages_summary_update
|
pankso@3512
|
672 [ "$2" != "--dry-run" ] && tazwok gen-list --text ;;
|
pankso@3512
|
673 clean-log)
|
pankso@3512
|
674 logs=`ls $LOG_DIR | wc -l`
|
pankso@3512
|
675 echo -n "Cleaning: $LOG_DIR... "
|
pankso@3512
|
676 rm -rf $LOG_DIR/*
|
pankso@3512
|
677 echo "$logs log removed" ;;
|
pankso@3512
|
678 *)
|
pankso@3512
|
679 usage ;;
|
pankso@3512
|
680 esac
|
pankso@3512
|
681
|
pankso@3512
|
682 echo "" > $DB_DIR/running
|
pankso@3512
|
683 rm -f $LOCK_FILE
|
pankso@3512
|
684
|
pankso@3512
|
685 exit 0
|