cookutils view cooker @ rev 1146

cook: allow built in aufs
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jul 28 07:28:04 2020 +0000 (2020-07-28)
parents a8676623b936
children e58a083722aa
line source
1 #!/bin/sh
2 #
3 # SliTaz Build Bot. The Cooker is a tool to automate and test SliTaz package
4 # building. Please read the Cookbook documentation for more information
5 # and discuss with the AUTHORS before adding anything here. PS: no translations
6 # here since it's not an end user tool and it's not useful. All devs should
7 # at least understand basic English.
8 #
10 . /usr/lib/slitaz/libcook.sh
12 # Set pkg name and use same wok as cook.
13 pkg="$2"
14 wok="$WOK"
16 # PID file.
17 pidfile='/var/run/cooker.pid'
19 #
20 # Functions
21 #
23 usage() {
24 cat <<EOT
26 Usage: cooker [<command>] [<options>]
28 Commands with <options>:
29 -u | usage Display this short usage.
30 -s | setup Setup the Cooker environment.
31 setup-cron [<hours>] Setup a cron job for the Cooker.
32 check-cron Check Cooker cron job.
33 arch-db Create host arch packages DB.
34 -n | note <note_text> Add a note to the cooknotes.
35 -ns | notes Display all the cooknotes.
36 -b | block <package> Block a package so cook will skip it.
37 -ub | unblock <package> Unblock a blocked package.
38 -R | reverse <package> Cook all reverse dependencies for a package.
39 -p | pkg <package> Same as 'cook pkg' but with cooker log.
40 -f | flavor <flavor_name> Cook all packages of a flavor.
41 -l | list <list_file> Cook all packages in the given list.
42 -c | cat <category> Cook all packages of a category.
43 -r | rev <rev_number> Cook packages of a specific revision.
44 -a | all Find and cook all unbuilt packages.
45 -T | tasks List existing cooker tasks.
46 -t | task <task> Executing specified task.
47 -o | outgoing Find changes in wok that we can move to wok-hg.
48 autodeps Find dependencies for all packages in wok.
50 EOT
51 exit 0
52 }
55 # Some messages occur in activity but log verbose output when checking for commits
56 # into a log file.
58 log_commits() {
59 sed '/^.\//d' | sed '/^.hg/d' | tee -a $LOGS/commits.log
60 }
63 # Clean up before exit when check and cook commits finish.
65 clean_exit() {
66 rm -f $command; touch $command
67 [ "$previous_command" ] && ps | grep -q "${previous_command/:/ }" &&
68 echo -n "$previous_command" > $command
69 rm -f $pidfile
70 }
73 # Summary for commits.
75 commits_summary() {
76 msg="from revision $cur to $new"
77 [ "$new" == "$cur" ] && msg="revision $new"
78 echo "Will cook $msg"
79 separator
80 title "Summary for commits"
81 echo "Hg wok revision : $cur"
82 echo "Pulled revision : $new"
83 echo "Check date : $(date '+%F %T')"
84 }
87 # Return all the names of packages bundled in this receipt
89 all_names() {
90 local split=" $SPLIT "
91 unset SPLIT
92 . $wok/$pkg/receipt
94 if ! head -n1 $WOK/$pkg/receipt | fgrep -q 'v2'; then
95 # For receipts v1: $SPLIT may present in the $WANTED package,
96 # but split packages have their own receipts
97 echo $PACKAGE
98 elif [ "${split/ $PACKAGE /}" != "$split" ]; then
99 echo $SPLIT
100 else
101 echo $PACKAGE $SPLIT
102 fi
103 }
106 # Scan packages build deps and fill up cookorder list.
108 cook_order_scan() {
109 rm -f $cookorder $cookorder.split
110 touch $cookorder $cookorder.split
112 # Make combined split table: beginning from actual information with fresh
113 # commits. Example:
114 # freetype freetype freetype-dev
115 # harfbuzz harfbuzz harfbuzz-apps harfbuzz-dev
116 while read pkg; do
117 echo "$pkg $(all_names)" >> $cookorder.split
118 done < $cooklist
119 cat $cache/split.db >> $cookorder.split
121 maxlen=$(wc -L < $cooklist)
123 while read pkg; do
124 unset WANTED BUILD_DEPENDS
125 . $wok/$pkg/receipt
126 bdeps=$(
127 # Substitite each package of BUILD_DEPENDS list by the "main"
128 # receipt which builds this package. Example:
129 # BUILD_DEPENDS="freetype-dev harfbuzz-dev" -> bdeps="freetype harfbuzz"
130 for i in $BUILD_DEPENDS; do
131 main="$(awk -F$'\t' -vi="$i" '{
132 if (index(" " $2 " ", i)) {print $1; exit}
133 }' $cookorder.split)"
134 echo ${main:-$i}
135 done
136 )
137 # The :: is for web interface color.
138 bdeps=$(echo $WANTED $bdeps | tr '\n' ' ')
139 printf "%-${maxlen}s :: %s\n" "$pkg" "$bdeps"
140 for dep in $bdeps; do
141 if grep -q "^$dep$" $cooklist; then
142 if ! grep -q "^$dep$" $cookorder; then
143 echo "$dep" >> $cookorder
144 fi
145 fi
146 done
147 done < $cooklist
149 # Append unordered packages to cookorder.
150 while read pkg; do
151 if ! grep -q "^$pkg$" $cookorder; then
152 echo "$pkg" >> $cookorder
153 fi
154 done < $cooklist
155 }
158 # Scan and rescan until the cooklist is ordered then handle WANTED.
160 cook_order() {
161 time=$(date +%s)
162 scan=0
163 rm -rf $cache/cookorder.d
164 mkdir -p $cache/cookorder.d
166 # Keep an original cooklist so we do a diff when ordering is finished.
167 cp -f $cooklist $cooklist.0
168 echo 'cookorder' > $command
169 title 'Initial Cooker order scan'
170 cook_order_scan
172 # Diff between the cooklist and new ordered list ? So copy the last
173 # cookorder to cooklist and rescan it.
174 while /bin/true; do
175 if ! cmp -s $cooklist $cookorder; then
176 scan=$(($scan + 1))
177 title "Diff scan: $scan"
179 md5stamp=$(md5sum $cookorder | cut -d' ' -f1)
180 if [ -e "$cache/cookorder.d/$md5stamp" ]; then
181 newline
182 echo 'A dependency loop was detected. Interrupting the cookorder.'
183 break
184 fi
185 touch $cache/cookorder.d/$md5stamp
187 mv -f $cookorder $cooklist
188 cook_order_scan
190 else
191 break
192 fi
193 done
194 # Clean
195 rm -rf $cache/cookorder.d; rm $cookorder.split
197 # Keep a diff between submitted cooklist and the ordered.
198 diff $cooklist.0 $cooklist > $cooklist.diff
199 rm -f $cookorder $cooklist.0
201 # Scan finished: append pkg to WANTED or leave it in the ordered cooklist.
202 # TODO: grep the line number to get pkg position and keep it higher.
203 title 'Handle WANTED package'
204 while read pkg; do
205 unset WANTED
206 . $wok/$pkg/receipt
207 for wanted in $WANTED; do
208 echo "$pkg :: $wanted"
209 if grep -q ^${wanted}$ $cooklist; then
210 sed -i -e "/^$pkg$/d" \
211 -e "/^$wanted$/ a $pkg" $cooklist
212 fi
213 done
214 done < $cooklist
216 # Show ordered cooklist
217 title 'Cooklist order'
218 cat $cooklist
219 separator
221 time=$(($(date +%s) - $time))
222 pkgs=$(wc -l < $cooklist)
223 title 'Summary for cookorder'
224 cat <<EOT
225 Ordered packages : $pkgs
226 Scans executed : $scan
227 Scan duration : ${time}s
228 EOT
229 separator
231 rm -f $command
232 }
235 # Remove blocked (faster this way than grepping before).
237 strip_blocked() {
238 while read pkg; do
239 sed -i "/^${pkg}$/d" $cooklist
240 done < $blocked
241 sed -i '/^$/d' $cooklist
242 }
245 # Use in default mode and with all cmd.
247 cook_commits() {
248 if [ -s "$commits" ]; then
249 while read pkg; do
250 ps | grep -q "cook $pkg$" && continue
251 echo "cook:$pkg" > $command
252 cook $pkg || broken
253 sed -i "/^${pkg}$/d" $commits
254 done < $commits
255 fi
256 }
259 # Cook all packages in a cooklist.
261 cook_list() {
262 while read pkg; do
263 ps | grep -q "cook $pkg$" && continue
264 cook $pkg || broken
265 sed -i "/^${pkg}$/d" $cooklist
266 done < $cooklist
267 }
270 # Create a arch.$ARCH file for each package cooked for the target host
271 # architecture
272 #
273 # The deal: we don't want all packages handled by cooker commands and stats,
274 # since we don't cross compile all packages for each arch but only a set of
275 # packages to provide one full featured desktop, servers and goodies useful
276 # for the host system.
277 #
279 arch_db() {
280 count=0
281 echo "Cleaning packages DB : arch.$ARCH"
282 rm -f $wok/*/arch.$ARCH && cd $wok
283 echo "Creating $ARCH packages DB..."
284 for pkg in *; do
285 [ -e $wok/$pkg/.hidden ] && continue
286 [ -s $wok/$pkg/receipt ] || continue
287 HOST_ARCH=
288 . $wok/$pkg/receipt
289 if [ -n "$HOST_ARCH" ]; then
290 if $(echo "$HOST_ARCH" | egrep -q "$ARCH|any"); then
291 count=$(($count + 1))
292 echo "Adding: $pkg"
293 touch $pkg/arch.$ARCH
294 fi
295 unset HOST_ARCH
296 else
297 # HOST_ARCH not set --> package is suitable for current ARCH
298 count=$(($count + 1))
299 echo "Adding: $pkg"
300 touch $pkg/arch.$ARCH
301 fi
302 done
303 echo "Packages for $ARCH : $count"
304 }
307 # Compare wok and wok-hg file $1, display signs:
308 # '+' file added, '-' file removed, '~' file changed, '=' file not changed
310 compare_wok_file() {
311 local f1='n' f2='n' # n: not exists, e: exists
312 [ -e "$wok/$1" ] && f1='e'
313 [ -e "$wok-hg/$1" ] && f2='e'
314 case "$f1$f2" in
315 en) echo "+ $1";;
316 ne) [ -n "$del" ] && echo "- $1";;
317 ee)
318 if cmp -s "$wok/$1" "$wok-hg/$1"; then
319 [ -n "$eq" ] && echo "= $1"
320 else
321 echo "~ $1"
322 fi
323 ;;
324 esac
325 }
328 # Compare wok and wok-hg folder $1; process only:
329 # receipt, description.*txt, all files in the stuff folder
331 compare_wok_folder() {
332 IFS=$'\n'
333 {
334 for i in $wok $wok-hg; do
335 ls $i/$1/receipt 2>/dev/null
336 ls $i/$1/description.*txt 2>/dev/null
337 [ -d $i/$1/stuff ] && find $i/$1/stuff -type f
338 done
339 } | sed "s|$wok/$1/||; s|$wok-hg/$1/||" | sort -u | \
340 while read file; do
341 compare_wok_file "$1/$file"
342 done
343 }
346 # Compare entire wok
348 compare_wok() {
349 {
350 cd $wok; ls
351 cd $wok-hg; ls
352 } | sort -u | \
353 while read folder; do
354 result="$(compare_wok_folder $folder)"
355 [ -n "$result" ] && echo -e "$result\n"
356 done
357 }
360 #
361 # Commands
362 #
364 previous_command="$(cat $command 2>/dev/null)"
365 case "$1" in
366 usage|help|-u|-h)
367 usage ;;
369 setup|-s)
370 # Setup the Cooker environment.
371 title 'Setting up the Cooker'
372 mkdir -p $CACHE
373 echo "Cooker setup using: $SLITAZ" | log
374 for pkg in $SETUP_PKGS mercurial rsync tazlito; do
375 [ ! -d "$INSTALLED/$pkg" ] && tazpkg get-install $pkg
376 done
377 mkdir -p $SLITAZ && cd $SLITAZ
378 if [ -d "${wok}-hg" ]; then
379 echo -e 'Hg wok already exists.\n'
380 exit 1
381 fi
382 if [ -d "$wok" ]; then
383 echo -e 'Build wok already exists.\n'
384 exit 1
385 fi
387 # Directories and files
388 echo "mkdir's and touch files in: $SLITAZ"
389 mkdir -p $PKGS $LOGS $FEEDS $CACHE $SRC
390 for f in $activity $blocked $broken $commits $cooklist $command; do
391 touch $f
392 done
393 hg clone $WOK_URL ${wok}-hg || exit 1
394 [ -d "$flavors" ] || hg clone $FLAVORS_URL flavors
395 cp -a ${wok}-hg $wok
396 footer ;;
398 arch-db)
399 # Manually create arch packages DB.
400 arch_db ;;
402 setup-cron)
403 # Create cron job for the cooker.
404 [ "$2" ] || hours=2
405 if [ ! -f "$crontabs" ]; then
406 mkdir -p /var/spool/cron/crontabs
407 fi
408 if ! fgrep -q /usr/bin/cooker $crontabs; then
409 cat > $crontabs <<EOT
410 # Run SliTaz Cooker every $hours hours
411 59 */$hours * * * touch $CACHE/cooker-request
412 */5 * * * * [ $CACHE/cooker-request -nt $CACHE/activity ] && /usr/bin/cooker --output=html
413 */5 * * * * [ -z "$(pidof cooker)" ] && [ -s $CACHE/recook-packages ] && /usr/bin/cooker list $CACHE/recook-packages
414 EOT
415 touch $CACHE/cooker-request $CACHE/recook-packages
416 chmod 666 $CACHE/cooker-request $CACHE/recook-packages
417 killall crond 2>/dev/null && /etc/init.d/crond start
418 fi ;;
420 check-cron)
421 if [ ! -f "$crontabs" ]; then
422 echo "There is no $crontabs here. Use setup-cron option."
423 exit 1
424 fi
425 fgrep /usr/bin/cooker $crontabs ;;
427 note|-n)
428 # Blocked a pkg and want others to know why? Post a note!
429 [ -n "$2" ] && echo "$(date '+%F %R') : $2" >> $cooknotes ;;
431 notes|-ns)
432 # View cooknotes.
433 title 'Cooknotes'
434 cat $cooknotes
435 footer ;;
437 block|-b)
438 # Block a package.
439 [ "$pkg" ] && cook $pkg --block ;;
441 unblock|-ub)
442 # Unblock a package.
443 [ "$pkg" ] && cook $pkg --unblock ;;
445 reverse|-r)
446 # Cook all reverse dependencies for a package. This command lets us
447 # control the Cooker manually for commits that will cook a lot of packages.
448 #
449 # Use hg commit? Ex: hg commit -m "Message bla bla | cooker:reverse"
450 #
451 if [ ! -d "$wok/$pkg" ]; then
452 echo -e "\nNo package $2 found.\n"
453 exit 0
454 fi
455 rm -f $cooklist; touch $cooklist
456 title "Reverse cooklist for: $pkg"
458 cd $wok
459 for rev in *; do
460 [ -s $wok/$rev/receipt ] || continue
461 unset WANTED DEPENDS BUILD_DEPENDS; . $wok/$rev/receipt
462 if echo "$WANTED $DEPENDS $BUILD_DEPENDS" | fgrep -q $pkg; then
463 echo "$rev" | tee -a $cooklist
464 fi
465 done
466 footer "Reverse dependencies found: $(wc -l < $cooklist)"
467 strip_blocked
468 cook_order | tee $LOGS/cookorder.log
469 cook_list ;;
471 pkg|-p)
472 # Same as 'cook pkg'.
473 ps | grep -q "cook $pkg$" && echo 'Already running' && continue
474 cook $pkg || broken
475 clean_exit ;;
477 cat|-c)
478 # Cook all packages of a category.
479 cat="$2"
480 rm -f $cooklist; touch $cooklist
482 cd $wok
483 for pkg in *; do
484 [ -s $pkg/receipt ] || continue
485 unset CATEGORY; . $pkg/receipt
486 [ "$CATEGORY" == "$cat" ] && echo $pkg >> $cooklist
487 done
488 strip_blocked
489 cook_order | tee $LOGS/cookorder.log
490 cook_list ;;
492 flavor|-f)
493 # Cook all packages of a flavor.
494 name="$2"
495 if [ ! -d "$flavors/$name" ]; then
496 echo -e "\nSpecified flavor does not exist: $name\n"
497 exit 1
498 fi
499 if [ -d "$flavors/.hg" ]; then
500 cd $flavors; hg pull -u
501 fi
502 list="$flavors/$name/packages.list"
503 cp -a $list $cooklist
504 strip_blocked
505 cook_order | tee $LOGS/cookorder.log
506 cook_list ;;
508 list|-l)
509 # Cook a list of packages given in argument.
510 list="$2"
511 if [ ! -f "$list" ]; then
512 echo -e "\nSpecified list does not exist: $list\n"
513 exit 1
514 fi
515 cat $list >> $cooklist
516 echo -n > $list
517 strip_blocked
518 cook_order | tee $LOGS/cookorder.log
519 cook_list ;;
521 rev|-r)
522 # Cook or recook a specific Hg revision.
523 rev="$2"
524 [ "$rev" ] || exit 0
525 rm -f $cooklist; touch $cooklist
527 cd $wok
528 for pkg in $(hg log --rev=$rev --template "{files}"); do
529 echo "$pkg" | cut -d/ -f1 >> $cooklist
530 done
531 strip_blocked
532 cook_order | tee $LOGS/cookorder.log
533 cook_list ;;
535 all|-a)
536 # Try to build all unbuilt packages except blocked's.
537 echo 'cooker:all' > $command
538 rm -f $cooklist; touch $cooklist
539 title 'Cooker cooklist'
541 # Find all unbuilt packages. Get EXTRAVERSION from packed receipt
542 # if it exists since extra version is added when packing the package.
543 echo 'Searching for all unbuilt packages' | log
545 cd $wok
546 for pkg in *; do
547 [ -s $pkg/receipt ] || continue
548 unset EXTRAVERSION
549 . $pkg/receipt
550 [ -f "$pkg/taz/$PACKAGE-$VERSION/receipt" ] && \
551 . $pkg/taz/$PACKAGE-$VERSION/receipt
552 if [ ! -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" ]; then
553 echo $pkg; echo $pkg >> $cooklist
554 fi
555 done
556 strip_blocked
557 cook_order | tee $LOGS/cookorder.log
558 echo "Receipts or stuff changed: $(wc -l < $cooklist)" | log
559 cook_list ;;
561 tasks|-T)
562 # List existing cooker tasks
563 [ ! -d "$tasks" ] && echo 'There are no tasks.' && exit 0
564 title 'Cooker tasks list'
565 last=$(ls $tasks | tail -n1)
566 for task in $(ls $tasks); do
567 . $tasks/$task
568 echo "Task name : $task"
569 echo "Description : $DESC"
570 separator $([ $task != $last ] && echo '-')
571 done
572 newline ;;
574 task|-t)
575 # Executing specified task
576 task="$2"
577 title "Executing cooker task: $task"
578 . $tasks/$task; task
579 footer "Task $task finished" ;;
581 outgoing|-o)
582 # Find changes in wok that we can move to wok-hg
583 compare_wok
584 ;;
586 autodeps)
587 # Find dependencies for all packages in wok
588 cd $WOK
589 for pkg in *; do
590 cook $pkg --deps --quiet
591 done | tee $cache/autodeps
592 ;;
594 *)
595 # Default is to cook all commits if not yet running.
596 [ -n "$1" ] && usage
597 cooklist=$commits
598 if [ -f "$pidfile" ]; then
599 pid=$(cat $pidfile)
600 if [ -s /proc/$pid/status ]; then
601 echo -e "\nStill cooking latest commits with pid:"
602 echo -e " $pid\n"
603 exit 0
604 fi
605 rm -f "$pidfile"
606 fi
608 # Start and get a PID file.
609 rm -f $LOGS/commits.log
610 newline
611 echo 'Checking for commits' | log_commits
612 separator | tee -a $LOGS/commits.log
614 echo $$ > $pidfile
615 trap 'echo -e "\nCooker stopped: PID $$\n" && \
616 rm -f $pidfile $command && exit 1' INT TERM
618 echo "Cooker PID : $$" | log_commits
619 echo "Cooker date : $(date '+%F %T')" | log_commits
621 # Get revisions. Here we have 2 echoes since we want a msg on screen,
622 # in commits log and activity DB without a space before.
623 cd $wok || exit 1
624 cur=$(hg head --template '{rev}\n')
625 echo "Updating wok : ${wok}-hg (rev $cur)" | log_commits
626 echo "Updating wok: ${wok}-hg" | log
627 echo 'hg:pull' > $command
628 cd $wok-hg; hg pull -u | log_commits
629 new=$(hg head --template '{rev}\n')
630 # Store last rev to be used by CGI so it doesn't need to call hg head
631 # on each load.
632 echo "$new" > $wokrev
634 # Sync build wok with rsync so we don't take care about removing old
635 # files as before.
636 if [ "$new" -gt "$cur" ]; then
637 echo "Changes found from: $cur to $new" | log
638 echo 'Syncing build wok with Hg wok...' | log_commits
639 rsync -r -t -c -l -u -v -D -E $wok-hg/ $wok/ | \
640 sed '/^$/d' | log_commits
641 else
642 echo "No revision changes: $cur vs $new" | log
643 separator | log_commits
644 clean_exit; newline
645 exit 0
646 fi
648 # Get and display modifications.
649 cd $wok-hg
650 commits_summary | log_commits
651 cur=$(($cur + 1))
652 rm -f $commits.tmp; touch $commits.tmp
653 for rev in $(seq $cur $new); do
654 for file in $(hg log --rev=$rev --template "{files}"); do
655 pkg=$(echo $file | cut -d/ -f1)
656 desc=$(hg log --rev=$rev --template "{desc}" $file)
657 echo "Committed package : $pkg - $desc" | log_commits
658 echo $pkg >> $commits.tmp
659 done
660 done
662 # We may have deleted packages and files in stuff/. Remove it and
663 # clean DB as well as log file.
664 cd $wok
665 for pkg in *; do
666 if [ ! -d "$wok-hg/$pkg" -o -e "$wok-hg/$pkg/.hidden" ]; then
667 echo "Removing package: $pkg" | log_commits
668 if [ -s $wok/$pkg/receipt ]; then
669 . $wok/$pkg/receipt
670 rm -f $PKGS/$PACKAGE-$VERSION*
671 fi
672 rm -rf $wok/$pkg $LOGS/$pkg.log
673 sed -i "/^${pkg}$/d" $blocked $broken $commits.tmp
674 sed -i "/^$pkg\t/d" $PKGS/packages-$ARCH.info
675 sed -i "/^$pkg:/d" $cache/files.list
676 sed -i "/^$pkg\t/d" $cache/badges
677 fi
678 if [ -d "$wok/$pkg/stuff" ]; then
679 if [ ! -d "$wok-hg/$pkg/stuff" ]; then
680 echo "Removing stuff: $pkg/stuff" | log_commits
681 rm -rf $wok/$pkg/stuff
682 else
683 for stuff_file in $(cd $wok/$pkg/stuff; find \( -type f -o -type l \) | sed 's|^\./||'); do
684 if [ ! -f "$wok-hg/$pkg/stuff/$stuff_file" -a \
685 ! -h "$wok-hg/$pkg/stuff/$stuff_file" ]; then
686 echo "Removing file from stuff: $wok/$pkg/stuff/$stuff_file" | log_commits
687 rm -f $wok/$pkg/stuff/$stuff_file
688 rmdir --parents --ignore-fail-on-non-empty $(dirname "$wok/$pkg/stuff/$stuff_file")
689 fi
690 done
691 fi
692 fi
693 done
695 # Keep previous commit and discard duplicate lines
696 cat $commits $commits.tmp | sed '/^$/d' > $commits.new
697 uniq $commits.new > $commits; rm $commits.*
699 # Handle cross compilation. Create arch packages DB and remove pkgs
700 # not cooked for this arch from the commits list.
701 arch_db
702 while read pkg; do
703 if [ ! -f "$wok/$pkg/arch.$ARCH" ]; then
704 echo "Cooker arch : skip $pkg (not included in: $ARCH)" | \
705 log_commits
706 sed -i "/^${pkg}$/d" $commits
707 else
708 echo "Cooker arch : $ARCH" | log_commits
709 fi
710 done < $commits
712 # Re-create split database
713 cook splitdb
715 # Stats
716 pkgs=$(wc -l < $commits)
717 echo "Packages to cook: $pkgs" | log
718 echo "Packages to cook : $pkgs" | log_commits
719 separator | log_commits
720 newline
721 # Just update the wok on --update, don't cook any package
722 if [ -z "$update" ]; then
723 strip_blocked
724 cook_order | tee $LOGS/cookorder.log
725 cook_commits
726 fi
727 clean_exit ;;
728 esac
730 exit 0