wok annotate tazbb/stuff/tazbb @ rev 4963

tazbb: check meta flavors for refresh
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Feb 22 16:31:06 2010 +0100 (2010-02-22)
parents 169dee0cf4c5
children c40252b88f47
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@4900 206 [ "$1" = "report" ] && echo "Refresh : $flavor for $i"
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@4902 212 if [ ! -d $BUILD_WOK/$i ]; then
pascal@4901 213 [ "$1" = "report" ] &&
pascal@4901 214 echo "Fix flavor for $i: $flavor"
pascal@4901 215 echo "Fix flavor for $i: $flavor" >> $DB_DIR/report
pascal@4901 216 continue
pascal@4901 217 fi
pascal@4447 218 [ $PACKAGES_REPOSITORY/$flavor.flavor -nt \
pascal@4447 219 $BUILD_WOK/$i/taz ] && continue
pascal@4447 220 echo $flavor >> $DB_DIR/packlist
pascal@4900 221 [ "$1" = "report" ] && echo "Repack : $flavor for $i"
pascal@4447 222 echo "Repack flavor : $flavor" >> $DB_DIR/report
pascal@4447 223 continue 2
pascal@4447 224 done
pascal@4447 225 done
pascal@4963 226
pascal@4963 227 # Check for meta flavors
pascal@4963 228 for flavor in $(cd $HG_FLAVORS ; ls)
pascal@4963 229 do
pascal@4963 230 grep -q ^ROOTFS_SELECTION $HG_FLAVORS/$flavor/receipt || continue
pascal@4963 231 . $HG_FLAVORS/$flavor/receipt
pascal@4963 232 set -- $ROOTFS_SELECTION
pascal@4963 233 if [ $PACKAGES_REPOSITORY/$2.flavor -nt \
pascal@4963 234 $PACKAGES_REPOSITORY/$flavor.flavor ]; then
pascal@4963 235 echo $flavor >> $DB_DIR/packlist
pascal@4963 236 [ "$1" = "report" ] && echo "Refresh : $flavor for $2"
pascal@4963 237 echo "Refresh meta flavor : $flavor" >> $DB_DIR/report
pascal@4963 238 continue
pascal@4963 239 fi
pascal@4963 240 if grep -q ^$2$ $DB_DIR/packlist ; then
pascal@4963 241 echo $flavor >> $DB_DIR/packlist
pascal@4963 242 [ "$1" = "report" ] && echo "Repack : $flavor for $2"
pascal@4963 243 echo "Repack meta flavor : $flavor" >> $DB_DIR/report
pascal@4963 244 continue
pascal@4963 245 fi
pascal@4963 246 done
pascal@4447 247 }
pascal@4447 248
pascal@4447 249 # Here we pack all flavors found in the packlist.
pascal@4447 250 pack_flavors()
pascal@4447 251 {
pascal@4447 252 [ -s $DB_DIR/packlist ] || return
pascal@4447 253 [ $PACKAGES_REPOSITORY/packages.list -nt /var/lib/tazpkg/packages.list ] &&
pascal@4447 254 cp -a $PACKAGES_REPOSITORY/packages.list /var/lib/tazpkg/packages.list
pascal@4447 255 cd $PACKAGES_REPOSITORY
pascal@4447 256 for flavor in $(cat $DB_DIR/packlist)
pascal@4447 257 do
pascal@4447 258 tazlito pack-flavor $flavor
pascal@4447 259 # Remove flavor from the packlist and empty lines for HTML <pre>.
pascal@4447 260 sed -i /"^$flavor$"/d $DB_DIR/packlist
pascal@4447 261 sed -i '/^$/d' $DB_DIR/packlist
pascal@4447 262 done
pascal@4447 263 cd - > /dev/null
pascal@4447 264 }
pascal@4447 265
pankso@3512 266 # Running 'tazbb report' should not cook anything and --verbose option
pankso@3512 267 # can be used to display more messages.
pankso@3512 268 check_wok()
pankso@3512 269 {
pankso@3512 270 # Clean up last results.
pankso@3512 271 rm -f $DB_DIR/cooklist && touch $DB_DIR/cooklist
pankso@3512 272 rm -f $DB_DIR/report && touch $DB_DIR/report
pankso@3512 273 rm -f $DB_DIR/unbuilt && touch $DB_DIR/unbuilt
pankso@3512 274 echo "Checking all files in: $HG_WOK"
pankso@3512 275 echo "================================================================================"
pankso@3512 276 echo "(checking wok)" > $DB_DIR/running
pankso@3512 277 for pkg in $HG_WOK/*
pankso@3512 278 do
pankso@3512 279 EXTRAVERSION=""
pankso@3512 280 WANTED=""
pankso@3512 281 . $pkg/receipt
pankso@3512 282 [ "$2" = "--verbose" ] && echo "Package : $PACKAGE"
pankso@3512 283 # Skip blocked packages.
pankso@3512 284 if grep -qs "^$PACKAGE$" $DB_DIR/blocked; then
pankso@3512 285 echo "Blocked : $PACKAGE ($VERSION)" && continue
pankso@3512 286 fi
pankso@3512 287
pascal@4447 288 # Some packages may compute VERSION at cook time (bristuff)
pascal@4447 289 if grep -q ^get_version $pkg/receipt; then
pankso@3512 290 . $BUILD_WOK/$PACKAGE/taz/*/receipt
pankso@3512 291 fi
pankso@3512 292
pankso@3537 293 # First check if package exit. Package naming _must_ be in the form of:
pankso@3512 294 # $PACKAGE-$VERSION or $PACKAGE-${VERSION}$EXTRAVERSION (Kernel string).
pankso@3512 295 if [ ! -f $PACKAGES_REPOSITORY/$PACKAGE-$VERSION.tazpkg ]; then
pankso@3512 296 [ -z "$EXTRAVERSION" ] && EXTRAVERSION="_$KERNEL"
pankso@3512 297 if [ ! -f $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg ]; then
pankso@3512 298 [ "$1" = "report" ] && echo "Missing : $PACKAGE ($VERSION)"
pankso@3512 299 echo "Missing : $PACKAGE ($VERSION)" >> $DB_DIR/report
pankso@3512 300 echo "$PACKAGE" >> $DB_DIR/cooklist
pankso@3512 301 fi
pankso@3512 302 else
pankso@3512 303 # Check if package is up-to-date.
pascal@4700 304 PKG_DATE=`date -u -r $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}${EXTRAVERSION}.tazpkg '+%Y%m%d%H%M'`
pankso@3512 305 for file in `find $pkg -type f`
pankso@3512 306 do
pascal@4700 307 FILE_DATE=`date -u -r $file '+%Y%m%d%H%M'`
pankso@3512 308 [ "$2" = "--verbose" ] && echo " -> Checking: $file"
pankso@3512 309 if [ "$FILE_DATE" -gt "$PKG_DATE" ] && ! grep -q $PACKAGE $DB_DIR/cooklist; then
pankso@3512 310 [ "$1" = "report" ] && echo "Refresh : $PACKAGE ($VERSION)"
pankso@3512 311 echo "Refresh : $PACKAGE ($VERSION)" >> $DB_DIR/report
pankso@3512 312 echo "$PACKAGE" >> $DB_DIR/cooklist
pankso@3512 313 fi
pankso@3512 314 done
pankso@3512 315 fi
pankso@3537 316 # Now check if package is built and not already in the list.
pankso@3512 317 if [ ! -d $BUILD_WOK/$PACKAGE/taz ] && ! grep -q $PACKAGE $DB_DIR/cooklist; then
pankso@3512 318 [ "$1" = "report" ] && echo "Unbuilt : $PACKAGE ($VERSION)"
pankso@3512 319 echo "Unbuilt : $PACKAGE ($VERSION)" >> $DB_DIR/report
pankso@3512 320 echo "$PACKAGE" >> $DB_DIR/cooklist
pankso@3512 321 fi
pankso@3512 322 # Rebuild unbuilt packages list with link to log file. This list
pankso@3537 323 # is also generated by cook_inslall to have real time stats.
pankso@3512 324 if [ ! -d $BUILD_WOK/$PACKAGE/taz ]; then
pascal@4163 325 echo "<a href=\"log.php?package=$(escape $PACKAGE)\">$PACKAGE</a>" \
pankso@3512 326 >> $DB_DIR/unbuilt
pankso@3512 327 fi
pankso@3512 328 done
pankso@3512 329 packages_summary
pankso@3512 330 }
pankso@3512 331
pankso@3537 332 # Create a new cooklist and summary (dont modify report) so 'tazbb cook-commit'
pankso@3512 333 # can cook last changes.
pankso@3512 334 check_commit()
pankso@3512 335 {
pankso@3512 336 echo "(checking commit)" > $DB_DIR/running
pankso@3512 337 cd $HG_WOK
pankso@3512 338 # Clean up last results.
pankso@3512 339 rm -f $DB_DIR/cooklist && touch $DB_DIR/cooklist
pankso@3512 340 # Get the name of modified packages by the revision range. +1 last
pankso@3537 341 # commit was build by the previous build.
pankso@3512 342 LAST_REV=$(($LAST_REV+1))
pankso@3512 343 echo -e "Will cook from revision $LAST_REV to $NEW_REV\n"
pankso@3512 344 for file in `hg log --rev=$LAST_REV:$NEW_REV --template '{files}\n'`
pankso@3512 345 do
pankso@3512 346 pkg=`echo $file | cut -d "/" -f 1`
pankso@3512 347 if ! grep -q ^$pkg$ $DB_DIR/cooklist; then
pankso@3512 348 . $pkg/receipt
pankso@3512 349 echo "Commit : $PACKAGE ($VERSION)" >> $DB_DIR/report
pankso@3512 350 echo "$PACKAGE" >> $DB_DIR/cooklist
pankso@3512 351 fi
pankso@3512 352 done
pankso@3512 353 packages_summary
pankso@3512 354 }
pankso@3512 355
pascal@4174 356 # Cook one package
pascal@4174 357 cook_package()
pascal@4174 358 {
pascal@4174 359 EXTRAVERSION=""
pascal@4174 360 DEPENDS=""
pascal@4174 361 BUILD_DEPENDS=""
pascal@4174 362 SOURCE=""
pascal@4174 363 WANTED=""
pascal@4174 364 echo "(cooking <a href=\"log.php?package=$(escape $pkg)\">$pkg</a>)" > $DB_DIR/running
pascal@4174 365 tazwok clean $pkg
pascal@4174 366 script -c "echo 'install' | tazwok cook $pkg" $LOG_DIR/$pkg.log
pascal@4174 367 # Install new package (important for new shared libs). Note
pascal@4174 368 # that tests are done separatly with 'test_packages' and should
pascal@4174 369 # be done by tazwok.
pascal@4174 370 if [ -f $BUILD_WOK/$pkg/taz/*/receipt ]; then
pascal@4174 371 . $BUILD_WOK/$pkg/taz/*/receipt
pascal@4174 372 echo "(installing $PACKAGE-${VERSION}$EXTRAVERSION.tazpkg)" \
pascal@4174 373 > $DB_DIR/running
pascal@4174 374 yes | tazpkg install \
pascal@4174 375 $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg \
pascal@4174 376 --forced
pascal@4174 377 return 0
pascal@4174 378 fi
pascal@4174 379 return 1
pascal@4174 380 }
pascal@4174 381
pascal@4174 382 # Sort list according WANTED and BUILD_DEPENDS
pascal@4174 383 sort_cook_list()
pascal@4174 384 {
pascal@4174 385 sort | while read pkg; do
pascal@4174 386 echo -n "$pkg"
pascal@4174 387 WANTED=""
pascal@4174 388 BUILD_DEPENDS=""
pascal@4174 389 . $BUILD_WOK/$pkg/receipt
pascal@4185 390 MISSING=""
pascal@4174 391 for i in $WANTED $BUILD_DEPENDS ; do
pascal@4174 392 if [ ! -f $BUILD_WOK/$i/taz/*/receipt ]; then
pascal@4185 393 case " $MISSING " in
pascal@4185 394 *\ $i\ *);;
pascal@4185 395 *) echo -n " $i";;
pascal@4185 396 esac
pascal@4185 397 MISSING="$MISSING $i"
pascal@4174 398 fi
pascal@4174 399 done
pascal@4174 400 echo ""
pascal@4185 401 done | awk '
pascal@4185 402 function show(name)
pascal@4185 403 {
pascal@4185 404 print name;
pascal@4185 405 got[name]++;
pascal@4185 406 if (revdepcnt[name] > 0)
pascal@4185 407 for (i = split(revdep[name], pkg, " "); i > 0; i--)
pascal@4185 408 if (--depcnt[pkg[i]] == 0) show(pkg[i]);
pascal@4185 409 }
pascal@4185 410
pascal@4185 411 {
pascal@4185 412 if ($2 == "") show($1);
pascal@4185 413 else {
pascal@4185 414 depcnt[$1] = NF - 1;
pascal@4185 415 unres = unres " " $1;
pascal@4185 416 for (i = 2; i <= NF; i++) {
pascal@4185 417 if (got[$i] > 0) continue;
pascal@4185 418 revdepcnt[$i]++;
pascal@4185 419 revdep[$i] = revdep[$i] " " $1;
pascal@4174 420 }
pascal@4174 421 }
pascal@4185 422 }
pascal@4185 423 END {
pascal@4185 424 for (i = split(unres, pkg, " "); i > 0; i--)
pascal@4185 425 if (depcnt[pkg[i]] > 0) print pkg[i];
pascal@4185 426 }
pascal@4174 427 '
pascal@4174 428 }
pascal@4174 429
pankso@3512 430 # Here we cook all packages found in the cooklist.
pankso@3512 431 cook_install()
pankso@3512 432 {
pankso@3512 433 echo "" > $DB_DIR/unbuilt
pascal@4174 434 for pkg in `cat $DB_DIR/cooklist | sort_cook_list`
pankso@3512 435 do
pascal@4174 436 if ! cook_package $pkg; then
pankso@3512 437 # Link to build log.
pascal@4163 438 echo "<a href=\"log.php?package=$(escape $pkg)\">$pkg</a>" >> \
pankso@3512 439 $DB_DIR/unbuilt
pankso@3512 440 fi
pankso@3512 441 # Remove package from the cooklist and empty lines for HTML <pre>.
pankso@3512 442 sed -i /"^$pkg$"/d $DB_DIR/cooklist
pankso@3512 443 sed -i '/^$/d' $DB_DIR/cooklist
pankso@3537 444 packages_summary_update
pankso@3512 445 done
pankso@3512 446 }
pankso@3512 447
pankso@3512 448 # Remove old packages in the build wok and clean pkgs repository. The
pankso@3512 449 # Hg wok is copied into the build wok so packages removed by hg must be
pankso@3512 450 # removed. To remove old packages in the repository we look into the
pankso@3537 451 # build wok and dont remove unbuilt packages. Clean-up will also remove
pankso@3512 452 # all corrupted packages.
pankso@3512 453 clean_up()
pankso@3512 454 {
pankso@3512 455 touch $DB_DIR/removed
pankso@3512 456 echo -e "\nCleaning the build wok, old and corrupted packages...\n"
pankso@3512 457 echo "(cleaning)" > $DB_DIR/running
pankso@4208 458 for pkg in `ls $BUILD_WOK`
pankso@3512 459 do
pankso@4208 460 if [ ! -d $HG_WOK/$pkg ]; then
pankso@3512 461 case $2 in
pankso@3512 462 --dry-run)
pankso@3512 463 echo "Removing directory : $pkg" ;;
pankso@3512 464 --verbose)
pankso@3512 465 echo "Removing directory : $pkg"
pankso@3512 466 rm -rf $BUILD_WOK/$pkg ;;
pankso@3512 467 *)
pankso@3512 468 rm -rf $BUILD_WOK/$pkg ;;
pankso@3512 469 esac
pankso@3512 470 fi
pankso@3512 471 done
pankso@3512 472 # Build a packages list with EXTRAVERSION so we can grep into it.
pankso@3512 473 rm -f $DB_DIR/packaged && touch $DB_DIR/packaged
pankso@3512 474 for receipt in $BUILD_WOK/*/taz/*/receipt
pankso@3512 475 do
pankso@3512 476 EXTRAVERSION=""
pankso@3512 477 . $receipt
pankso@3512 478 echo "$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg" >> $DB_DIR/packaged
pankso@3512 479 done
pankso@3512 480 for pkg in `cd $PACKAGES_REPOSITORY && ls *.tazpkg`
pankso@3512 481 do
pankso@3512 482 if ! grep -q "^$pkg$" $DB_DIR/packaged; then
pankso@3512 483 case $2 in
pankso@3512 484 --dry-run)
pankso@3512 485 echo "Removing package : $pkg" ;;
pankso@3512 486 --verbose)
pankso@3512 487 echo "Removing package : $pkg"
pankso@3512 488 echo "$pkg" >> $DB_DIR/removed
pankso@3512 489 rm -f $PACKAGES_REPOSITORY/$pkg ;;
pankso@3512 490 *)
pankso@3512 491 echo "$pkg" >> $DB_DIR/removed
pankso@3512 492 rm -f $PACKAGES_REPOSITORY/$pkg ;;
pankso@3512 493 esac
pankso@3512 494 fi
pankso@3512 495 done
pankso@3512 496 # Remove all corrupted packages
pankso@3512 497 for pkg in `cat $DB_DIR/corrupted | awk '{ print $3 }'`
pankso@3512 498 do
pankso@3512 499 case $2 in
pankso@3512 500 --dry-run)
pankso@3512 501 echo "Removing corrupted: $pkg" ;;
pankso@3512 502 --verbose)
pankso@3512 503 echo "Removing corrupted: $pkg"
pankso@3512 504 echo "$pkg" >> $DB_DIR/removed
pankso@3512 505 rm -rf $PACKAGES_REPOSITORY/$pkg ;;
pankso@3512 506 *)
pankso@3512 507 echo "$pkg" >> $DB_DIR/removed
pankso@3512 508 rm -rf $PACKAGES_REPOSITORY/$pkg ;;
pankso@3512 509 esac
pankso@3512 510 done
pankso@3512 511 echo ""
pankso@3512 512 # Keep the 20 last removed packages list.
pankso@3512 513 cat $DB_DIR/removed | tail -n 20 > /tmp/removed.tail
pankso@3512 514 mv -f /tmp/removed.tail $DB_DIR/removed
pankso@3512 515 }
pankso@3512 516
pankso@3512 517 blocked_urls()
pankso@3512 518 {
pankso@3512 519 rm -f $DB_DIR/blocked.urls
pankso@3512 520 for pkg in `cat $DB_DIR/blocked`
pankso@3512 521 do
pankso@3512 522 if [ -f $LOG_DIR/$pkg.log ]; then
pascal@4163 523 echo "<a href=\"log.php?package=$(escape $pkg)\">$pkg</a>" >> \
pankso@3512 524 $DB_DIR/blocked.urls
pankso@3512 525 else
pankso@3512 526 echo "$pkg" >> $DB_DIR/blocked.urls
pankso@3512 527 fi
pankso@3512 528 done
pankso@3512 529 }
pankso@3512 530
pankso@3512 531 # 4k, not a meta or a get-* package and no files = buggy package
pankso@3512 532 test_packages()
pankso@3512 533 {
pankso@3512 534 echo -e "\nTesting all packages in: $PACKAGES_REPOSITORY"
pankso@3512 535 echo "================================================================================"
pankso@3512 536 echo "(testing packages)" > $DB_DIR/running
pankso@3512 537 rm -f $DB_DIR/corrupted && touch $DB_DIR/corrupted
pankso@3512 538 for pkg in $PACKAGES_REPOSITORY/*.tazpkg
pankso@3512 539 do
pankso@3512 540 tmp=/tmp/bb-test.$$
pankso@3512 541 CATEGORY=""
pankso@3512 542 if du $pkg | grep -qw '^4' && ! echo `basename $pkg` | grep -q '^get-'; then
pankso@3512 543 mkdir -p $tmp && cd $tmp
pascal@4700 544 cpio -i receipt >/dev/null 2>&1 < $pkg
pankso@3512 545 . ./receipt
pankso@3512 546 if [ "$CATEGORY" != "meta" ]; then
pankso@3512 547 [ "$2" = "--verbose" ] && echo "Testing: $PACKAGE"
pascal@4850 548 cpio -i fs.cpio.gz fs.cpio.lzma >/dev/null 2>&1 < $pkg
pascal@4850 549 if [ ! -f fs.cpio.gz -a ! -f fs.cpio.lzma ]; then
pankso@3516 550 echo "Missing filesystem `basename $pkg`"
pankso@3512 551 if [ -f $LOG_DIR/$PACKAGE.log ];then
pascal@4163 552 echo "Missing filesystem `basename $pkg` <a href=\"log.php?package=$(escape $PACKAGE)\">Log</a>" \
pankso@3512 553 >> $DB_DIR/corrupted
pankso@3512 554 else
pankso@3516 555 echo "Missing filesystem `basename $pkg`" \
pankso@3512 556 >> $DB_DIR/corrupted
pankso@3512 557 fi
pankso@3512 558 else
pascal@4850 559 ( zcat fs.cpio.gz 2> /dev/null || \
pascal@4850 560 unlzma -c fs.cpio.lzma ) | \
pascal@4850 561 cpio -id >/dev/null 2>&1
pascal@4395 562 files=`find fs -type f -o -type l`
pankso@3512 563 if [ -z "$files" ]; then
pankso@3516 564 echo "Empty filesystem `basename $pkg`"
pankso@3512 565 if [ -f $LOG_DIR/$PACKAGE.log ]; then
pascal@4163 566 echo "Empty filesystem `basename $pkg` <a href=\"log.php?package=$(escape $PACKAGE)\">Log</a>" \
pankso@3512 567 >> $DB_DIR/corrupted
pankso@3512 568 else
pankso@3516 569 echo "Empty filesystem `basename $pkg`" \
pankso@3512 570 >> $DB_DIR/corrupted
pankso@3512 571 fi
pankso@3512 572 fi
pankso@3512 573 fi
pankso@3512 574 fi
pankso@3512 575 cd .. && rm -rf $tmp
pankso@3512 576 fi
pankso@3512 577 done
pankso@3512 578 packages_summary_update
pankso@3512 579 echo ""
pankso@3512 580 }
pankso@3512 581
pascal@4447 582 # Generate flavor list
pascal@4447 583 gen_flavor_list()
pascal@4447 584 {
pascal@4447 585 cd $PACKAGES_REPOSITORY
pascal@4447 586 noheader=""
pascal@4447 587 for i in *.flavor; do
pascal@4447 588 tazlito show-flavor $i --brief $noheader
pascal@4447 589 noheader="--noheader"
pascal@4447 590 done > flavors.list
pascal@4447 591 cd - > /dev/null
pascal@4447 592 }
pascal@4447 593
pankso@3512 594 case "$1" in
pankso@3512 595 list-pkgs)
pankso@3512 596 # List last cooked packages.
pankso@3512 597 list_packages ;;
pankso@3512 598 report)
pankso@3512 599 # Run in report mode. If an update is done we must cook-all to
pankso@3512 600 # rebuild all updated packages.
pankso@3512 601 [ "$2" == "--update" ] && update_wok $@ || echo ""
pankso@3512 602 check_wok $@
pascal@4447 603 check_flavors $@
pankso@3512 604 test_packages $@
pankso@3512 605 show_report ;;
pankso@4110 606 cook)
pankso@4110 607 # Cook, install and log a single package build.
pankso@4110 608 if [ -z $2 ]; then
pankso@4110 609 echo "Please specify a package on the command line."
pankso@4110 610 rm -f $LOCK_FILE && exit 0
pankso@4110 611 fi
pankso@4110 612 pkg=$2
pankso@4110 613 echo "Starting to cook and install: $pkg"
pascal@4174 614 if ! cook_package $pkg; then
pankso@4110 615 echo "Unable to install: $pkg"
pankso@4110 616 fi ;;
pankso@3512 617 cook-all)
pankso@3512 618 # Update wok, gen report (with cooklist), cook all packages, test,
pankso@3512 619 # clean, gen new report and lists.
pankso@3512 620 update_wok $@
pankso@3512 621 check_wok $@
pankso@3512 622 cook_install
pankso@3512 623 test_packages $@
pankso@3512 624 clean_up $@
pankso@3512 625 check_wok $@
pankso@3512 626 echo "(generating lists)" > $DB_DIR/running
pankso@3512 627 tazwok gen-list --text
pascal@4447 628 check_flavors $@
pascal@4447 629 pack_flavors
pascal@4447 630 gen_flavor_list
pankso@3512 631 echo "" ;;
pankso@3512 632 cook-commit)
pankso@3512 633 # Cook all packages affected by the last commits in the wok.
pankso@3529 634 # Clean up is done only by cook-all to avoid rebuild of corrupted
pankso@3529 635 # packages on each commit.
pankso@3512 636 update_wok $@
pankso@3512 637 check_commit
pankso@3512 638 cook_install
pankso@3512 639 test_packages $@
pankso@3512 640 check_wok $@
pankso@3512 641 echo "(generating lists)" > $DB_DIR/running
pankso@3512 642 tazwok gen-list --text
pascal@4447 643 check_flavors $@
pascal@4447 644 pack_flavors
pascal@4447 645 gen_flavor_list
pankso@3512 646 echo "" ;;
pankso@3512 647 block)
pankso@3512 648 # Add a pkg name to the list of blocked packages.
pankso@3512 649 echo ""
pankso@3512 650 if grep -qs "^$2$" $DB_DIR/blocked; then
pankso@3512 651 echo -e "$2 is already in the blocked packages list."
pankso@3512 652 else
pankso@3512 653 echo -n "Adding $2 to : $DB_DIR/blocked... "
pankso@3512 654 echo "$2" >> $DB_DIR/blocked && echo "Done"
pankso@3512 655 if grep -q "^$2$" $DB_DIR/cooklist; then
pankso@3512 656 echo -n "Removing $2 from : $DB_DIR/cooklist... "
pankso@3512 657 sed -i /"^$2$"/d $DB_DIR/cooklist && echo "Done"
pankso@3512 658 packages_summary_update
pankso@3512 659 fi
pankso@3512 660 fi
pankso@3512 661 blocked_urls
pankso@3512 662 echo "" ;;
pankso@3512 663 unblock)
pankso@3512 664 # Remove a pkg name from the list of blocked packages.
pankso@3512 665 echo ""
pankso@3512 666 if grep -qs "^$2$" $DB_DIR/blocked; then
pankso@3512 667 echo -n "Removing $2 from : $DB_DIR/blocked... "
pankso@3512 668 sed -i /"^$2$"/d $DB_DIR/blocked
pankso@3512 669 sed -i '/^$/d' $DB_DIR/blocked && echo "Done"
pankso@3512 670 echo -n "Adding $2 to : $DB_DIR/cooklist... "
pankso@3512 671 echo "$2" >> $DB_DIR/cooklist && echo "Done"
pankso@3512 672 packages_summary_update
pankso@3512 673 else
pankso@3512 674 echo -e "$2 is not in the blocked packages list."
pankso@3512 675 fi
pankso@3512 676 blocked_urls
pankso@3512 677 echo "" ;;
pankso@3512 678 test-pkgs)
pankso@3537 679 # Start a test suite on all builded packages.
pankso@3512 680 test_packages $@ ;;
pankso@3512 681 test-suite)
pankso@3537 682 # Start a test suite on all builded package and the wok using
pankso@3512 683 # the great 'tazwok check'.
pankso@3512 684 #
pankso@3512 685 # test_packages > $LOG_DIR/test-suite.log
pankso@3512 686 # tazwok check >> $LOG_DIR/test-suite.log
pankso@3512 687 #
pankso@3512 688 test_packages $@
pankso@3512 689 script -c "tazwok check" $LOG_DIR/test-suite.log ;;
pankso@3590 690 mail)
pankso@3590 691 # Tazbbmail Pythom script wrapper.
pankso@3590 692 PACKAGE=$2
pankso@3590 693 tazbbmail $PACKAGE ;;
pankso@3512 694 clean-up)
pankso@3512 695 # Remove old packages and generate new packages lists.
pankso@3512 696 update_wok $@
pankso@3512 697 clean_up $@
pankso@3512 698 packages_summary_update
pankso@3512 699 [ "$2" != "--dry-run" ] && tazwok gen-list --text ;;
pankso@3512 700 clean-log)
pankso@3512 701 logs=`ls $LOG_DIR | wc -l`
pankso@3512 702 echo -n "Cleaning: $LOG_DIR... "
pankso@3512 703 rm -rf $LOG_DIR/*
pankso@3512 704 echo "$logs log removed" ;;
pankso@3512 705 *)
pankso@3512 706 usage ;;
pankso@3512 707 esac
pankso@3512 708
pankso@3512 709 echo "" > $DB_DIR/running
pankso@3512 710 rm -f $LOCK_FILE
pankso@3512 711
pankso@3512 712 exit 0