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
|
pascal@5823
|
19 LOG_SUFFIX=""
|
pascal@5823
|
20 case "$HG_WOK" in
|
pascal@5823
|
21 *stable) LOG_SUFFIX="&stable=1";;
|
pascal@5823
|
22 esac
|
pankso@3512
|
23
|
pankso@3512
|
24 # Tazbb is only for root.
|
pankso@3512
|
25 if test $(id -u) != 0 ; then
|
pankso@3512
|
26 echo -e "\nYou must be root to run: `basename $0`.\n" && exit 0
|
pankso@3512
|
27 fi
|
pankso@3512
|
28
|
pankso@3537
|
29 # Let tazbb finish is work and make sure needed files exist.
|
pankso@3512
|
30 if [ -f $LOCK_FILE ]; then
|
pankso@3512
|
31 case $1 in
|
pascal@6122
|
32 usage|list-*|*block|check-receipt)
|
pankso@3512
|
33 continue ;;
|
pankso@3512
|
34 *)
|
pankso@3512
|
35 echo -e "\nTazbb is already running and locked...\n"
|
pankso@3512
|
36 exit 0 ;;
|
pankso@3512
|
37 esac
|
pankso@3512
|
38 else
|
pankso@3512
|
39 mkdir -p $DB_DIR $LOG_DIR
|
pankso@3512
|
40 touch $LOCK_FILE $DB_DIR/blocked
|
pankso@3512
|
41 fi
|
pankso@3512
|
42
|
pascal@4236
|
43 # Set KERNEL variable
|
pascal@4236
|
44 if [ -s $BUILD_WOK/linux/receipt ]; then
|
pascal@4236
|
45 . $BUILD_WOK/linux/receipt
|
pascal@4236
|
46 KERNEL=$VERSION
|
pascal@4236
|
47 fi
|
pascal@4236
|
48
|
pascal@5916
|
49 # Get revision
|
pascal@5922
|
50 cd $HG_WOK
|
pascal@5916
|
51 NEW_REV=`hg head --template '{rev}\n'`
|
pascal@5922
|
52 cd - > /dev/null
|
pascal@5916
|
53
|
pankso@3512
|
54 usage()
|
pankso@3512
|
55 {
|
pankso@3512
|
56 echo -e "\nSliTaz developers and build host tool\n
|
pankso@3512
|
57 \033[1mUsage: \033[0m `basename $0` [command] [--option]
|
pankso@3512
|
58 \033[1mCommands: \033[0m\n
|
pascal@4996
|
59 usage Print this short usage and command list.
|
pascal@4996
|
60 list-pkgs List last cooked packages with date.
|
pascal@4996
|
61 report Run in report mode and dont cook anything [--verbose].
|
pascal@4996
|
62 cook Cook, install and log a single package build.
|
pascal@4996
|
63 cook-all Cook all missing, modified or unbuilt packages.
|
pascal@4996
|
64 cook-commit Cook all packages affected by a commit in the last update.
|
pascal@4996
|
65 test-pkgs Execute a test suite on all packages [--verbose].
|
pascal@4996
|
66 [un]block Block or unblock a package to skip or enable building.
|
pascal@4996
|
67 mail Send mail to package maintainer with tazbbmail.
|
pascal@4996
|
68 check-depends Verify DEPENDS value with library needs [--verbose].
|
pascal@4996
|
69 clean-up Remove old packages [--verbose|--dry-run].
|
pascal@4996
|
70 clean-log Remove all generated build log files.\n"
|
pankso@3512
|
71 }
|
pankso@3512
|
72
|
pankso@3512
|
73 status()
|
pankso@3512
|
74 {
|
pankso@3512
|
75 local CHECK=$?
|
pankso@3512
|
76 echo -en "\033[70G"
|
pankso@3512
|
77 if [ $CHECK = 0 ]; then
|
pankso@3512
|
78 echo "Done"
|
pankso@3512
|
79 else
|
pankso@3512
|
80 echo "Failed"
|
pankso@3512
|
81 fi
|
pankso@3512
|
82 return $CHECK
|
pankso@3512
|
83 }
|
pankso@3512
|
84
|
pankso@3512
|
85 top_summary()
|
pankso@3512
|
86 {
|
pankso@3512
|
87 cat > $DB_DIR/summary << _EOT_
|
pankso@3512
|
88 Update : `date`
|
pankso@3512
|
89 Revision : $NEW_REV (<a href="$HG_URL/log/$NEW_REV">changelog</a>)
|
pankso@3512
|
90 _EOT_
|
pankso@3512
|
91 }
|
pankso@3512
|
92
|
pankso@3512
|
93 packages_summary()
|
pankso@3512
|
94 {
|
pankso@3512
|
95 if ! grep -q "^Packages" $DB_DIR/summary; then
|
pankso@3512
|
96 cat >> $DB_DIR/summary << _EOT_
|
pankso@3512
|
97 Packages : `ls $BUILD_WOK | wc -l` in the wok, `cat $DB_DIR/cooklist | wc -l` to cook, \
|
gokhlayeh@6540
|
98 `cat $DB_DIR/genpkglist | wc -l` to repack, `cat $DB_DIR/blocked | wc -l` blocked, \
|
gokhlayeh@6540
|
99 `cat $DB_DIR/corrupted | wc -l` corrupted
|
pankso@3512
|
100 _EOT_
|
pankso@3512
|
101 fi
|
pankso@3512
|
102 }
|
pankso@3512
|
103
|
pascal@4996
|
104 VERBOSE=""
|
pascal@4996
|
105
|
pankso@3512
|
106 packages_summary_update()
|
pankso@3512
|
107 {
|
pankso@3512
|
108 sed -i s/"[0-9]* in the wok"/"`ls $BUILD_WOK | wc -l` in the wok"/ \
|
pankso@3512
|
109 $DB_DIR/summary
|
pankso@3512
|
110 sed -i s/"[0-9]* to cook"/"`cat $DB_DIR/cooklist | wc -l` to cook"/ \
|
pankso@3512
|
111 $DB_DIR/summary
|
gokhlayeh@6540
|
112 sed -i s/"[0-9]* to repack"/"`cat $DB_DIR/genpkglist | wc -l` to repack"/ \
|
gokhlayeh@6540
|
113 $DB_DIR/summary
|
pankso@3512
|
114 sed -i s/"[0-9]* blocked"/"`cat $DB_DIR/blocked | wc -l` blocked"/ \
|
pankso@3512
|
115 $DB_DIR/summary
|
pankso@3512
|
116 sed -i s/"[0-9]* corrupted"/"`cat $DB_DIR/corrupted | wc -l` corrupted"/ \
|
pankso@3512
|
117 $DB_DIR/summary
|
pankso@3512
|
118 }
|
pankso@3512
|
119
|
pankso@3512
|
120 list_packages()
|
pankso@3512
|
121 {
|
pankso@3512
|
122 cd $PACKAGES_REPOSITORY
|
pankso@3512
|
123 ls -1t *.tazpkg | head -20 | \
|
pankso@3512
|
124 while read file
|
pankso@3512
|
125 do
|
pankso@3512
|
126 echo -n $(stat -c '%y' $PACKAGES_REPOSITORY/$file | cut -d. -f1)
|
pankso@3512
|
127 echo " $file"
|
pankso@3512
|
128 done
|
pankso@3512
|
129 }
|
pankso@3512
|
130
|
pankso@3512
|
131 show_report()
|
pankso@3512
|
132 {
|
pankso@3512
|
133 echo "Cooklist"
|
pankso@3512
|
134 echo "================================================================================"
|
pankso@3512
|
135 cat $DB_DIR/cooklist && echo ""
|
gokhlayeh@6540
|
136 echo "Genpkglist"
|
gokhlayeh@6540
|
137 echo "================================================================================"
|
gokhlayeh@6540
|
138 cat $DB_DIR/genpkglist && echo ""
|
pascal@4447
|
139 echo "Packlist"
|
pascal@4447
|
140 echo "================================================================================"
|
pascal@4447
|
141 cat $DB_DIR/packlist && echo ""
|
pankso@3512
|
142 echo "Blocked"
|
pankso@3512
|
143 echo "================================================================================"
|
pankso@3512
|
144 cat $DB_DIR/blocked && echo ""
|
pankso@3512
|
145 echo ""
|
pankso@3512
|
146 }
|
pankso@3512
|
147
|
pascal@4163
|
148 # URL encoding
|
pascal@4163
|
149 escape()
|
pascal@4163
|
150 {
|
pascal@4163
|
151 echo $1 | sed -e 's/+/%2B/g' -e 's|/|%2F|g' -e 's/:/%3A/g'
|
pascal@4163
|
152 }
|
pascal@4163
|
153
|
pankso@3512
|
154 update_wok()
|
pankso@3512
|
155 {
|
pascal@4447
|
156 local forced
|
pascal@4447
|
157 forced=""
|
pankso@3512
|
158 echo ""
|
pascal@4447
|
159 echo "(updating flavors)" > $DB_DIR/running
|
pascal@4447
|
160 cd $HG_FLAVORS
|
pascal@4447
|
161 LAST_REV=`hg head --template '{rev}\n'`
|
pascal@4447
|
162 hg pull && hg update
|
pascal@4447
|
163 NEW_REV=`hg head --template '{rev}\n'`
|
pascal@4447
|
164 if [ "$NEW_REV" != "$LAST_REV" ]; then
|
pascal@4447
|
165 size=`du -sh $HG_FLAVORS | awk '{ print $1 }'`
|
pascal@4447
|
166 echo -n "Copying Hg flavors to the build flavors ($size)... "
|
pascal@4447
|
167 cp -a $HG_FLAVORS/* $BUILD_FLAVORS
|
pascal@4447
|
168 cp -a $HG_FLAVORS/.hg $BUILD_FLAVORS
|
pascal@4447
|
169 echo -e "Done\n"
|
pascal@4447
|
170 forced="yes"
|
pascal@4447
|
171 fi
|
pankso@3512
|
172 echo "(updating wok)" > $DB_DIR/running
|
pankso@3512
|
173 cd $HG_WOK
|
pankso@3512
|
174 LAST_REV=`hg head --template '{rev}\n'`
|
pankso@3512
|
175 hg pull && hg update
|
pankso@3512
|
176 NEW_REV=`hg head --template '{rev}\n'`
|
pankso@3512
|
177 # Gen a new summary and link last revision for the web interface.
|
pankso@3512
|
178 echo -e "\nHg wok : $HG_WOK ($NEW_REV)"
|
pankso@3512
|
179 echo -e "Build wok : $BUILD_WOK ($LAST_REV)\n"
|
pankso@3512
|
180 top_summary
|
pankso@3512
|
181 # Copy Hg wok if new revision or exit to stop process since nothing
|
pankso@3537
|
182 # have change (--forced can be used).
|
pankso@3512
|
183 if [ "$NEW_REV" != "$LAST_REV" ]; then
|
pankso@3512
|
184 size=`du -sh $HG_WOK | awk '{ print $1 }'`
|
pankso@3512
|
185 echo -n "Copying Hg wok to the build wok ($size)... "
|
pankso@3537
|
186 #rsync -r -n -t $HG_WOK/ $BUILD_WOK/
|
pankso@3512
|
187 cp -a $HG_WOK/* $BUILD_WOK
|
pankso@3512
|
188 cp -a $HG_WOK/.hg $BUILD_WOK
|
pankso@3512
|
189 echo -e "Done\n"
|
pankso@3512
|
190 else
|
pankso@3512
|
191 if [ "$1" = "cook-all" ] || [ "$1" = "cook-commit" ]; then
|
pascal@4447
|
192 if [ "$2" != "--forced" -a -z "$forced" ]; then
|
pankso@3512
|
193 echo -e "Nothing to cook...\n"
|
pankso@3512
|
194 packages_summary
|
pankso@3512
|
195 rm -f $LOCK_FILE && exit 0
|
pankso@3512
|
196 fi
|
pankso@3512
|
197 fi
|
pankso@3512
|
198 fi
|
pankso@3512
|
199 }
|
pankso@3512
|
200
|
pascal@4447
|
201 # Running 'tazbb report' should not pack anything and --verbose option
|
pascal@4447
|
202 # can be used to display more messages.
|
pascal@4447
|
203 check_flavors()
|
pascal@4447
|
204 {
|
pascal@4447
|
205 # Clean up last results.
|
pascal@4447
|
206 rm -f $DB_DIR/packlist && touch $DB_DIR/packlist
|
pascal@4447
|
207 echo ""
|
pascal@4447
|
208 echo "Checking all files in: $HG_FLAVORS"
|
pascal@4447
|
209 echo "================================================================================"
|
pascal@4447
|
210 echo "(checking flavors)" > $DB_DIR/running
|
pascal@4447
|
211 for flavor in $(cd $HG_FLAVORS ; ls)
|
pascal@4447
|
212 do
|
pascal@4447
|
213 [ "$2" = "--verbose" ] && echo "Flavor : $flavor"
|
pascal@4447
|
214 if [ ! -s $PACKAGES_REPOSITORY/$flavor.flavor ]; then
|
pascal@4447
|
215 echo $flavor >> $DB_DIR/packlist
|
pascal@4447
|
216 [ "$1" = "report" ] && echo "Missing : $flavor"
|
pascal@4447
|
217 echo "Missing flavor : $flavor" >> $DB_DIR/report
|
pascal@4447
|
218 continue
|
pascal@4447
|
219 fi
|
pascal@4452
|
220 for i in $(find $HG_FLAVORS/$flavor -type f); do
|
pascal@4447
|
221 [ $PACKAGES_REPOSITORY/$flavor.flavor -nt \
|
pascal@4447
|
222 $i ] && continue
|
pascal@4447
|
223 echo $flavor >> $DB_DIR/packlist
|
pascal@4900
|
224 [ "$1" = "report" ] && echo "Refresh : $flavor for $i"
|
pascal@4447
|
225 echo "Refresh flavor : $flavor" >> $DB_DIR/report
|
pascal@4447
|
226 continue 2
|
pascal@4447
|
227 done
|
pascal@4447
|
228 [ -s $HG_FLAVORS/$flavor/packages.list ] &&
|
pascal@4447
|
229 for i in $(cat $HG_FLAVORS/$flavor/packages.list); do
|
pascal@4902
|
230 if [ ! -d $BUILD_WOK/$i ]; then
|
pascal@4901
|
231 [ "$1" = "report" ] &&
|
pascal@4901
|
232 echo "Fix flavor for $i: $flavor"
|
pascal@4901
|
233 echo "Fix flavor for $i: $flavor" >> $DB_DIR/report
|
pascal@4901
|
234 continue
|
pascal@4901
|
235 fi
|
pascal@4447
|
236 [ $PACKAGES_REPOSITORY/$flavor.flavor -nt \
|
pascal@4447
|
237 $BUILD_WOK/$i/taz ] && continue
|
pascal@4447
|
238 echo $flavor >> $DB_DIR/packlist
|
pascal@4900
|
239 [ "$1" = "report" ] && echo "Repack : $flavor for $i"
|
pascal@4447
|
240 echo "Repack flavor : $flavor" >> $DB_DIR/report
|
pascal@4447
|
241 continue 2
|
pascal@4447
|
242 done
|
pascal@4447
|
243 done
|
pascal@4963
|
244
|
pascal@4963
|
245 # Check for meta flavors
|
pascal@4963
|
246 for flavor in $(cd $HG_FLAVORS ; ls)
|
pascal@4963
|
247 do
|
pascal@4963
|
248 grep -q ^ROOTFS_SELECTION $HG_FLAVORS/$flavor/receipt || continue
|
pascal@4963
|
249 . $HG_FLAVORS/$flavor/receipt
|
pascal@4963
|
250 set -- $ROOTFS_SELECTION
|
pascal@4963
|
251 if [ $PACKAGES_REPOSITORY/$2.flavor -nt \
|
pascal@4963
|
252 $PACKAGES_REPOSITORY/$flavor.flavor ]; then
|
pascal@4963
|
253 echo $flavor >> $DB_DIR/packlist
|
pascal@4963
|
254 [ "$1" = "report" ] && echo "Refresh : $flavor for $2"
|
pascal@4963
|
255 echo "Refresh meta flavor : $flavor" >> $DB_DIR/report
|
pascal@4963
|
256 continue
|
pascal@4963
|
257 fi
|
pascal@4963
|
258 if grep -q ^$2$ $DB_DIR/packlist ; then
|
pascal@4963
|
259 echo $flavor >> $DB_DIR/packlist
|
pascal@4963
|
260 [ "$1" = "report" ] && echo "Repack : $flavor for $2"
|
pascal@4963
|
261 echo "Repack meta flavor : $flavor" >> $DB_DIR/report
|
pascal@4963
|
262 continue
|
pascal@4963
|
263 fi
|
pascal@4963
|
264 done
|
pascal@4447
|
265 }
|
pascal@4447
|
266
|
pascal@4447
|
267 # Here we pack all flavors found in the packlist.
|
pascal@4447
|
268 pack_flavors()
|
pascal@4447
|
269 {
|
pascal@4447
|
270 [ -s $DB_DIR/packlist ] || return
|
pascal@4447
|
271 [ $PACKAGES_REPOSITORY/packages.list -nt /var/lib/tazpkg/packages.list ] &&
|
pascal@4447
|
272 cp -a $PACKAGES_REPOSITORY/packages.list /var/lib/tazpkg/packages.list
|
pascal@4447
|
273 cd $PACKAGES_REPOSITORY
|
pascal@4447
|
274 for flavor in $(cat $DB_DIR/packlist)
|
pascal@4447
|
275 do
|
pascal@4447
|
276 tazlito pack-flavor $flavor
|
pascal@4447
|
277 # Remove flavor from the packlist and empty lines for HTML <pre>.
|
pascal@4447
|
278 sed -i /"^$flavor$"/d $DB_DIR/packlist
|
pascal@4447
|
279 sed -i '/^$/d' $DB_DIR/packlist
|
pascal@4447
|
280 done
|
pascal@4447
|
281 cd - > /dev/null
|
pascal@4447
|
282 }
|
pascal@4447
|
283
|
pankso@3512
|
284 # Running 'tazbb report' should not cook anything and --verbose option
|
pankso@3512
|
285 # can be used to display more messages.
|
pankso@3512
|
286 check_wok()
|
pankso@3512
|
287 {
|
pankso@3512
|
288 # Clean up last results.
|
pankso@3512
|
289 rm -f $DB_DIR/cooklist && touch $DB_DIR/cooklist
|
gokhlayeh@6540
|
290 rm -f $DB_DIR/genpkglist && touch $DB_DIR/genpkglist
|
pankso@3512
|
291 rm -f $DB_DIR/report && touch $DB_DIR/report
|
pankso@3512
|
292 rm -f $DB_DIR/unbuilt && touch $DB_DIR/unbuilt
|
pankso@3512
|
293 echo "Checking all files in: $HG_WOK"
|
pankso@3512
|
294 echo "================================================================================"
|
pankso@3512
|
295 echo "(checking wok)" > $DB_DIR/running
|
pascal@6065
|
296 TOOLCHAIN="$(. $HG_WOK/slitaz-toolchain/receipt ; echo $DEPENDS)"
|
pascal@6065
|
297 TOOLCHAIN="$TOOLCHAIN glibc linux" # break cook loop
|
pankso@3512
|
298 for pkg in $HG_WOK/*
|
pankso@3512
|
299 do
|
pankso@3512
|
300 EXTRAVERSION=""
|
pankso@3512
|
301 WANTED=""
|
pascal@6049
|
302 BUILD_DEPENDS=""
|
pascal@6048
|
303 [ -s $pkg/receipt ] || continue
|
pankso@3512
|
304 . $pkg/receipt
|
pankso@3512
|
305 [ "$2" = "--verbose" ] && echo "Package : $PACKAGE"
|
pankso@3512
|
306 # Skip blocked packages.
|
pankso@3512
|
307 if grep -qs "^$PACKAGE$" $DB_DIR/blocked; then
|
pankso@3512
|
308 echo "Blocked : $PACKAGE ($VERSION)" && continue
|
pankso@3512
|
309 fi
|
pankso@3512
|
310
|
pascal@4447
|
311 # Some packages may compute VERSION at cook time (bristuff)
|
pascal@4447
|
312 if grep -q ^get_version $pkg/receipt; then
|
pankso@3512
|
313 . $BUILD_WOK/$PACKAGE/taz/*/receipt
|
pankso@3512
|
314 fi
|
pankso@3512
|
315
|
pankso@3537
|
316 # First check if package exit. Package naming _must_ be in the form of:
|
pankso@3512
|
317 # $PACKAGE-$VERSION or $PACKAGE-${VERSION}$EXTRAVERSION (Kernel string).
|
pankso@3512
|
318 if [ ! -f $PACKAGES_REPOSITORY/$PACKAGE-$VERSION.tazpkg ]; then
|
pankso@3512
|
319 [ -z "$EXTRAVERSION" ] && EXTRAVERSION="_$KERNEL"
|
pankso@3512
|
320 if [ ! -f $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg ]; then
|
pankso@3512
|
321 [ "$1" = "report" ] && echo "Missing : $PACKAGE ($VERSION)"
|
pankso@3512
|
322 echo "Missing : $PACKAGE ($VERSION)" >> $DB_DIR/report
|
pankso@3512
|
323 echo "$PACKAGE" >> $DB_DIR/cooklist
|
pankso@3512
|
324 fi
|
pankso@3512
|
325 else
|
pankso@3512
|
326 # Check if package is up-to-date.
|
pascal@5881
|
327 PKG_YEAR=`date -u -r $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}${EXTRAVERSION}.tazpkg '+%Y'`
|
pascal@5881
|
328 PKG_DATE=`date -u -r $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}${EXTRAVERSION}.tazpkg '+%m%d%H%M'`
|
pankso@3512
|
329 for file in `find $pkg -type f`
|
pankso@3512
|
330 do
|
pascal@5881
|
331 FILE_YEAR=`date -u -r $file '+%Y'`
|
pascal@5881
|
332 FILE_DATE=`date -u -r $file '+%m%d%H%M'`
|
pankso@3512
|
333 [ "$2" = "--verbose" ] && echo " -> Checking: $file"
|
gokhlayeh@6540
|
334 if [ "$FILE_YEAR" -ge "$PKG_YEAR" -a "$FILE_DATE" -gt "$PKG_DATE" ] && ! grep -q $PACKAGE $DB_DIR/cooklist && ! grep -q $PACKAGE $DB_DIR/genpkglist; then
|
pankso@3512
|
335 [ "$1" = "report" ] && echo "Refresh : $PACKAGE ($VERSION)"
|
pankso@3512
|
336 echo "Refresh : $PACKAGE ($VERSION)" >> $DB_DIR/report
|
pankso@3512
|
337 echo "$PACKAGE" >> $DB_DIR/cooklist
|
pankso@3512
|
338 fi
|
pankso@3512
|
339 done
|
pankso@3512
|
340 fi
|
gokhlayeh@6540
|
341
|
gokhlayeh@6540
|
342 # Desactivate this feature because it create infinite cooking loops.
|
gokhlayeh@6540
|
343 #if ! grep -q $PACKAGE $DB_DIR/cooklist; then
|
gokhlayeh@6540
|
344 # case " $TOOLCHAIN " in
|
gokhlayeh@6540
|
345 # *\ $PACKAGE\ *) continue;;
|
gokhlayeh@6540
|
346 # esac
|
gokhlayeh@6540
|
347 # case "$PACKAGE" in
|
gokhlayeh@6540
|
348 # tazbb|tazwok|tazpkg) continue;;
|
gokhlayeh@6540
|
349 # esac
|
gokhlayeh@6540
|
350 # for dep in $BUILD_DEPENDS $TOOLCHAIN ; do
|
gokhlayeh@6540
|
351 # [ $BUILD_WOK/$PACKAGE/taz -nt $BUILD_WOK/$dep/taz ] && continue
|
gokhlayeh@6540
|
352 # [ "$1" = "report" ] && echo "Refresh : $PACKAGE (older than $dep)"
|
gokhlayeh@6540
|
353 # echo "Refresh : $PACKAGE (older than $dep)" >> $DB_DIR/report
|
gokhlayeh@6540
|
354 # echo "$PACKAGE" >> $DB_DIR/cooklist
|
gokhlayeh@6540
|
355 # break
|
gokhlayeh@6540
|
356 # done
|
gokhlayeh@6540
|
357 #fi
|
pankso@3512
|
358 # Rebuild unbuilt packages list with link to log file. This list
|
pankso@3537
|
359 # is also generated by cook_inslall to have real time stats.
|
pankso@3512
|
360 if [ ! -d $BUILD_WOK/$PACKAGE/taz ]; then
|
pascal@5823
|
361 echo "<a href=\"log.php?package=$(escape $PACKAGE)$LOG_SUFFIX\">$PACKAGE</a>" \
|
pankso@3512
|
362 >> $DB_DIR/unbuilt
|
pankso@3512
|
363 fi
|
pankso@3512
|
364 done
|
pankso@3512
|
365 packages_summary
|
pankso@3512
|
366 }
|
pankso@3512
|
367
|
pankso@3537
|
368 # Create a new cooklist and summary (dont modify report) so 'tazbb cook-commit'
|
pankso@3512
|
369 # can cook last changes.
|
pankso@3512
|
370 check_commit()
|
pankso@3512
|
371 {
|
pankso@3512
|
372 echo "(checking commit)" > $DB_DIR/running
|
pankso@3512
|
373 cd $HG_WOK
|
pankso@3512
|
374 # Clean up last results.
|
pankso@3512
|
375 rm -f $DB_DIR/cooklist && touch $DB_DIR/cooklist
|
pankso@3512
|
376 # Get the name of modified packages by the revision range. +1 last
|
pankso@3537
|
377 # commit was build by the previous build.
|
pankso@3512
|
378 LAST_REV=$(($LAST_REV+1))
|
pankso@3512
|
379 echo -e "Will cook from revision $LAST_REV to $NEW_REV\n"
|
gokhlayeh@6540
|
380 for rev in $(seq $LAST_REV $NEW_REV); do
|
gokhlayeh@6540
|
381 hg_log=$(hg log --rev=$rev --template "{files}\t{desc}\n")
|
gokhlayeh@6540
|
382 for file in $(echo "$hg_log" | cut -f 1); do
|
gokhlayeh@6540
|
383 pkg=`echo $file | cut -d "/" -f 1`
|
gokhlayeh@6540
|
384 if [ "$(echo $hg_log | grep -i '+build')" ]; then
|
gokhlayeh@6540
|
385 if ! grep -q ^$pkg$ $DB_DIR/genpkglist && ! grep -q ^$pkg$ $DB_DIR/cooklist; then
|
gokhlayeh@6540
|
386 if [ -f $pkg/receipt ]; then
|
gokhlayeh@6540
|
387 . $pkg/receipt
|
gokhlayeh@6540
|
388 echo "Commit : $PACKAGE ($VERSION) - genpkg only" >> $DB_DIR/report
|
gokhlayeh@6540
|
389 echo "$PACKAGE" >> $DB_DIR/genpkglist
|
gokhlayeh@6540
|
390 fi
|
gokhlayeh@6540
|
391 fi
|
gokhlayeh@6540
|
392 else
|
gokhlayeh@6540
|
393 if ! grep -q ^$pkg$ $DB_DIR/cooklist; then
|
gokhlayeh@6540
|
394 if [ -f $pkg/receipt ]; then
|
gokhlayeh@6540
|
395 . $pkg/receipt
|
gokhlayeh@6540
|
396 echo "Commit : $PACKAGE ($VERSION)" >> $DB_DIR/report
|
gokhlayeh@6540
|
397 sed "/^$PACKAGE$/d" -i $DB_DIR/genpkglist
|
gokhlayeh@6540
|
398 echo "$PACKAGE" >> $DB_DIR/cooklist
|
gokhlayeh@6540
|
399 fi
|
gokhlayeh@6540
|
400 fi
|
slaxemulator@6330
|
401 fi
|
gokhlayeh@6540
|
402 done
|
pankso@3512
|
403 done
|
pankso@3512
|
404 packages_summary
|
pankso@3512
|
405 }
|
pankso@3512
|
406
|
gokhlayeh@6540
|
407 # Genpkg : don't regen the package if source _pkg is missing, this
|
gokhlayeh@6540
|
408 # function re-generate the package only if all is fine, else it
|
gokhlayeh@6540
|
409 # does nothing and forget the package.
|
gokhlayeh@6540
|
410 genpkg_package()
|
gokhlayeh@6540
|
411 {
|
gokhlayeh@6540
|
412 EXTRAVERSION=""
|
gokhlayeh@6540
|
413 DEPENDS=""
|
gokhlayeh@6540
|
414 BUILD_DEPENDS=""
|
gokhlayeh@6540
|
415 SOURCE=""
|
gokhlayeh@6540
|
416 WANTED=""
|
gokhlayeh@6540
|
417 echo "(Repack <a href=\"log.php?package=$(escape $pkg)$LOG_SUFFIX\">$pkg</a>)" > $DB_DIR/running
|
gokhlayeh@6540
|
418 tazwok check-receipt $pkg && echo 'N' | tazwok genpkg $pkg
|
gokhlayeh@6540
|
419 }
|
gokhlayeh@6540
|
420
|
pascal@4174
|
421 # Cook one package
|
pascal@4174
|
422 cook_package()
|
pascal@4174
|
423 {
|
pascal@4174
|
424 EXTRAVERSION=""
|
pascal@4174
|
425 DEPENDS=""
|
pascal@4174
|
426 BUILD_DEPENDS=""
|
pascal@4174
|
427 SOURCE=""
|
pascal@4174
|
428 WANTED=""
|
pascal@5823
|
429 echo "(cooking <a href=\"log.php?package=$(escape $pkg)$LOG_SUFFIX\">$pkg</a>)" > $DB_DIR/running
|
pascal@4174
|
430 tazwok clean $pkg
|
pascal@6111
|
431 script -c "tazbb check-receipt $pkg && echo 'install' | tazwok cook $pkg" $LOG_DIR/$pkg.log
|
pascal@4174
|
432 # Install new package (important for new shared libs). Note
|
pascal@4174
|
433 # that tests are done separatly with 'test_packages' and should
|
pascal@4174
|
434 # be done by tazwok.
|
pascal@4174
|
435 if [ -f $BUILD_WOK/$pkg/taz/*/receipt ]; then
|
pascal@5013
|
436 TAZBB_NO_INSTALL=""
|
pascal@4174
|
437 . $BUILD_WOK/$pkg/taz/*/receipt
|
pascal@5013
|
438 [ -n "$TAZBB_NO_INSTALL" ] && return 0
|
pascal@4174
|
439 echo "(installing $PACKAGE-${VERSION}$EXTRAVERSION.tazpkg)" \
|
pascal@4174
|
440 > $DB_DIR/running
|
pascal@6143
|
441 script -ac "yes | tazpkg install \
|
pascal@6143
|
442 $PACKAGES_REPOSITORY/$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg --forced" \
|
pascal@6143
|
443 $LOG_DIR/$pkg.log
|
pascal@4174
|
444 return 0
|
pascal@4174
|
445 fi
|
pascal@4174
|
446 return 1
|
pascal@4174
|
447 }
|
pascal@4174
|
448
|
pascal@4174
|
449 # Sort list according WANTED and BUILD_DEPENDS
|
pascal@4174
|
450 sort_cook_list()
|
pascal@4174
|
451 {
|
pascal@4174
|
452 sort | while read pkg; do
|
pascal@4174
|
453 echo -n "$pkg"
|
pascal@4174
|
454 WANTED=""
|
pascal@4174
|
455 BUILD_DEPENDS=""
|
pascal@4174
|
456 . $BUILD_WOK/$pkg/receipt
|
pascal@4185
|
457 MISSING=""
|
pascal@4174
|
458 for i in $WANTED $BUILD_DEPENDS ; do
|
pascal@6091
|
459 # Verify that the dependancy exists and is older
|
pascal@6094
|
460 [ -f $BUILD_WOK/$i/taz/*/receipt ] &&
|
pascal@6094
|
461 [ $BUILD_WOK/$pkg/taz/*/receipt \
|
pascal@6094
|
462 -nt $BUILD_WOK/$i/taz/*/receipt ] && continue
|
pascal@6094
|
463 WANTED=""
|
pascal@6094
|
464 [ -f $BUILD_WOK/$i/receipt ] &&
|
pascal@6094
|
465 . $BUILD_WOK/$i/receipt
|
pascal@6094
|
466 # This dependancy may be cooked
|
pascal@6094
|
467 # by another package
|
pascal@6094
|
468 [ -n "$WANTED" ] && i=$WANTED
|
pascal@6091
|
469 case " $MISSING " in
|
pascal@6091
|
470 *\ $i\ *);;
|
pascal@6091
|
471 *) echo -n " $i";;
|
pascal@6091
|
472 esac
|
pascal@6091
|
473 MISSING="$MISSING $i"
|
pascal@4174
|
474 done
|
pascal@4174
|
475 echo ""
|
pascal@6100
|
476 done | awk '{ deps[$1] = $0; }
|
pascal@6100
|
477 END {
|
pascal@6230
|
478 k=0;
|
pascal@6100
|
479 while (1) {
|
pascal@6100
|
480 skipped = 0;
|
pascal@6100
|
481 done = 0;
|
pascal@6100
|
482 for (entry in deps) {
|
pascal@6100
|
483 for (i = split(deps[entry], pkg, " "); i > 1; i--)
|
pascal@6100
|
484 if (deps[pkg[i]] != "") break;
|
pascal@6100
|
485 if (i == 1) {
|
pascal@6230
|
486 cook[k++] = pkg[1];
|
pascal@6100
|
487 deps[pkg[1]] = "";
|
pascal@6100
|
488 done++;
|
pascal@6100
|
489 }
|
pascal@6100
|
490 else if (i > 1) skipped++;
|
pascal@6100
|
491 }
|
pascal@6100
|
492 if (skipped == 0) break;
|
pascal@6100
|
493 if (done == 0) { # cross deps !!
|
pascal@6100
|
494 for (entry in deps) {
|
pascal@6100
|
495 if (split(deps[entry], pkg, " ") > 1)
|
pascal@6100
|
496 print pkg[1];
|
pascal@6100
|
497 }
|
pascal@6100
|
498 break;
|
pascal@4174
|
499 }
|
pascal@4174
|
500 }
|
pascal@6230
|
501 while (k > 0) print cook[--k];
|
pascal@4185
|
502 }
|
pascal@4174
|
503 '
|
pascal@4174
|
504 }
|
pascal@4174
|
505
|
pankso@3512
|
506 # Here we cook all packages found in the cooklist.
|
pankso@3512
|
507 cook_install()
|
pankso@3512
|
508 {
|
gokhlayeh@6540
|
509 # First repack packages in genpkglist
|
gokhlayeh@6540
|
510 for pkg in `cat $DB_DIR/genpkglist`; do
|
gokhlayeh@6540
|
511 genpkg_package $pkg
|
gokhlayeh@6540
|
512
|
gokhlayeh@6540
|
513 # Remove package from the genpkglist and empty lines for HTML <pre>.
|
gokhlayeh@6540
|
514 sed -i /"^$pkg$"/d $DB_DIR/genpkglist
|
gokhlayeh@6540
|
515 sed -i '/^$/d' $DB_DIR/genpkglist
|
gokhlayeh@6540
|
516 packages_summary_update
|
gokhlayeh@6540
|
517 done
|
gokhlayeh@6540
|
518
|
pankso@3512
|
519 echo "" > $DB_DIR/unbuilt
|
pascal@4174
|
520 for pkg in `cat $DB_DIR/cooklist | sort_cook_list`
|
pankso@3512
|
521 do
|
pascal@4174
|
522 if ! cook_package $pkg; then
|
pankso@3512
|
523 # Link to build log.
|
pascal@5823
|
524 echo "<a href=\"log.php?package=$(escape $pkg)$LOG_SUFFIX\">$pkg</a>" >> \
|
pankso@3512
|
525 $DB_DIR/unbuilt
|
pankso@3512
|
526 fi
|
pascal@4996
|
527 missing_depends="$(check_depends_pkg $pkg)"
|
pascal@4996
|
528 if [ -n "$missing_depends" ]; then
|
pascal@4996
|
529 cat >> $LOG_DIR/$pkg.log <<EOT
|
pascal@4996
|
530
|
pascal@4996
|
531 Update $pkg receipt for DEPENDS :
|
pascal@4996
|
532 The package $pkg depends on packages $missing_depends
|
pascal@4996
|
533
|
pascal@4996
|
534 EOT
|
pascal@4996
|
535 # Unbuild package
|
pascal@4996
|
536 rm -rf $BUILD_WOK/$pkg/taz
|
pascal@4996
|
537 # Link to build log.
|
pascal@5823
|
538 echo "<a href=\"log.php?package=$(escape $pkg)$LOG_SUFFIX\">$pkg</a>" >> \
|
pascal@4996
|
539 $DB_DIR/unbuilt
|
pascal@4996
|
540 fi
|
pankso@3512
|
541 # Remove package from the cooklist and empty lines for HTML <pre>.
|
pankso@3512
|
542 sed -i /"^$pkg$"/d $DB_DIR/cooklist
|
pankso@3512
|
543 sed -i '/^$/d' $DB_DIR/cooklist
|
pankso@3537
|
544 packages_summary_update
|
pankso@3512
|
545 done
|
pankso@3512
|
546 }
|
pankso@3512
|
547
|
pascal@6111
|
548 # Check for misc variables
|
pascal@6111
|
549 check_variables()
|
pascal@6111
|
550 {
|
pascal@6111
|
551 PACKAGE=""
|
pascal@6111
|
552 VERSION=""
|
pascal@6111
|
553 EXTRAVERSION=""
|
pascal@6111
|
554 CATEGORY=""
|
pascal@6111
|
555 SHORT_DESC=""
|
pascal@6111
|
556 MAINTAINER=""
|
pascal@6111
|
557 WEB_SITE=""
|
pascal@6111
|
558 PACKED_SIZE=""
|
pascal@6111
|
559 UNPACKED_SIZE=""
|
pascal@6111
|
560 . $BUILD_WOK/$1/receipt
|
pascal@6111
|
561 if [ "$PACKAGE" != "$1" ]; then
|
pascal@6111
|
562 echo "The PACKAGE variable should be $1"
|
pascal@6111
|
563 return 1
|
pascal@6111
|
564 fi
|
pascal@6111
|
565 if [ -z "$VERSION" ]; then
|
pascal@6111
|
566 echo "No VERSION in $1"
|
pascal@6111
|
567 return 1
|
pascal@6111
|
568 fi
|
pascal@6111
|
569 if [ -z "$SHORT_DESC" ]; then
|
pascal@6111
|
570 echo "No SHORT_DESC in $1"
|
pascal@6111
|
571 return 1
|
pascal@6111
|
572 fi
|
pascal@6111
|
573 case "$MAINTAINER" in
|
pascal@6111
|
574 '') echo "No MAINTAINER in $1"
|
pascal@6111
|
575 return 1 ;;
|
pascal@6111
|
576 *\<*|*\>*)
|
pascal@6111
|
577 echo "Invalid MAINTAINER in $1"
|
pascal@6111
|
578 return 1 ;;
|
pascal@6111
|
579 *@*) ;;
|
pascal@6111
|
580 *) echo "No email address for MAINTAINER in $1"
|
pascal@6111
|
581 return 1 ;;
|
pascal@6111
|
582 esac
|
pascal@6111
|
583 if [ -z "$WEB_SITE" ]; then
|
pascal@6111
|
584 echo "No WEB_SITE in $1"
|
pascal@6111
|
585 return 1
|
pascal@6111
|
586 fi
|
pascal@6111
|
587 if [ -n "$EXTRAVERSION" ]; then
|
pascal@6111
|
588 echo "Hardcoded EXTRAVERSION in $1"
|
pascal@6111
|
589 return 1
|
pascal@6111
|
590 fi
|
pascal@6111
|
591 if [ -n "$PACKED_SIZE" ]; then
|
pascal@6111
|
592 echo "Hardcoded PACKED_SIZE in $1"
|
pascal@6111
|
593 return 1
|
pascal@6111
|
594 fi
|
pascal@6111
|
595 if [ -n "$UNPACKED_SIZE" ]; then
|
pascal@6111
|
596 echo "Hardcoded UNPACKED_SIZE in $1"
|
pascal@6111
|
597 return 1
|
pascal@6111
|
598 fi
|
pascal@6111
|
599 case " base-system x-window utilities network graphics multimedia \
|
pascal@6111
|
600 office development system-tools security games misc meta \
|
pascal@6111
|
601 non-free " in
|
pascal@6111
|
602 *\ $CATEGORY\ *);;
|
pascal@6111
|
603 *) echo "Invalid CATEGORY in $1 : $CATEGORY"
|
pascal@6111
|
604 return 1;
|
pascal@6111
|
605 esac
|
pascal@6111
|
606 return 0
|
pascal@6111
|
607 }
|
pascal@6111
|
608
|
pascal@6111
|
609 # Check for WANTED version
|
pascal@6111
|
610 check_wanted_version()
|
pascal@6111
|
611 {
|
pascal@6111
|
612 WANTED=""
|
pascal@6111
|
613 . $BUILD_WOK/$1/receipt
|
pascal@6123
|
614 if [ -n "$WANTED" ]; then
|
pascal@6111
|
615 expected=$VERSION
|
pascal@6111
|
616 VERSION=
|
pascal@6111
|
617 . $BUILD_WOK/$WANTED/receipt
|
pascal@6111
|
618 if [ "$VERSION" != "$expected" ]; then
|
pascal@6121
|
619 echo "$1: expected wanted version $expected, found $VERSION"
|
pascal@6111
|
620 return 1
|
pascal@6111
|
621 fi
|
pascal@6111
|
622 fi
|
pascal@6111
|
623 return 0
|
pascal@6111
|
624 }
|
pascal@6111
|
625
|
pascal@6111
|
626 # Check for loop in BUILD_DEPENDS/WANTED
|
pascal@6111
|
627 check_build_depends()
|
pascal@6111
|
628 {
|
pascal@6111
|
629 local i
|
pascal@6111
|
630 BUILD_DEPENDS=""
|
pascal@6111
|
631 WANTED=""
|
pascal@6111
|
632 . $BUILD_WOK/$1/receipt
|
pascal@6111
|
633 for i in $BUILD_DEPENDS $WANTED ; do
|
pascal@6111
|
634 case " $2 " in
|
pascal@6111
|
635 *\ $i\ *) echo "Loop in BUILD_DEPENDS/WANTED chain $2 $i"
|
pascal@6111
|
636 return 1 ;;
|
pascal@6111
|
637 *) check_build_depends $i "$2 $1" || return 1 ;;
|
pascal@6111
|
638 esac
|
pascal@6111
|
639 done
|
pascal@6111
|
640 return 0
|
pascal@6111
|
641 }
|
pascal@6111
|
642
|
pascal@4996
|
643 # Build depends_to_skip list with packages to remove from depends_to_add list
|
pascal@4996
|
644 # These packages are already present in depends_to_add trees
|
pascal@4996
|
645 scan_depends_to_skip()
|
pascal@4996
|
646 {
|
pascal@4996
|
647 local i
|
pascal@4996
|
648 case " $depends_to_skip " in
|
pascal@4996
|
649 *\ $1\ *) return;;
|
pascal@4996
|
650 esac
|
pascal@4996
|
651 [ -d $BUILD_WOK/$1 ] || return
|
pascal@4996
|
652 DEPENDS=""
|
pascal@4996
|
653 . $BUILD_WOK/$1/receipt
|
pascal@4996
|
654 for i in $DEPENDS ; do
|
pascal@4996
|
655 case " $depends_to_add " in
|
pascal@4996
|
656 *\ $i\ *) depends_to_skip="$depends_to_skip $i";;
|
pascal@4996
|
657 esac
|
pascal@4996
|
658 done
|
pascal@4996
|
659 for i in $DEPENDS ; do
|
pascal@4996
|
660 scan_depends_to_skip $i
|
pascal@4996
|
661 done
|
pascal@4996
|
662 }
|
pascal@4996
|
663
|
pascal@4996
|
664 # Reduce depends list by scanning nested depends
|
pascal@4996
|
665 show_missing_depends()
|
pascal@4996
|
666 {
|
pascal@4996
|
667 local i
|
pascal@4996
|
668 depends_to_add=""
|
pascal@4996
|
669 depends_to_skip="$2"
|
pascal@4996
|
670 for i in $1 ; do
|
pascal@4996
|
671 case " $depends_to_add " in
|
pascal@4996
|
672 *\ $i\ *) continue;;
|
pascal@4996
|
673 esac
|
pascal@4996
|
674 depends_to_add="$depends_to_add$i "
|
pascal@4996
|
675 done
|
pascal@4996
|
676 for i in $depends_to_add ; do
|
pascal@4996
|
677 scan_depends_to_skip $i
|
pascal@4996
|
678 done
|
pascal@4996
|
679 for i in $depends_to_add ; do
|
pascal@4996
|
680 case " $depends_to_skip " in
|
pascal@4996
|
681 *\ $i\ *) continue;;
|
pascal@4996
|
682 esac
|
pascal@4996
|
683 echo -n "$i "
|
pascal@4996
|
684 done
|
pascal@4996
|
685 }
|
pascal@4996
|
686
|
pascal@4996
|
687 # Build all_depends variable
|
pascal@4996
|
688 scan_dep()
|
pascal@4996
|
689 {
|
pascal@4996
|
690 local i
|
pascal@4996
|
691 all_depends="$all_depends$PACKAGE "
|
pascal@4996
|
692 for i in $DEPENDS $SUGGESTED ; do
|
pascal@4996
|
693 case " $all_depends " in
|
pascal@4996
|
694 *\ $i\ *) continue;;
|
pascal@4996
|
695 esac
|
pascal@4996
|
696 [ -d $BUILD_WOK/$i ] || {
|
pascal@4996
|
697 all_depends="$all_depends$i "
|
pascal@4996
|
698 continue
|
pascal@4996
|
699 }
|
pascal@4996
|
700 DEPENDS=""
|
pascal@4996
|
701 SUGGESTED=""
|
pascal@4996
|
702 . $BUILD_WOK/$i/receipt
|
pascal@4996
|
703 scan_dep
|
pascal@4996
|
704 done
|
pascal@4996
|
705 }
|
pascal@4996
|
706
|
pascal@4996
|
707 # Check for ELF file
|
pascal@4996
|
708 is_elf()
|
pascal@4996
|
709 {
|
pascal@4996
|
710 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
|
pascal@4996
|
711 }
|
pascal@4996
|
712
|
pascal@4996
|
713 # Print shared library dependencies
|
pascal@4996
|
714 ldd()
|
pascal@4996
|
715 {
|
pascal@4996
|
716 LD_PRELOAD="" LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $1 2> /dev/null
|
pascal@4996
|
717 }
|
pascal@4996
|
718
|
pascal@4996
|
719 # scan a file for shared libraries and display according package names
|
pascal@4996
|
720 check_depends_file()
|
pascal@4996
|
721 {
|
pascal@4996
|
722 file=$1
|
pascal@4996
|
723 is_elf $file || continue
|
pascal@4996
|
724 case "$file" in
|
pascal@4996
|
725 *.o|*.ko|*.ko.gz) continue;;
|
pascal@4996
|
726 esac
|
pascal@4996
|
727 [ -s /tmp/files.list.tazbb$$ ] ||
|
pascal@4996
|
728 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma >/tmp/files.list.tazbb$$
|
pascal@4996
|
729 ldd $file | while read lib rem; do
|
pascal@4996
|
730 case "$lib" in
|
pascal@4996
|
731 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
|
pascal@4996
|
732 continue;;
|
pascal@4996
|
733 esac
|
pascal@4996
|
734 for dep in $(grep $lib /tmp/files.list.tazbb$$ | cut -d: -f1); do
|
pascal@4996
|
735 case " $all_depends " in
|
pascal@4996
|
736 *\ $dep\ *) continue 2;;
|
pascal@4996
|
737 esac
|
pascal@4996
|
738 for vdep in $(grep $dep $PACKAGES_REPOSITORY/packages.equiv | cut -d= -f1); do
|
pascal@4996
|
739 case " $all_depends " in
|
pascal@4996
|
740 *\ $vdep\ *) continue 3;;
|
pascal@4996
|
741 esac
|
pascal@4996
|
742 done
|
pascal@4996
|
743 done
|
pascal@4996
|
744 [ -n "$dep" ] || dep="UNKNOWN"
|
pascal@4996
|
745 all_depends="$all_depends $dep"
|
pascal@4996
|
746 if [ -n "$VERBOSE" ]; then
|
pascal@4996
|
747 echo "${file#*fs} depends on package $dep for the shared library $lib" 1>&2
|
pascal@4996
|
748 fi
|
pascal@4996
|
749 echo -n "$dep "
|
pascal@4996
|
750 done
|
pascal@4996
|
751 }
|
pascal@4996
|
752
|
pascal@4996
|
753 DEFAULT_DEPENDS="glibc-base"
|
pascal@4996
|
754
|
pascal@4996
|
755 # scan a package for shared libraries and display missing package in DEPENDS
|
pascal@4996
|
756 check_depends_pkg()
|
pascal@4996
|
757 {
|
pascal@4996
|
758 pkg=$1
|
pascal@4996
|
759 echo "(checking depends for $pkg)" > $DB_DIR/running
|
pascal@4996
|
760 tmp=/tmp/tazbb$$
|
pascal@4996
|
761 mkdir $tmp
|
pascal@4996
|
762 package=$(basename $pkg)
|
pascal@4996
|
763 if ! cd ${package%%-*}*/taz/${package%.tazpkg}/.. 2> /dev/null; then
|
pascal@4996
|
764 cd $tmp
|
pascal@4996
|
765 tazpkg extract $pkg > /dev/null 2>&1
|
pascal@4996
|
766 fi
|
pascal@4996
|
767 . */receipt
|
pascal@4996
|
768 all_depends="$DEFAULT_DEPENDS "
|
pascal@4996
|
769 scan_dep
|
pascal@4996
|
770 toadd=$(find */fs -type f | while read file ; do
|
pascal@4996
|
771 check_depends_file $file
|
pascal@4996
|
772 done)
|
pascal@4996
|
773 . */receipt
|
pascal@4996
|
774 rm -rf */
|
pascal@4996
|
775 cd - > /dev/null
|
pascal@4996
|
776 rm -rf $tmp
|
pascal@4996
|
777 show_missing_depends "$toadd" "$DEPENDS $SUGGESTED"
|
pascal@4996
|
778 }
|
pascal@4996
|
779
|
pascal@4996
|
780 check_depends_this_file()
|
pascal@4996
|
781 {
|
pascal@4996
|
782 file=$1
|
pascal@4996
|
783 all_depends="$DEFAULT_DEPENDS "
|
pascal@4996
|
784 scan_dep
|
pascal@4996
|
785 check_depends_file $file
|
pascal@4996
|
786 }
|
pascal@4996
|
787
|
pankso@3512
|
788 # Remove old packages in the build wok and clean pkgs repository. The
|
pankso@3512
|
789 # Hg wok is copied into the build wok so packages removed by hg must be
|
pankso@3512
|
790 # removed. To remove old packages in the repository we look into the
|
pankso@3537
|
791 # build wok and dont remove unbuilt packages. Clean-up will also remove
|
pankso@3512
|
792 # all corrupted packages.
|
pankso@3512
|
793 clean_up()
|
pankso@3512
|
794 {
|
pankso@3512
|
795 touch $DB_DIR/removed
|
pankso@3512
|
796 echo -e "\nCleaning the build wok, old and corrupted packages...\n"
|
pankso@3512
|
797 echo "(cleaning)" > $DB_DIR/running
|
pankso@4208
|
798 for pkg in `ls $BUILD_WOK`
|
pankso@3512
|
799 do
|
pankso@4208
|
800 if [ ! -d $HG_WOK/$pkg ]; then
|
pankso@3512
|
801 case $2 in
|
pankso@3512
|
802 --dry-run)
|
pankso@3512
|
803 echo "Removing directory : $pkg" ;;
|
pankso@3512
|
804 --verbose)
|
pankso@3512
|
805 echo "Removing directory : $pkg"
|
pankso@3512
|
806 rm -rf $BUILD_WOK/$pkg ;;
|
pankso@3512
|
807 *)
|
pankso@3512
|
808 rm -rf $BUILD_WOK/$pkg ;;
|
pankso@3512
|
809 esac
|
pankso@3512
|
810 fi
|
pankso@3512
|
811 done
|
pankso@3512
|
812 # Build a packages list with EXTRAVERSION so we can grep into it.
|
pankso@3512
|
813 rm -f $DB_DIR/packaged && touch $DB_DIR/packaged
|
pankso@3512
|
814 for receipt in $BUILD_WOK/*/taz/*/receipt
|
pankso@3512
|
815 do
|
pankso@3512
|
816 EXTRAVERSION=""
|
pankso@3512
|
817 . $receipt
|
pankso@3512
|
818 echo "$PACKAGE-${VERSION}$EXTRAVERSION.tazpkg" >> $DB_DIR/packaged
|
pankso@3512
|
819 done
|
pankso@3512
|
820 for pkg in `cd $PACKAGES_REPOSITORY && ls *.tazpkg`
|
pankso@3512
|
821 do
|
pankso@3512
|
822 if ! grep -q "^$pkg$" $DB_DIR/packaged; then
|
pankso@3512
|
823 case $2 in
|
pankso@3512
|
824 --dry-run)
|
pankso@3512
|
825 echo "Removing package : $pkg" ;;
|
pankso@3512
|
826 --verbose)
|
pankso@3512
|
827 echo "Removing package : $pkg"
|
pankso@3512
|
828 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
829 rm -f $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
830 *)
|
pankso@3512
|
831 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
832 rm -f $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
833 esac
|
pankso@3512
|
834 fi
|
pankso@3512
|
835 done
|
pankso@3512
|
836 # Remove all corrupted packages
|
pankso@3512
|
837 for pkg in `cat $DB_DIR/corrupted | awk '{ print $3 }'`
|
pankso@3512
|
838 do
|
pankso@3512
|
839 case $2 in
|
pankso@3512
|
840 --dry-run)
|
pankso@3512
|
841 echo "Removing corrupted: $pkg" ;;
|
pankso@3512
|
842 --verbose)
|
pankso@3512
|
843 echo "Removing corrupted: $pkg"
|
pankso@3512
|
844 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
845 rm -rf $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
846 *)
|
pankso@3512
|
847 echo "$pkg" >> $DB_DIR/removed
|
pankso@3512
|
848 rm -rf $PACKAGES_REPOSITORY/$pkg ;;
|
pankso@3512
|
849 esac
|
pankso@3512
|
850 done
|
pankso@3512
|
851 echo ""
|
pankso@3512
|
852 # Keep the 20 last removed packages list.
|
pankso@3512
|
853 cat $DB_DIR/removed | tail -n 20 > /tmp/removed.tail
|
pankso@3512
|
854 mv -f /tmp/removed.tail $DB_DIR/removed
|
pankso@5132
|
855 # Clean packages stuff/ directory
|
pankso@5132
|
856 echo -e "\nCleaning the build wok stuff/ directories...\n"
|
pankso@5132
|
857 for pkg in `ls $BUILD_WOK`
|
pankso@5132
|
858 do
|
pankso@5132
|
859 if [ -d "$BUILD_WOK/$pkg/stuff" ]; then
|
pankso@5132
|
860 cd $BUILD_WOK/$pkg
|
pankso@5132
|
861 for file in `find stuff -type f`
|
pankso@5132
|
862 do
|
pankso@5132
|
863 if [ ! -f "$HG_WOK/$pkg/$file" ]; then
|
pankso@5132
|
864 echo "Removing: $pkg/$file"
|
pankso@5132
|
865 rm $file
|
pankso@5132
|
866 fi
|
pankso@5132
|
867 done
|
pankso@5132
|
868 fi
|
pankso@5132
|
869 done
|
pankso@3512
|
870 }
|
pankso@3512
|
871
|
pankso@3512
|
872 blocked_urls()
|
pankso@3512
|
873 {
|
pankso@3512
|
874 rm -f $DB_DIR/blocked.urls
|
pankso@3512
|
875 for pkg in `cat $DB_DIR/blocked`
|
pankso@3512
|
876 do
|
pankso@3512
|
877 if [ -f $LOG_DIR/$pkg.log ]; then
|
pascal@5823
|
878 echo "<a href=\"log.php?package=$(escape $pkg)$LOG_SUFFIX\">$pkg</a>" >> \
|
pankso@3512
|
879 $DB_DIR/blocked.urls
|
pankso@3512
|
880 else
|
pankso@3512
|
881 echo "$pkg" >> $DB_DIR/blocked.urls
|
pankso@3512
|
882 fi
|
pankso@3512
|
883 done
|
pankso@3512
|
884 }
|
pankso@3512
|
885
|
pankso@3512
|
886 # 4k, not a meta or a get-* package and no files = buggy package
|
pankso@3512
|
887 test_packages()
|
pankso@3512
|
888 {
|
pankso@3512
|
889 echo -e "\nTesting all packages in: $PACKAGES_REPOSITORY"
|
pankso@3512
|
890 echo "================================================================================"
|
pankso@3512
|
891 echo "(testing packages)" > $DB_DIR/running
|
pankso@3512
|
892 rm -f $DB_DIR/corrupted && touch $DB_DIR/corrupted
|
pankso@3512
|
893 for pkg in $PACKAGES_REPOSITORY/*.tazpkg
|
pankso@3512
|
894 do
|
pankso@3512
|
895 tmp=/tmp/bb-test.$$
|
pankso@3512
|
896 CATEGORY=""
|
pankso@3512
|
897 if du $pkg | grep -qw '^4' && ! echo `basename $pkg` | grep -q '^get-'; then
|
pankso@3512
|
898 mkdir -p $tmp && cd $tmp
|
pascal@4700
|
899 cpio -i receipt >/dev/null 2>&1 < $pkg
|
pankso@3512
|
900 . ./receipt
|
pankso@3512
|
901 if [ "$CATEGORY" != "meta" ]; then
|
pankso@3512
|
902 [ "$2" = "--verbose" ] && echo "Testing: $PACKAGE"
|
pascal@5882
|
903 cpio -i fs.cpio.gz >/dev/null 2>&1 < $pkg
|
pascal@5882
|
904 cpio -i fs.cpio.lzma >/dev/null 2>&1 < $pkg
|
pascal@4850
|
905 if [ ! -f fs.cpio.gz -a ! -f fs.cpio.lzma ]; then
|
pankso@3516
|
906 echo "Missing filesystem `basename $pkg`"
|
pankso@3512
|
907 if [ -f $LOG_DIR/$PACKAGE.log ];then
|
pascal@5823
|
908 echo "Missing filesystem `basename $pkg` <a href=\"log.php?package=$(escape $PACKAGE)$LOG_SUFFIX\">Log</a>" \
|
pankso@3512
|
909 >> $DB_DIR/corrupted
|
pankso@3512
|
910 else
|
pankso@3516
|
911 echo "Missing filesystem `basename $pkg`" \
|
pankso@3512
|
912 >> $DB_DIR/corrupted
|
pankso@3512
|
913 fi
|
pankso@3512
|
914 else
|
pascal@4850
|
915 ( zcat fs.cpio.gz 2> /dev/null || \
|
pascal@4850
|
916 unlzma -c fs.cpio.lzma ) | \
|
pascal@4850
|
917 cpio -id >/dev/null 2>&1
|
pascal@4395
|
918 files=`find fs -type f -o -type l`
|
pankso@3512
|
919 if [ -z "$files" ]; then
|
pankso@3516
|
920 echo "Empty filesystem `basename $pkg`"
|
pankso@3512
|
921 if [ -f $LOG_DIR/$PACKAGE.log ]; then
|
pascal@5823
|
922 echo "Empty filesystem `basename $pkg` <a href=\"log.php?package=$(escape $PACKAGE)$LOG_SUFFIX\">Log</a>" \
|
pankso@3512
|
923 >> $DB_DIR/corrupted
|
pankso@3512
|
924 else
|
pankso@3516
|
925 echo "Empty filesystem `basename $pkg`" \
|
pankso@3512
|
926 >> $DB_DIR/corrupted
|
pankso@3512
|
927 fi
|
pankso@3512
|
928 fi
|
pankso@3512
|
929 fi
|
pankso@3512
|
930 fi
|
pankso@3512
|
931 cd .. && rm -rf $tmp
|
pankso@3512
|
932 fi
|
pankso@3512
|
933 done
|
pankso@3512
|
934 packages_summary_update
|
pankso@3512
|
935 echo ""
|
pankso@3512
|
936 }
|
pankso@3512
|
937
|
pascal@4447
|
938 # Generate flavor list
|
pascal@4447
|
939 gen_flavor_list()
|
pascal@4447
|
940 {
|
pascal@4447
|
941 cd $PACKAGES_REPOSITORY
|
pascal@4447
|
942 noheader=""
|
pascal@4447
|
943 for i in *.flavor; do
|
pascal@4447
|
944 tazlito show-flavor $i --brief $noheader
|
pascal@4447
|
945 noheader="--noheader"
|
pascal@4447
|
946 done > flavors.list
|
pascal@4447
|
947 cd - > /dev/null
|
pascal@4447
|
948 }
|
pascal@4447
|
949
|
pankso@3512
|
950 case "$1" in
|
pankso@3512
|
951 list-pkgs)
|
pankso@3512
|
952 # List last cooked packages.
|
pankso@3512
|
953 list_packages ;;
|
pankso@3512
|
954 report)
|
pankso@3512
|
955 # Run in report mode. If an update is done we must cook-all to
|
pankso@3512
|
956 # rebuild all updated packages.
|
pankso@3512
|
957 [ "$2" == "--update" ] && update_wok $@ || echo ""
|
pankso@3512
|
958 check_wok $@
|
pascal@4447
|
959 check_flavors $@
|
pankso@3512
|
960 test_packages $@
|
pankso@3512
|
961 show_report ;;
|
pankso@4110
|
962 cook)
|
pankso@4110
|
963 # Cook, install and log a single package build.
|
pankso@4110
|
964 if [ -z $2 ]; then
|
pankso@4110
|
965 echo "Please specify a package on the command line."
|
pankso@4110
|
966 rm -f $LOCK_FILE && exit 0
|
pankso@4110
|
967 fi
|
pankso@4110
|
968 pkg=$2
|
pankso@4110
|
969 echo "Starting to cook and install: $pkg"
|
pascal@4174
|
970 if ! cook_package $pkg; then
|
pankso@4110
|
971 echo "Unable to install: $pkg"
|
pankso@4110
|
972 fi ;;
|
pankso@3512
|
973 cook-all)
|
pankso@3512
|
974 # Update wok, gen report (with cooklist), cook all packages, test,
|
pankso@3512
|
975 # clean, gen new report and lists.
|
pankso@3512
|
976 update_wok $@
|
pankso@3512
|
977 check_wok $@
|
pankso@3512
|
978 cook_install
|
pankso@3512
|
979 test_packages $@
|
pascal@5034
|
980 check_flavors $@
|
pascal@5034
|
981 pack_flavors
|
pankso@3512
|
982 clean_up $@
|
pankso@3512
|
983 check_wok $@
|
pankso@3512
|
984 echo "(generating lists)" > $DB_DIR/running
|
pankso@3512
|
985 tazwok gen-list --text
|
pascal@4447
|
986 check_flavors $@
|
pascal@4447
|
987 gen_flavor_list
|
pankso@3512
|
988 echo "" ;;
|
pankso@3512
|
989 cook-commit)
|
pankso@3512
|
990 # Cook all packages affected by the last commits in the wok.
|
pankso@3529
|
991 # Clean up is done only by cook-all to avoid rebuild of corrupted
|
pankso@3529
|
992 # packages on each commit.
|
pankso@3512
|
993 update_wok $@
|
pankso@3512
|
994 check_commit
|
pankso@3512
|
995 cook_install
|
pankso@3512
|
996 test_packages $@
|
pascal@5034
|
997 check_flavors $@
|
pascal@5034
|
998 pack_flavors
|
pankso@3512
|
999 check_wok $@
|
pascal@5034
|
1000 check_flavors $@
|
pankso@3512
|
1001 echo "(generating lists)" > $DB_DIR/running
|
pankso@3512
|
1002 tazwok gen-list --text
|
pascal@4447
|
1003 gen_flavor_list
|
pankso@3512
|
1004 echo "" ;;
|
pankso@3512
|
1005 block)
|
pankso@3512
|
1006 # Add a pkg name to the list of blocked packages.
|
pankso@3512
|
1007 echo ""
|
pankso@3512
|
1008 if grep -qs "^$2$" $DB_DIR/blocked; then
|
pankso@3512
|
1009 echo -e "$2 is already in the blocked packages list."
|
pankso@3512
|
1010 else
|
pankso@3512
|
1011 echo -n "Adding $2 to : $DB_DIR/blocked... "
|
pankso@3512
|
1012 echo "$2" >> $DB_DIR/blocked && echo "Done"
|
pankso@3512
|
1013 if grep -q "^$2$" $DB_DIR/cooklist; then
|
pankso@3512
|
1014 echo -n "Removing $2 from : $DB_DIR/cooklist... "
|
pankso@3512
|
1015 sed -i /"^$2$"/d $DB_DIR/cooklist && echo "Done"
|
pankso@3512
|
1016 packages_summary_update
|
pankso@3512
|
1017 fi
|
pankso@3512
|
1018 fi
|
pankso@3512
|
1019 blocked_urls
|
pankso@3512
|
1020 echo "" ;;
|
pankso@3512
|
1021 unblock)
|
pankso@3512
|
1022 # Remove a pkg name from the list of blocked packages.
|
pankso@3512
|
1023 echo ""
|
pankso@3512
|
1024 if grep -qs "^$2$" $DB_DIR/blocked; then
|
pankso@3512
|
1025 echo -n "Removing $2 from : $DB_DIR/blocked... "
|
pankso@3512
|
1026 sed -i /"^$2$"/d $DB_DIR/blocked
|
pankso@3512
|
1027 sed -i '/^$/d' $DB_DIR/blocked && echo "Done"
|
pankso@3512
|
1028 echo -n "Adding $2 to : $DB_DIR/cooklist... "
|
pankso@3512
|
1029 echo "$2" >> $DB_DIR/cooklist && echo "Done"
|
pankso@3512
|
1030 packages_summary_update
|
pankso@3512
|
1031 else
|
pankso@3512
|
1032 echo -e "$2 is not in the blocked packages list."
|
pankso@3512
|
1033 fi
|
pankso@3512
|
1034 blocked_urls
|
pankso@3512
|
1035 echo "" ;;
|
pankso@3512
|
1036 test-pkgs)
|
pankso@3537
|
1037 # Start a test suite on all builded packages.
|
pankso@3512
|
1038 test_packages $@ ;;
|
pankso@3512
|
1039 test-suite)
|
pankso@3537
|
1040 # Start a test suite on all builded package and the wok using
|
pankso@3512
|
1041 # the great 'tazwok check'.
|
pankso@3512
|
1042 #
|
pankso@3512
|
1043 # test_packages > $LOG_DIR/test-suite.log
|
pankso@3512
|
1044 # tazwok check >> $LOG_DIR/test-suite.log
|
pankso@3512
|
1045 #
|
pankso@3512
|
1046 test_packages $@
|
pankso@3512
|
1047 script -c "tazwok check" $LOG_DIR/test-suite.log ;;
|
pankso@3590
|
1048 mail)
|
pankso@3590
|
1049 # Tazbbmail Pythom script wrapper.
|
pankso@3590
|
1050 PACKAGE=$2
|
pankso@3590
|
1051 tazbbmail $PACKAGE ;;
|
pankso@3512
|
1052 clean-up)
|
pankso@3512
|
1053 # Remove old packages and generate new packages lists.
|
pankso@3512
|
1054 update_wok $@
|
pankso@3512
|
1055 clean_up $@
|
pankso@3512
|
1056 packages_summary_update
|
pankso@3512
|
1057 [ "$2" != "--dry-run" ] && tazwok gen-list --text ;;
|
pankso@3512
|
1058 clean-log)
|
pankso@3512
|
1059 logs=`ls $LOG_DIR | wc -l`
|
pankso@3512
|
1060 echo -n "Cleaning: $LOG_DIR... "
|
pankso@3512
|
1061 rm -rf $LOG_DIR/*
|
pankso@3512
|
1062 echo "$logs log removed" ;;
|
pascal@6111
|
1063 check-receipt)
|
pascal@6111
|
1064 check_variables $2 &&
|
pascal@6111
|
1065 check_wanted_version $2 &&
|
pascal@6111
|
1066 check_build_depends $2 ""
|
pascal@6126
|
1067 exit $? ;;
|
pascal@4996
|
1068 check-depends)
|
pascal@4996
|
1069 case "$2" in
|
pascal@4996
|
1070 wok)
|
pascal@4996
|
1071 for pkg in $PACKAGES_REPOSITORY/*.tazpkg ; do
|
pascal@4996
|
1072 missing_depends="$(check_depends_pkg $pkg)"
|
pascal@4996
|
1073 [ -n "$missing_depends" ] &&
|
pascal@4996
|
1074 echo "The package $pkg depends on $missing_depends."
|
pascal@4996
|
1075 done ;;
|
pascal@4996
|
1076 package)
|
pascal@4996
|
1077 pkg=$3
|
pascal@4996
|
1078 VERBOSE=$4
|
pascal@4996
|
1079 missing_depends="$(check_depends_pkg $pkg)"
|
pascal@4996
|
1080 [ -n "$missing_depends" ] &&
|
pascal@4996
|
1081 echo "The package $pkg depends on $missing_depends."
|
pascal@4996
|
1082 ;;
|
pascal@4996
|
1083 file)
|
pascal@4996
|
1084 file=3
|
pascal@4996
|
1085 VERBOSE=$4
|
pascal@4996
|
1086 missing_depends="$(check_depends_this_file $file)"
|
pascal@4996
|
1087 [ -n "$missing_depends" ] &&
|
pascal@4996
|
1088 echo "The file $file depends on $missing_depends."
|
pascal@4996
|
1089 ;;
|
pascal@4996
|
1090 *) cat <<EOT
|
pascal@4996
|
1091 check-depends wok check every package in wok.
|
pascal@4996
|
1092 check-depends package <pkg> check one package.
|
pascal@4996
|
1093 check-depends file <filename> check one file only.
|
pascal@4996
|
1094 EOT
|
pascal@4996
|
1095 ;;
|
pascal@4996
|
1096 esac ;;
|
pankso@3512
|
1097 *)
|
pankso@3512
|
1098 usage ;;
|
pankso@3512
|
1099 esac
|
pankso@3512
|
1100
|
pankso@3512
|
1101 echo "" > $DB_DIR/running
|
pascal@4996
|
1102 rm -f $LOCK_FILE /tmp/files.list.tazbb$$
|
pankso@3512
|
1103
|
pascal@6122
|
1104 exit 0
|