cookutils rev 478 slitaz-tank

lib: Add libcookorder.sh file. This is as special set of functions for building slitaz-tank from scratch. Its based on tazwok code.
author Christopher Rogers <slaxemulator@gmail.com>
date Sat Jun 09 14:26:00 2012 +0000 (2012-06-09)
parents c092c36141fa
children 86b1f8d50a5e
files lib/libcookorder.sh
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/lib/libcookorder.sh	Sat Jun 09 14:26:00 2012 +0000
     1.3 @@ -0,0 +1,1239 @@
     1.4 +#!/bin/sh
     1.5 +
     1.6 +# Define & create a temporary directory as it's used by report.
     1.7 +tmp=/tmp/$(basename $0)-$$
     1.8 +mkdir -p $tmp
     1.9 +
    1.10 +log_command="$0 $@"
    1.11 +
    1.12 +########################################################################
    1.13 +# EXIT FUNCTIONS
    1.14 +########################
    1.15 +# run_on_exit commands are executed when apps exit (whatever the reason)
    1.16 +# run_on_kill commands are executed only when apps are killed (or Ctrl+C)
    1.17 +# Note : one command per line in the variable.
    1.18 +run_on_exit="rm -rf $tmp"
    1.19 +run_on_kill=""
    1.20 +trap run_on_exit EXIT
    1.21 +trap run_on_kill INT KILL
    1.22 +
    1.23 +run_on_exit()
    1.24 +{
    1.25 +	echo "$run_on_exit" | while read c; do
    1.26 +		run_on_exit=$(echo "$run_on_exit" | sed 1d)
    1.27 +		$c
    1.28 +	done
    1.29 +	trap - EXIT
    1.30 +	exit
    1.31 +}
    1.32 +
    1.33 +run_on_kill()
    1.34 +{
    1.35 +	echo "$run_on_kill" | while read c; do
    1.36 +		run_on_kill=$(echo "$run_on_kill" | sed 1d)
    1.37 +		$c
    1.38 +	done
    1.39 +	trap - INT KILL
    1.40 +	run_on_exit
    1.41 +}
    1.42 +
    1.43 +rsync_wok() {
    1.44 +	if [ -d "$WOKHG" ]; then
    1.45 +		echo "Updating build wok"
    1.46 +		rsync -r -t -l -u --force -v -D -E --delete --exclude-from "/usr/share/cook/exclude.txt" $WOKHG/ $WOK/ | \
    1.47 +			sed '/^$/'d
    1.48 +		for i in $(ls $WOK); do
    1.49 +			[ ! -f $WOKHG/$i/receipt ] || continue
    1.50 +			if [ -d $WOK/$i ]; then
    1.51 +				echo "Deleting $i"
    1.52 +				rm -rf $WOK/$i
    1.53 +			fi
    1.54 +		done
    1.55 +	fi
    1.56 +}
    1.57 +
    1.58 +# Store -- options in a variable.
    1.59 +# Test phase.
    1.60 +# Need to add something to filter options and report errors in case option is not
    1.61 +# listed and used by the command.
    1.62 +get_options()
    1.63 +{
    1.64 +	if echo "$log_command" | fgrep -q ' '--help; then
    1.65 +		echo "Available options for $(echo `basename "$log_command"` | cut -d ' ' -f 1,2) : $get_options_list"
    1.66 +		exit 0
    1.67 +	fi
    1.68 +	for get_option in $(echo "$log_command" | tr ' ' '\n' | grep ^-- | sed 's/^--//'); do
    1.69 +		if [ "${get_options_list/${get_option%%=*}}" = "$get_options_list" ]; then
    1.70 +			echo "Option ${get_option%%=*} is incorrect, valid options are : $get_options_list". >&2
    1.71 +			exit 1
    1.72 +		fi
    1.73 +		if [ "$get_option" = "${get_option/=}" ]; then
    1.74 +			export $get_option=yes
    1.75 +			export opts="$opts --$get_option"
    1.76 +		else
    1.77 +			export $get_option
    1.78 +			export opts="$opts --$get_option"
    1.79 +		fi
    1.80 +	done
    1.81 +}
    1.82 +
    1.83 +gen_wan_db()
    1.84 +{
    1.85 +	local receipt
    1.86 +	[ -f $wan_db ] && rm $wan_db
    1.87 +	for receipt in $(grep -l ^WANTED= $WOK/*/receipt); do
    1.88 +		unset WANTED DEPENDS
    1.89 +		[ -f $receipt ] || continue
    1.90 +		source $receipt
    1.91 +		[ "$WANTED" ] || continue
    1.92 +		echo -e $PACKAGE"\t"$WANTED >> $wan_db
    1.93 +	done
    1.94 +	if [ "$wan_db" = "$INCOMING/wanted.txt" ]; then
    1.95 +		cp -a $wan_db $PKGS/wanted.txt
    1.96 +	fi
    1.97 +}
    1.98 +
    1.99 +gen_dep_db()
   1.100 +{
   1.101 +	local pkg receipt
   1.102 +	[ -f $dep_db ] && rm $dep_db
   1.103 +	for pkg in $(ls $WOK); do
   1.104 +		unset DEPENDS BUILD_DEPENDS
   1.105 +		receipt=$WOK/$pkg/receipt
   1.106 +		if [ -f $receipt ]; then
   1.107 +			source $receipt
   1.108 +			echo -e $PACKAGE"\t "$DEPENDS" \t "$BUILD_DEPENDS' ' >> $dep_db
   1.109 +		fi
   1.110 +	done
   1.111 +	if [ "$dep_db" = "$INCOMING/depends.txt" ]; then
   1.112 +		cp -a $dep_db $PKGS/depends.txt
   1.113 +	fi
   1.114 +}
   1.115 +
   1.116 +gen_wok_db()
   1.117 +{
   1.118 +	echo "Generating wok database"
   1.119 +	echo "Removing old files"
   1.120 +	for file in $wan_db $dep_db $fullco; do
   1.121 +		[ -f $file ] && rm $file
   1.122 +	done
   1.123 +	echo "Generating $(basename $wan_db)"
   1.124 +	gen_wan_db
   1.125 +	echo "Generating $(basename $dep_db)"
   1.126 +	gen_dep_db
   1.127 +	echo "Generating $(basename $fullco)"
   1.128 +	sort_db
   1.129 +}
   1.130 +
   1.131 +look_for_dep()
   1.132 +{
   1.133 +	grep -m1 ^$PACKAGE$'\t' $dep_db | \
   1.134 +		cut -f 2
   1.135 +}
   1.136 +
   1.137 +look_for_all()
   1.138 +{
   1.139 +	grep -m1 ^$PACKAGE$'\t' $dep_db | \
   1.140 +			cut -f 2,3 | sed 's/ 	 / /'
   1.141 +}
   1.142 +
   1.143 +look_for_bdep()
   1.144 +{
   1.145 +	look_for_all
   1.146 +}
   1.147 +
   1.148 +look_for_rdep()
   1.149 +{
   1.150 +	fgrep ' '$PACKAGE' ' $dep_db | cut -f 1
   1.151 +}
   1.152 +
   1.153 +look_for_rbdep()
   1.154 +{
   1.155 +	fgrep ' '$PACKAGE' ' $dep_db | \
   1.156 +		cut -f 1,3 | fgrep ' '$PACKAGE' ' | cut -f 1
   1.157 +}
   1.158 +
   1.159 +look_for_wanted()
   1.160 +{
   1.161 +	grep -m1 ^$PACKAGE$'\t' $wan_db | cut -f 2
   1.162 +}
   1.163 +
   1.164 +look_for_rwanted()
   1.165 +{
   1.166 +	for rwanted in $(grep $'\t'$PACKAGE$ $wan_db | cut -f 1); do
   1.167 +		if [ -f "$WOK/$rwanted/receipt" ]; then
   1.168 +			echo "$rwanted"
   1.169 +		fi
   1.170 +	done
   1.171 +}
   1.172 +
   1.173 +look_for_dev()
   1.174 +{
   1.175 +	WANTED=$(look_for_wanted)
   1.176 +	if [ "$WANTED" ]; then
   1.177 +		[ -f "$WOK/$WANTED-dev/receipt" ] && echo $WANTED-dev
   1.178 +	fi
   1.179 +	[ -f "$WOK/$PACKAGE-dev/receipt" ] && echo $PACKAGE-dev
   1.180 +}
   1.181 +
   1.182 +with_dev()
   1.183 +{
   1.184 +	for PACKAGE in $(cat); do
   1.185 +		echo $PACKAGE
   1.186 +		look_for_dev
   1.187 +	done
   1.188 +}
   1.189 +
   1.190 +with_wanted()
   1.191 +{
   1.192 +	for PACKAGE in $(cat); do
   1.193 +		echo $PACKAGE
   1.194 +		look_for_wanted
   1.195 +	done
   1.196 +}
   1.197 +
   1.198 +use_wanted()
   1.199 +{
   1.200 +	for input in $(cat); do
   1.201 +		{ grep ^$input$'\t' $wan_db || echo $input
   1.202 +		}
   1.203 +	done | sed 's/.*\t//'
   1.204 +}
   1.205 +
   1.206 +# We use md5 of cooking stuff in the packaged receipt to check
   1.207 +# commit. We look consecutively in 3 different locations :
   1.208 +# - in the wok/PACKAGE/taz/* folder
   1.209 +# - in the receipt in the package in incoming repository
   1.210 +# - in the receipt in the package in packages repository
   1.211 +# If md5sums match, there's no commit.
   1.212 +check_for_commit_using_md5sum()
   1.213 +{
   1.214 +	if [ ! -f $WOK/$PACKAGE/md5 ]; then
   1.215 +		sed -n '/# md5sum of cooking stuff :/,$p' receipt | \
   1.216 +			sed -e 1d -e 's/^# //' > $WOK/$PACKAGE/md5
   1.217 +		cd $WOK/$PACKAGE
   1.218 +	fi
   1.219 +
   1.220 +	if [ -s md5 ]; then					
   1.221 +		if md5sum -cs md5; then
   1.222 +			# If md5sum check if ok, check for new/missing files in
   1.223 +			# cooking stuff.
   1.224 +			for file in $([ -f receipt ] && echo receipt; \
   1.225 +				[ -f description.txt ] && echo description.txt; \
   1.226 +				[ -d stuff ] && find stuff); do
   1.227 +				if ! fgrep -q "  $file" md5; then
   1.228 +					set_commited
   1.229 +				fi
   1.230 +			done
   1.231 +		else
   1.232 +			set_commited
   1.233 +		fi
   1.234 +	else
   1.235 +		set_commited
   1.236 +	fi
   1.237 +}
   1.238 +
   1.239 +set_commited()
   1.240 +{
   1.241 +	grep -q ^$PACKAGE$ $commits || echo $PACKAGE >> $commits
   1.242 +	gen_cookmd5
   1.243 +	update_dep_db
   1.244 +}
   1.245 +
   1.246 +gen_cookmd5()
   1.247 +{
   1.248 +	# md5sum of cooking stuff make tazwok able to check for changes
   1.249 +	# without hg.
   1.250 +	md5sum $WOK/$PACKAGE/receipt > $WOK/$PACKAGE/md5
   1.251 +	[ -f $WOK/$PACKAGE/description.txt ] && md5sum $WOK/$PACKAGE/description.txt >> $WOK/$PACKAGE/md5
   1.252 +	if [ -d $WOK/$PACKAGE/stuff ]; then
   1.253 +		find $WOK/$PACKAGE/stuff -type f | while read file; do
   1.254 +			md5sum $file >> $WOK/$PACKAGE/md5
   1.255 +		done
   1.256 +	fi
   1.257 +	sed -i "s|$WOK/$PACKAGE/||g" $WOK/$PACKAGE/md5
   1.258 +}
   1.259 +
   1.260 +check_for_commit()
   1.261 +{
   1.262 +	if ! check_pkg_in_wok; then
   1.263 +		[ "$?" = 2 ] && return 1
   1.264 +		return
   1.265 +	fi
   1.266 +	for PACKAGE in $(look_for_rwanted) $PACKAGE; do
   1.267 +		RECEIPT=$WOK/$PACKAGE/receipt
   1.268 +		unset_receipt
   1.269 +		[ -f $RECEIPT ] || continue
   1.270 +		source $RECEIPT
   1.271 +
   1.272 +		taz_dir=$(echo $WOK/$PACKAGE/taz/$PACKAGE-* | fgrep -v '*')
   1.273 +		if [ -f $WOK/$PACKAGE/md5 ]; then
   1.274 +			cd $WOK/$PACKAGE
   1.275 +			check_for_commit_using_md5sum
   1.276 +		elif [ "$taz_dir" ]; then
   1.277 +			cd $taz_dir
   1.278 +			check_for_commit_using_md5sum
   1.279 +		else
   1.280 +			pkgfile=$(echo $INCOMING/$PACKAGE-$VERSION*.tazpkg | fgrep -v '*')
   1.281 +			[ "$pkgfile" ] || pkgfile=$(echo $PKGS/$PACKAGE-$VERSION*.tazpkg | fgrep -v '*')
   1.282 +			if [ "$pkgfile" ]; then
   1.283 +				get_pkg_files $pkgfile
   1.284 +				check_for_commit_using_md5sum
   1.285 +				rm -r $pkg_files_dir
   1.286 +			else
   1.287 +				set_commited
   1.288 +			fi
   1.289 +		fi
   1.290 +	[ "$forced" ] || echo $PACKAGE >> $tmp/checked
   1.291 +	unset pkgfile
   1.292 +	done
   1.293 +}
   1.294 +
   1.295 +########################################################################
   1.296 +# SCAN
   1.297 +########################
   1.298 +# Use wanted.txt and depeds.txt to scan depends.
   1.299 +# Option in command line (must be first arg) :
   1.300 +#   --look_for=bdep/rbdep - Look for depends or reverse depends.
   1.301 +#   --with_dev - Add development packages (*-dev) in the result.
   1.302 +#   --with_wanted - Add package+reverse wanted in the result.
   1.303 +#   --with_args - Include packages in argument in the result.
   1.304 +
   1.305 +scan()
   1.306 +{
   1.307 +	# Get packages in argument.
   1.308 +	local PACKAGE=$PACKAGE WANTED=$WANTED pkg_list=
   1.309 +	for arg in $@; do
   1.310 +		[ "$arg" = "${arg#--}" ] || continue
   1.311 +		pkg_list="$pkg_list $arg"
   1.312 +	done
   1.313 +
   1.314 +	# Get options.
   1.315 +	[ "$pkg_list" ] || return
   1.316 +	local cooklist= look_for= with_dev= with_wanted= with_args= log_command="$0 $@" \
   1.317 +		get_options_list="look_for with_dev with_wanted with_args cooklist use_wanted"
   1.318 +	get_options
   1.319 +
   1.320 +	# Get db md5 to be able to check for changes latter.
   1.321 +	db_md5=$(md5sum $dep_db $wan_db)
   1.322 +	
   1.323 +	# Cooklist is a special case where we need to modify a little
   1.324 +	# scan behavior
   1.325 +	if [ "$cooklist" ]; then
   1.326 +		gen_wan_db
   1.327 +		look_for=all && with_args=yes && with_dev= && with_wanted=
   1.328 +		filter=use_wanted
   1.329 +		if [ "$COMMAND" = gen-cooklist ]; then
   1.330 +   			for PACKAGE in $pkg_list; do
   1.331 +				grep -q ^$PACKAGE$'\t' $dep_db && continue
   1.332 +				[ -d "$WOK/$p" ] || continue
   1.333 +				check_for_missing
   1.334 +			done
   1.335 +			append_to_dep()
   1.336 +			{
   1.337 +				if grep -q ^$PACKAGE$'\t' $dep_db; then
   1.338 +					echo $PACKAGE >> $tmp/dep
   1.339 +				else
   1.340 +					check_for_missing && echo $PACKAGE >> $tmp/dep
   1.341 +				fi
   1.342 +			}
   1.343 +		else
   1.344 +			append_to_dep()
   1.345 +			{
   1.346 +				check_for_commit && echo $PACKAGE >> $tmp/dep
   1.347 +			}
   1.348 +		fi
   1.349 +	else
   1.350 +		append_to_dep()
   1.351 +		{
   1.352 +			echo $PACKAGE >> $tmp/dep
   1.353 +		}
   1.354 +		# If requested packages are not in dep_db, partial generation of this db is needed.
   1.355 +		for PACKAGE in $pkg_list; do
   1.356 +			grep -q ^$PACKAGE$'\t' $dep_db && continue
   1.357 +			[ -d "$WOK/$p" ] || continue	
   1.358 +			plan_check_for_missing=yes	
   1.359 +			check_for_missing
   1.360 +		done
   1.361 +		if [ "$plan_check_for_missing" ]; then
   1.362 +			append_to_dep()
   1.363 +			{
   1.364 +				if grep -q ^$PACKAGE$'\t' $dep_db; then
   1.365 +					echo $PACKAGE >> $tmp/dep
   1.366 +				else
   1.367 +					check_for_missing && echo $PACKAGE >> $tmp/dep
   1.368 +				fi
   1.369 +			}
   1.370 +			unset plan_check_for_missing
   1.371 +		fi
   1.372 +	fi
   1.373 +	
   1.374 +	[ "$with_dev" ] && filter=with_dev
   1.375 +	[ "$with_wanted" ] && filter=with_wanted
   1.376 +	if [ "$filter" ]; then
   1.377 +		pkg_list=$(echo $pkg_list | $filter | sort -u)
   1.378 +		scan_pkg()
   1.379 +		{
   1.380 +			look_for_$look_for | $filter
   1.381 +		}
   1.382 +	else
   1.383 +		scan_pkg()
   1.384 +		{
   1.385 +			look_for_$look_for
   1.386 +		}
   1.387 +	fi
   1.388 +	touch $tmp/dep
   1.389 +	for PACKAGE in $pkg_list; do
   1.390 +		[ "$with_args" ] && append_to_dep
   1.391 +		scan_pkg		
   1.392 +	done  | tr ' ' '\n' | sort -u > $tmp/list
   1.393 +	[ "$look_for" = bdep ] && look_for=dep
   1.394 +	while [ -s $tmp/list ]; do
   1.395 +		PACKAGE=$(sed 1!d $tmp/list)
   1.396 +		sed 1d -i $tmp/list
   1.397 +		append_to_dep
   1.398 +		for pkg in $(scan_pkg); do
   1.399 +			grep -q ^$pkg$ $tmp/list $tmp/dep || echo $pkg >> $tmp/list
   1.400 +		done
   1.401 +	done
   1.402 +	if [ "$cooklist" ]; then
   1.403 +		mv $tmp/dep $tmp/cooklist
   1.404 +	else
   1.405 +		cat $tmp/dep | sort -u
   1.406 +	fi
   1.407 +	rm -f $tmp/dep $tmp/list
   1.408 +	sort -o $dep_db $dep_db
   1.409 +	sort -o $wan_db $wan_db
   1.410 +	if [ "$db_md5" != "$(md5sum $dep_db $wan_db)" ]; then
   1.411 +		grep -q "^#" $fullco || sed 1i"#PlanSort" -i $fullco
   1.412 +	fi
   1.413 +}
   1.414 +
   1.415 +update_wan_db()
   1.416 +{
   1.417 +	local PACKAGE=$PACKAGE
   1.418 +	wanted_list=$(fgrep WANTED=\"$PACKAGE\" $WOK/*/receipt | cut -f1 -d ':')
   1.419 +	grep $'\t'$PACKAGE$ $wan_db | cut -f 1 | while read wan; do
   1.420 +		echo "$wanted_list" | fgrep -q $WOK/$wan/receipt && continue
   1.421 +		sed "/^$wan\t/d" -i $wan_db
   1.422 +	done 
   1.423 +	for RECEIPT in $wanted_list; do
   1.424 +		unset WANTED PACKAGE
   1.425 +		[ -f $RECEIPT ] || continue
   1.426 +		source $RECEIPT
   1.427 +		[ "$WANTED" ] || continue
   1.428 +		sed "/^$PACKAGE\t/d" -i $wan_db
   1.429 +		echo -e $PACKAGE"\t"$WANTED >> $wan_db
   1.430 +	done
   1.431 +	unset wanted_list
   1.432 +}
   1.433 +
   1.434 +update_dep_db()
   1.435 +{
   1.436 +	sed "/^$PACKAGE\t/d" -i $dep_db
   1.437 +	echo -e $PACKAGE"\t "$DEPENDS" \t "$BUILD_DEPENDS' ' >> $dep_db
   1.438 +}
   1.439 +
   1.440 +sort_db()
   1.441 +{
   1.442 +	#echo "Generating full cookorder (fullco)"
   1.443 +	sed 's/ \t / /' $dep_db | while read PACKAGE BUILD_DEPENDS; do
   1.444 +		grep -q ^$PACKAGE$'\t' $wan_db && continue
   1.445 +		
   1.446 +		# Replace each BUILD_DEPENDS with a WANTED package by it's
   1.447 +		# WANTED package.
   1.448 +		echo -e $PACKAGE"\t $(echo $BUILD_DEPENDS | use_wanted | \
   1.449 +			sort -u | sed "/^$PACKAGE$/d" | tr '\n' ' ') "
   1.450 +	done > $tmp/db
   1.451 +	while [ -s "$tmp/db" ]; do
   1.452 +		status=start
   1.453 +		for pkg in $(cut -f 1 $tmp/db); do
   1.454 +			 if ! fgrep -q ' '$pkg' ' $tmp/db; then
   1.455 +				echo $pkg >> $tmp/fullco
   1.456 +				sed -e "/^$pkg\t/d" -e "s/ $pkg / /g" -i $tmp/db
   1.457 +				status=proceed
   1.458 +			fi
   1.459 +		done
   1.460 +		if [ "$status" = start ]; then
   1.461 +			cp -f $tmp/db /tmp/remain-depends.txt
   1.462 +			echo "Can't go further because of dependency loop(s). The remaining packages will be commented in the cookorder and will be unbuilt in case of major updates until the problem is solved." >&2
   1.463 +			for remaining in $(cut -f 1 $tmp/db); do
   1.464 +				if ! grep -q ^$remaining $blocked; then
   1.465 +					echo "$remaining" >> $blocked
   1.466 +				fi
   1.467 +			done
   1.468 +			break
   1.469 +		fi
   1.470 +	done
   1.471 +	[ -s $tmp/fullco ] || touch $tmp/fullco
   1.472 +	
   1.473 +	# The toolchain packages are moved in first position.
   1.474 +	grep $(for pkg in `scan "$TOOLCHAIN $TOOLCHAIN_EXTRA" \
   1.475 +		--look_for=all --with_args`; do echo " -e ^$pkg$"; done) \
   1.476 +		$tmp/fullco | tac > $fullco
   1.477 +	for pkg in $(cat $fullco); do
   1.478 +		sed "/^$pkg$/d" -i $tmp/fullco
   1.479 +	done
   1.480 +
   1.481 +	tac $tmp/fullco >> $fullco
   1.482 +}
   1.483 +
   1.484 +check_for_missing()
   1.485 +{
   1.486 +	local PACKAGE=$PACKAGE
   1.487 +	if ! check_pkg_in_wok; then
   1.488 +		[ "$?" = 2 ] && return 1
   1.489 +		return
   1.490 +	fi
   1.491 +	RECEIPT=$WOK/$PACKAGE/receipt
   1.492 +	[ -f $RECEIPT ] || continue
   1.493 +	source $RECEIPT
   1.494 +	PACKAGE=${WANTED:-$PACKAGE}
   1.495 +	update_wan_db
   1.496 +	for PACKAGE in $(look_for_rwanted) $PACKAGE; do
   1.497 +		RECEIPT=$WOK/$PACKAGE/receipt
   1.498 +		[ -f $RECEIPT ] || continue
   1.499 +		source $RECEIPT
   1.500 +		update_dep_db
   1.501 +	done
   1.502 +}
   1.503 +
   1.504 +look_for_missing_pkg()
   1.505 +{
   1.506 +	for pkg in $(cat $1); do
   1.507 +		grep -q ^$pkg$ $INCOMING/packages.txt \
   1.508 +			$PKGS/packages.txt || \
   1.509 +			continue
   1.510 +		echo $pkg
   1.511 +	done
   1.512 +}
   1.513 +
   1.514 +# Output $VERSION-$EXTRAVERSION using packages.txt
   1.515 +get_pkg_version()
   1.516 +{
   1.517 +	[ "$PACKAGE" ] || return
   1.518 +	grep -m1 -A1 -sh ^$PACKAGE$ $1/packages.txt | tail -1 | sed 's/ *//'
   1.519 +}
   1.520 +
   1.521 +remove_previous_package()
   1.522 +{
   1.523 +	if [ "$prev_VERSION" ] && [ "$VERSION$EXTRAVERSION" != "$prev_VERSION" ]; then
   1.524 +		rm -f $1/$PACKAGE-$prev_VERSION.tazpkg
   1.525 +	fi
   1.526 +	return 0
   1.527 +}
   1.528 +
   1.529 +gen_cook_list()
   1.530 +{
   1.531 +	#echo "Scanning wok"
   1.532 +	if [ "$pkg" ]; then
   1.533 +		scan $pkg --cooklist
   1.534 +	elif [ "$LIST" ]; then
   1.535 +		scan `cat $LIST` --cooklist
   1.536 +	else
   1.537 +		scan `cat $cooklist` --cooklist
   1.538 +	fi
   1.539 +		
   1.540 +	[ -s $tmp/checked ] || [ -s $tmp/cooklist ] || return
   1.541 +	
   1.542 +	# Core toolchain should not be cooked unless cook-toolchain is used.
   1.543 +	if [ "$COMMAND" != "toolchain" ] ; then
   1.544 +		for PACKAGE in $(scan slitaz-toolchain --look_for=all --with_args --with_wanted); do
   1.545 +			grep -q ^$PACKAGE$ $blocked || \
   1.546 +				echo $PACKAGE >> $blocked
   1.547 +		done
   1.548 +	fi
   1.549 +
   1.550 +	if [ -s $commits ] && [ "$COMMAND" != gen-cooklist ]; then
   1.551 +		for PACKAGE in $(cat $commits); do
   1.552 +			WANTED="$(look_for_wanted)"
   1.553 +			if [ "$WANTED" ]; then
   1.554 +				grep -q ^$WANTED$ $broken $cooklist $blocked $commits && continue
   1.555 +			fi
   1.556 +			grep -q ^$PACKAGE$ $blocked $cooklist && continue
   1.557 +			echo $PACKAGE >> $cooklist
   1.558 +		done
   1.559 +	fi
   1.560 +	sort_cooklist
   1.561 +}
   1.562 +
   1.563 +sort_cooklist()
   1.564 +{
   1.565 +	if [ "$(sed 1!d $fullco)" = "#PlanSort" ]; then
   1.566 +		sed 1d -i $fullco
   1.567 +		sort_db
   1.568 +	fi
   1.569 +	#echo "Generating cooklist"
   1.570 +	if [ -f "$tmp/checked" ]; then
   1.571 +		rm -f $tmp/cooklist
   1.572 +		cat $tmp/checked | while read PACKAGE; do
   1.573 +			grep -q ^$PACKAGE$ $cooklist && echo $PACKAGE >> $tmp/cooklist
   1.574 +		done
   1.575 +	elif ! [ "$COMMAND" = gen-cooklist ]; then
   1.576 +		cat $blocked | while read PACKAGE; do
   1.577 +			sed "/^$PACKAGE/d" -i $tmp/cooklist
   1.578 +		done
   1.579 +	fi
   1.580 +	[ -s $tmp/cooklist ] || return
   1.581 +
   1.582 +	#echo "Sorting cooklist"
   1.583 +	for PACKAGE in $(cat $tmp/cooklist); do
   1.584 +		WANTED="$(look_for_wanted)"
   1.585 +		[ "$WANTED" ] || continue
   1.586 +		if grep -q ^$WANTED$ $broken $tmp/cooklist; then
   1.587 +			sed "/^$PACKAGE$/d" -i $tmp/cooklist
   1.588 +		elif [ ! -d $WOK/$WANTED/install ]; then
   1.589 +			sed "/^$PACKAGE$/d" -i $tmp/cooklist
   1.590 +			echo $WANTED >> $tmp/cooklist
   1.591 +		fi
   1.592 +	done
   1.593 +
   1.594 +	# Use cookorder.txt to sort cooklist.
   1.595 +	if [ -s $tmp/cooklist ]; then
   1.596 +		cat $fullco | while read PACKAGE; do
   1.597 +			if grep -q ^$PACKAGE$ $tmp/cooklist; then
   1.598 +				sed "/^$PACKAGE$/d" -i $tmp/cooklist
   1.599 +				echo $PACKAGE >> $tmp/cooklist.tmp
   1.600 +			fi
   1.601 +		done
   1.602 +
   1.603 +		# Remaining packages in cooklist are those without compile_rules.
   1.604 +		# They can be cooked first in any order.
   1.605 +		if [ -f $tmp/cooklist.tmp ]; then
   1.606 +			cat $tmp/cooklist.tmp >> $tmp/cooklist
   1.607 +			rm $tmp/cooklist.tmp
   1.608 +		fi
   1.609 +		
   1.610 +		cat $tmp/cooklist
   1.611 +		[ "$LIST" ] || cat $tmp/cooklist > $cooklist
   1.612 +	fi
   1.613 +}
   1.614 +
   1.615 +# Check $COOK_OPT; usage : get_cookopt particular_opt
   1.616 +# Return error if not found
   1.617 +# Return args if the opt is in the format opt=arg1:arg2:etc
   1.618 +look_for_cookopt()
   1.619 +{
   1.620 +	for arg in $COOK_OPT; do
   1.621 +		case $arg in
   1.622 +			$1=*)
   1.623 +				arg=${arg#$1=}
   1.624 +				while [ "$arg" ]; do
   1.625 +					echo "${arg%%:*}"
   1.626 +					[ "${arg/:}" = "$arg" ] && return
   1.627 +					arg=${arg#*:}
   1.628 +				done
   1.629 +			;;
   1.630 +			$1)
   1.631 +				return
   1.632 +			;;
   1.633 +		esac
   1.634 +	done
   1.635 +	return 1
   1.636 +}
   1.637 +
   1.638 +check_for_incoming()
   1.639 +{
   1.640 +	echo "Checking that all packages were cooked OK"
   1.641 +	[ -s $INCOMING/packages.desc ] || {
   1.642 +	echo "No packages in $INCOMING."
   1.643 +	return; }
   1.644 +	if [ -s $broken ]; then
   1.645 +		missingpkg=$(look_for_missing_pkg $broken)
   1.646 +		if [ "$missingpkg" ]; then
   1.647 +			echo "Don't move incoming packages to main repository because these ones are broken:" >&2
   1.648 +			echo "$missingpkg"
   1.649 +			return 1
   1.650 +		fi
   1.651 +	fi
   1.652 +	if [ -s $cooklist ]; then
   1.653 +		missingpkg=$(look_for_missing_pkg $cooklist)
   1.654 +		if [ "$missingpkg" ]; then
   1.655 +			echo "Don't move incoming packages to main repository because these ones need to be cooked:" >&2
   1.656 +			echo "$missingpkg"
   1.657 +			return 1
   1.658 +		fi
   1.659 +	fi
   1.660 +	incoming_pkgs="$(cut -f 1 -d '|' $INCOMING/packages.desc)"
   1.661 +	if ! [ "$forced" ]; then
   1.662 +		cooklist=$CACHE/cooklist
   1.663 +		pkg="$incoming_pkgs"
   1.664 +		gen_cook_list
   1.665 +		if [ -s $cooklist ]; then
   1.666 +			missingpkg=$(look_for_missing_pkg $cooklist)
   1.667 +			if [ "$missingpkg" ]; then
   1.668 +				echo "Don't move incoming packages to main repository because these ones need to be cooked:" >&2
   1.669 +				echo "$missingpkg"
   1.670 +				return 1
   1.671 +			fi
   1.672 +		fi
   1.673 +	fi
   1.674 +
   1.675 +	echo "Moving incoming packages to main repository"
   1.676 +	unset EXTRAVERSION
   1.677 +	for PACKAGE in $incoming_pkgs; do
   1.678 +			prev_VERSION=$(get_pkg_version $PKGS)
   1.679 +			VERSION=$(get_pkg_version $INCOMING)
   1.680 +			remove_previous_package $PKGS
   1.681 +			echo "Moving $PACKAGE..."
   1.682 +			mv -f $INCOMING/$PACKAGE-${VERSION}${EXTRAVERSION}.tazpkg $PKGS
   1.683 +			touch $PKGS/$PACKAGE-${VERSION}${EXTRAVERSION}.tazpkg
   1.684 +			if [ "$AUTO_PURGE_SRC" ]; then
   1.685 +				previous_tarball=$(grep ^$PACKAGE:main $SRC/sources.list | cut -f2)
   1.686 +				sed -e "/^$PACKAGE:main/d" \
   1.687 +					-e "s/^$PACKAGE:incoming/$PACKAGE:main/" \
   1.688 +					-i $SRC/sources.list
   1.689 +				if [ "$previous_tarball" ]; then
   1.690 +					grep -q $'\t'$previous_tarball$ $SRC/sources.list || \
   1.691 +						rm -f $SRC/$previous_tarball
   1.692 +				fi
   1.693 +			fi
   1.694 +	done
   1.695 +	for file in packages.list packages.equiv packages.md5 packages.desc \
   1.696 +		packages.txt; do
   1.697 +		echo -n "" > $INCOMING/$file
   1.698 +	done
   1.699 +	[ -f "$INCOMING/files.list.lzma" ] && rm -r $INCOMING/files.list.lzma
   1.700 +	pkg_repository=$PKGS && gen_packages_db
   1.701 +
   1.702 +}
   1.703 +
   1.704 +# help gen sources.list file from scranch
   1.705 +gen_sources_list()
   1.706 +{
   1.707 +	local src_repository=$1
   1.708 +	[ -f $src_repository/sources.list ] && rm -f $src_repository/sources.list
   1.709 +	for i in $WOK/*; do
   1.710 +		unset PACKAGE SOURCE KBASEVER VERSION WGET_URL TARBALL WANTED
   1.711 +		[ -f $i/receipt ] && source $i/receipt
   1.712 +		[ "$WGET_URL" ] || continue
   1.713 +		if grep -q "^$PACKAGE | $VERSION" $PKGS/packages.desc; then
   1.714 +			main_version="$VERSION"
   1.715 +			if [ -f $src_repository/${SOURCE:-$PACKAGE}-${KBASEVER:-$VERSION}.tar.lzma ]; then
   1.716 +				echo -e "$PACKAGE:main\t${SOURCE:-$PACKAGE}-${KBASEVER:-$VERSION}.tar.lzma" >> $src_repository/sources.list
   1.717 +			elif [ -f "$src_repository/$TARBALL" ]; then
   1.718 +				echo -e "$PACKAGE:main\t$TARBALL" >> $src_repository/sources.list
   1.719 +			fi
   1.720 +		else
   1.721 +			# May not works if package use extraversion.
   1.722 +			main_version=$(grep -m1 -A1 -sh ^$PACKAGE$ $PKGS/packages.txt | tail -1 | sed 's/ *//')
   1.723 +			if [ -f $src_repository/${SOURCE:-$PACKAGE}-${KBASEVER:-$main_version}.tar.lzma ]; then
   1.724 +				echo -e "$PACKAGE:main\t${SOURCE:-$PACKAGE}-${KBASEVER:-$main_version}.tar.lzma" >> $src_repository/sources.list
   1.725 +			else
   1.726 +				unset main_version
   1.727 +			fi
   1.728 +		fi
   1.729 +		if [ ! "$main_version" ] || [ $(grep -q "^$PACKAGE | $VERSION" $INCOMING/packages.desc 2>/dev/null) ]; then
   1.730 +			if [ -f $src_repository/${SOURCE:-$PACKAGE}-${KBASEVER:-$VERSION}.tar.lzma ]; then
   1.731 +				echo -e "$PACKAGE:incoming\t${SOURCE:-$PACKAGE}-${KBASEVER:-$VERSION}.tar.lzma" >> $src_repository/sources.list
   1.732 +			elif [ -f "$src_repository/$TARBALL" ]; then
   1.733 +				echo -e "$PACKAGE:incoming\t$TARBALL" >> $src_repository/sources.list
   1.734 +			fi
   1.735 +		fi
   1.736 +	done
   1.737 +}
   1.738 +
   1.739 +get_pkg_files()
   1.740 +{
   1.741 +	pkg_files_dir=/tmp/cook/$(basename ${1%.tazpkg})
   1.742 +	mkdir -p $pkg_files_dir && \
   1.743 +		cd $pkg_files_dir && \
   1.744 +		cpio --quiet -idm receipt < $1 2>/dev/null && \
   1.745 +		cpio --quiet -idm files.list < $1 2>/dev/null && \
   1.746 +		cpio --quiet -idm library.list < $1 2>/dev/null
   1.747 +}
   1.748 +
   1.749 +check_so_files()
   1.750 +{
   1.751 +	pwd=$(pwd)
   1.752 +	for rep in $PKGS $INCOMING; do
   1.753 +		prev_VERSION=$(get_pkg_version $rep)
   1.754 +		[ "$prev_VERSION" ] && pkg_file=$rep/$PACKAGE-$prev_VERSION.tazpkg && break
   1.755 +	done
   1.756 +	if [ "$pkg_file" ]; then
   1.757 +		gettext -e "Looking for major/minor updates in libraries\n"
   1.758 +		get_pkg_files $pkg_file
   1.759 +		if [ -d $WOK/$PACKAGE/taz/$PACKAGE-${VERSION}${EXTRAVERSION} ]; then
   1.760 +			cd $WOK/$PACKAGE/taz/$PACKAGE-${VERSION}${EXTRAVERSION}
   1.761 +		else
   1.762 +			cd $WOK/$PACKAGE/taz/$PACKAGE-$VERSION
   1.763 +		fi
   1.764 +		
   1.765 +		pkg_to_check=$(diff $pkg_files_dir/files.list files.list | \
   1.766 +		grep '^-/.*\.so' | while read lib; do
   1.767 +			pkg=$(fgrep " ${lib##*/} " $lib_db | cut -f1)
   1.768 +			for i in $pkg; do
   1.769 +				[ -f $WOK/$i/receipt ] || continue
   1.770 +				wanted=$(grep ^WANTED= $WOK/$i/receipt | cut -d "=" -f2 | sed -e 's/"//g')
   1.771 +				if [ "$wanted" ]; then
   1.772 +					echo $wanted
   1.773 +				else
   1.774 +					echo $i
   1.775 +				fi
   1.776 +			done
   1.777 +		done | sort -u)
   1.778 +		
   1.779 +		if [ "$pkg_to_check" ]; then
   1.780 +			for rdep in $(scan $PACKAGE --look_for=rdep | use_wanted); do
   1.781 +				echo "$pkg_to_check" | grep -q ^$rdep$ || continue
   1.782 +				[ "$rdep" = "${WANTED:-$PACKAGE}" ] && continue
   1.783 +				grep -q ^$rdep$ $blocked $cooklist && continue
   1.784 +				echo "Plan to recook $rdep"
   1.785 +				echo $rdep >> $cooklist
   1.786 +				regen_cooklist=yes
   1.787 +			done
   1.788 +		fi
   1.789 +		update_lib_db
   1.790 +		rm -r $pkg_files_dir
   1.791 +		unset pkg_file pkg_file_dir pkg_to_check
   1.792 +		cd $pwd
   1.793 +   	else
   1.794 +		if [ -d $WOK/$PACKAGE/taz/$PACKAGE-${VERSION}${EXTRAVERSION} ]; then
   1.795 +			cd $WOK/$PACKAGE/taz/$PACKAGE-${VERSION}${EXTRAVERSION}
   1.796 +		else
   1.797 +			cd $WOK/$PACKAGE/taz/$PACKAGE-$VERSION
   1.798 +		fi
   1.799 +		update_lib_db
   1.800 +		cd $pwd
   1.801 +   	fi
   1.802 +}
   1.803 +
   1.804 +check_recook_rdeps()
   1.805 +{
   1.806 +	# Recook of reverse-depends if package was broken.
   1.807 +	if grep -q "^$PACKAGE$" $broken; then
   1.808 +		echo "Planning a re-try cook of reverse depends" 
   1.809 +		sed "/^$PACKAGE$/d" -i $broken
   1.810 +		for rdep in $(look_for_rdep); do
   1.811 +			grep -q "^$rdep$" $broken || continue
   1.812 +			grep -q "^$rdep$" $cooklist && continue
   1.813 +			echo "Adding $rdep to the cooklist"
   1.814 +			echo $rdep >> $cooklist
   1.815 +			regen_cooklist=t
   1.816 +		done
   1.817 +	fi
   1.818 +	sed "/^$PACKAGE$/d" -i $commits
   1.819 +	sed "/^$PACKAGE$/d" -i $cooklist
   1.820 +}
   1.821 +
   1.822 +remove_src()
   1.823 +{
   1.824 +	[ "$WANTED" ] && return
   1.825 +	look_for_cookopt !remove_src && return
   1.826 +	
   1.827 +	# Don't remove sources if a package uses src variable in its
   1.828 +	# genpkg_rules: it maybe needs something inside.
   1.829 +	for i in $PACKAGE $(look_for_rwanted); do
   1.830 +		sed -n '/^genpkg_rules\(\)/','/^}/'p $WOK/$i/receipt | \
   1.831 +			fgrep -q '$src' && gettext -e "Sources will not be removed \
   1.832 +because $i uses \$src in its receipt.\n" && return
   1.833 +	done
   1.834 +	
   1.835 +	gettext -e "Removing sources directory"
   1.836 +	echo ""
   1.837 +	rm -fr "$src"
   1.838 +	[ -d $WOK/$PACKAGE/source ] && rm -rf $WOK/$PACKAGE/source
   1.839 +}
   1.840 +
   1.841 +check_for_var_modification()
   1.842 +{
   1.843 +	for var in $@; do
   1.844 +		for pkg in $PACKAGE $(look_for_wanted) $(look_for_rwanted); do
   1.845 +			[ -f $WOK/$pkg/receipt ] || continue
   1.846 +			fgrep -q "$var=" $WOK/$pkg/receipt && return 1
   1.847 +		done
   1.848 +	done
   1.849 +	
   1.850 +	# Tweak to make if; then...; fi function working with this one.
   1.851 +	echo -n ""
   1.852 +}
   1.853 +
   1.854 +clean()
   1.855 +{
   1.856 +	cd $WOK/$PACKAGE
   1.857 +	ls -A $WOK/$PACKAGE | grep -q -v -e ^receipt$ -e ^description.txt$ \
   1.858 +		-e ^stuff$ || return
   1.859 +	
   1.860 +	[ "$COMMAND" = clean-wok ] || echo "Cleaning $PACKAGE"
   1.861 +	# Check for clean_wok function.
   1.862 +	if grep -q ^clean_wok $RECEIPT; then
   1.863 +		clean_wok
   1.864 +	fi
   1.865 +	# Clean should only have a receipt, stuff and optionals desc/md5.
   1.866 +	for f in `ls .`
   1.867 +	do
   1.868 +		case $f in
   1.869 +			receipt|stuff|description.txt|md5)
   1.870 +				continue ;;
   1.871 +			*)
   1.872 +				rm -rf $f ;;
   1.873 +		esac
   1.874 +	done
   1.875 +}
   1.876 +
   1.877 +set_pkg_broken()
   1.878 +{
   1.879 +	grep -q ^$PACKAGE$ $broken || echo $PACKAGE >> $broken
   1.880 +
   1.881 +	# Remove pkg from cooklist to avoid re-cook it if no changes happen
   1.882 +	# in the cook stuff.
   1.883 +	sed "/^$PACKAGE$/d" -i $cooklist $commits
   1.884 +
   1.885 +	gen_cookmd5
   1.886 +
   1.887 +	# Return 1 to make report know that its mother-function failed.
   1.888 +	return 1
   1.889 +}
   1.890 +
   1.891 +# Log broken packages.
   1.892 +broken() {
   1.893 +	unset cook_code
   1.894 +	for PACKAGE in $(look_for_wanted) $PACKAGE; do
   1.895 +		set_pkg_broken
   1.896 +	done
   1.897 +	cook_code=1
   1.898 +}
   1.899 +
   1.900 +packages_db_start()
   1.901 +{
   1.902 +	if [ ! -s packages.txt ]; then
   1.903 +			echo "# SliTaz GNU/Linux - Packages list
   1.904 +#
   1.905 +# Packages : unknown
   1.906 +# Date     : $(date +%Y-%m-%d\ \%H:%M:%S)
   1.907 +#
   1.908 +" > packages.txt
   1.909 +	else
   1.910 +		sed -e 's/^# Packages :.*/# Packages : unknown/' \
   1.911 +			-e "s/# Date     :.*/# Date     : $(date +%Y-%m-%d\ \%H:%M:%S)/" \
   1.912 +			-i packages.txt
   1.913 +	fi
   1.914 +	
   1.915 +	# If $packages_repository is the main one, configure few functions
   1.916 +	# to act as they should, without having loop on them (speed-up)
   1.917 +	if [ "$pkg_repository" = "$PKGS" ]; then
   1.918 +		erase_package_info_extracmd="erase_package_info_main"
   1.919 +		get_packages_info_extracmd="get_packages_info_main"
   1.920 +	fi
   1.921 +}
   1.922 +
   1.923 +erase_package_info()
   1.924 +{
   1.925 +	cd $pkg_repository
   1.926 +	sed "/^$PACKAGE$/,/^$/d" -i packages.txt
   1.927 +	sed "/^$PACKAGE /d" -i packages.desc
   1.928 +	sed -e "s/=$PACKAGE /= /" -e "s/ $PACKAGE / /" 	-e "s/ $PACKAGE$//" \
   1.929 +		-e "/=$PACKAGE$/d" -e "s/=[0-9,a-z,A-Z]:$PACKAGE /= /" \
   1.930 +		-e "s/ [0-9,a-z,A-Z]:$PACKAGE / /" -e "s/ [0-9,a-z,A-Z]:$PACKAGE$/ /" \
   1.931 +		-e "/=[0-9,a-z,A-Z]:$PACKAGE$/d" \
   1.932 +		-i packages.equiv
   1.933 +	sed "/^$PACKAGE:/d" -i files.list
   1.934 +	sed "/^$(basename ${pkg%.tazpkg})$/d" -i packages.list
   1.935 +	sed "/ $(basename $pkg)$/d" -i packages.$SUM
   1.936 +	$erase_package_info_extracmd
   1.937 +}
   1.938 +
   1.939 +packages_db_end()
   1.940 +{
   1.941 +	cd $pkg_repository
   1.942 +	pkgs=$(wc -l packages.list | sed 's/ .*//')
   1.943 +	sed "s/# Packages : .*/# Packages : $pkgs/" -i packages.txt
   1.944 +	
   1.945 +	# If lists were updated it's generally needed to sort them well.
   1.946 +	echo "Sorting packages lists"
   1.947 +	files_list="packages.list packages.desc packages.equiv wanted.txt depends.txt libraries.txt"
   1.948 +	for file in $files_list; do
   1.949 +		[ -f $file ] || continue
   1.950 +		sort -o $file $file
   1.951 +	done
   1.952 +	
   1.953 +	$CHECKSUM packages.$SUM | cut -f1 -d' ' > ID
   1.954 +	[ -s ID ] || echo null > ID
   1.955 +	
   1.956 +	# Dont log this because lzma always output errors.
   1.957 +	lzma e files.list files.list.lzma
   1.958 +	rm -f files.list
   1.959 +	[ -f packages.equiv ] || touch packages.equiv
   1.960 +}
   1.961 +
   1.962 +get_packages_info()
   1.963 +{
   1.964 +	# If there's no taz folder in the wok, extract info from the
   1.965 +	# package.
   1.966 +	get_pkg_files $pkg
   1.967 +	unset_receipt
   1.968 +	. $pkg_files_dir/receipt
   1.969 +	
   1.970 +	#[ "$COMMAND" = "check-incoming" ] && gettext -e "Getting data from ${PACKAGE} \n"
   1.971 +
   1.972 +	cat >> $pkg_repository/packages.txt << _EOT_
   1.973 +$PACKAGE
   1.974 +    $VERSION$EXTRAVERSION
   1.975 +    $SHORT_DESC
   1.976 +_EOT_
   1.977 +	if [ "$PACKED_SIZE" ]; then
   1.978 +		cat >> $pkg_repository/packages.txt << _EOT_
   1.979 +    $PACKED_SIZE ($UNPACKED_SIZE installed)
   1.980 +
   1.981 +_EOT_
   1.982 +	else
   1.983 +		echo "" >> $pkg_repository/packages.txt
   1.984 +	fi
   1.985 +
   1.986 +	# Packages.desc is used by Tazpkgbox <tree>.
   1.987 +	echo "$PACKAGE | $VERSION$EXTRAVERSION | $SHORT_DESC | $CATEGORY | $WEB_SITE" >> $pkg_repository/packages.desc
   1.988 +
   1.989 +	# Packages.equiv is used by tazpkg install to check depends.
   1.990 +	for i in $PROVIDE; do
   1.991 +		DEST=""
   1.992 +		echo $i | fgrep -q : && DEST="${i#*:}:"
   1.993 +		if grep -qs ^${i%:*}= $pkg_repository/packages.equiv; then
   1.994 +			sed -i "s/^${i%:*}=/${i%:*}=$DEST$PACKAGE /" $pkg_repository/packages.equiv
   1.995 +		else
   1.996 +			echo "${i%:*}=$DEST$PACKAGE" >> $pkg_repository/packages.equiv
   1.997 +		fi
   1.998 +	done	
   1.999 +
  1.1000 +	if [ -f files.list ]; then 
  1.1001 +		{ echo "$PACKAGE"; cat files.list; } | awk '
  1.1002 +BEGIN { name="" } { if (name == "") name=$0; else printf("%s: %s\n",name,$0); }' >> $pkg_repository/files.list
  1.1003 +	fi
  1.1004 +
  1.1005 +	if [ -f library.list ]; then
  1.1006 +		sed "/^$PACKAGE\t/d" -i $pkg_repository/libraries.txt
  1.1007 +		cat library.list >> $pkg_repository/libraries.txt
  1.1008 +	fi
  1.1009 +	
  1.1010 +	cd .. && rm -r "$pkg_files_dir"
  1.1011 +
  1.1012 +	cd $pkg_repository
  1.1013 +	echo $(basename ${pkg%.tazpkg}) >> packages.list
  1.1014 +	$CHECKSUM $(basename $pkg) >> packages.$SUM
  1.1015 +	$get_packages_info_extracmd
  1.1016 +}
  1.1017 +
  1.1018 +gen_packages_db()
  1.1019 +{
  1.1020 +	[ "$pkg_repository" ] || pkg_repository=$PKGS
  1.1021 +	cd $pkg_repository
  1.1022 +	gettext -e "Generating packages lists: $pkg_repository\n"
  1.1023 +	gettext -e "Removing old files\n"
  1.1024 +	for file in files.list.lzma packages.list packages.txt \
  1.1025 +		packages.desc packages.equiv packages.$SUM; do
  1.1026 +		[ -f $file ] && rm $file
  1.1027 +	done
  1.1028 +	touch files.list
  1.1029 +	[ -f libraries.txt ] && rm -f libraries.txt
  1.1030 +	if [ "$pkg_repository" == "$INCOMING" ]; then
  1.1031 +		if [ -f "$PKGS/libraries.txt" ]; then
  1.1032 +			cp -a $PKGS/libraries.txt $INCOMING/libraries.txt
  1.1033 +		fi
  1.1034 +	fi
  1.1035 +	touch libraries.txt
  1.1036 +	touch depends.txt
  1.1037 +	touch wanted.txt
  1.1038 +	
  1.1039 +	packages_db_start
  1.1040 +	unset_receipt
  1.1041 +	gettext -e "Reading data from all packages\n"
  1.1042 +	for pkg in $(echo $pkg_repository/*.tazpkg | fgrep -v '*'); do
  1.1043 +		get_packages_info
  1.1044 +	done
  1.1045 +	packages_db_end
  1.1046 +}
  1.1047 +
  1.1048 +update_packages_db()
  1.1049 +{
  1.1050 +	[ "$pkg_repository" ] || pkg_repository=$PKGS
  1.1051 +	cd $pkg_repository
  1.1052 +	for file in packages.list packages.equiv packages.$SUM \
  1.1053 +		packages.desc packages.txt; do
  1.1054 +		if [ ! -f "$file" ]; then
  1.1055 +			gen_packages_db
  1.1056 +			return
  1.1057 +		fi
  1.1058 +	done
  1.1059 +	if	[ -f files.list.lzma ]; then
  1.1060 +		lzma d files.list.lzma files.list
  1.1061 +	else
  1.1062 +		gen_packages_db
  1.1063 +		return
  1.1064 +	fi
  1.1065 +	gettext -e "Updating packages lists: $pkg_repository\n"
  1.1066 +	echo ""
  1.1067 +	packages_db_start
  1.1068 +
  1.1069 +	# Look for removed/update packages.
  1.1070 +	touch stamp -r packages.list
  1.1071 +	for PACKAGE in $(grep ^[0-9,a-z,A-Z] packages.txt); do
  1.1072 +		pkg="$pkg_repository/$(grep -m1 ^$PACKAGE- packages.list).tazpkg"
  1.1073 +		if [ ! -f "$pkg" ]; then
  1.1074 +			erase_package_info
  1.1075 +		else
  1.1076 +			if [ "$pkg" -nt "stamp" ]; then
  1.1077 +				updated_pkg="$updated_pkg
  1.1078 +$PACKAGE $pkg"
  1.1079 +			elif [ ! -f $WOK/$PACKAGE/receipt ] && \
  1.1080 +				[ "$COMMAND" = check-incoming -o "$pkg_repository" = "$INCOMING" ]; then
  1.1081 +				erase_package_info
  1.1082 +				gettext -e "Removing $PACKAGE from $pkg_repository.\n"	
  1.1083 +				rm $pkg
  1.1084 +				if [ "$pkg_repository" = "$INCOMING_REPOSITORY" ]; then
  1.1085 +					[ -d $WOK/$PACKAGE ] && rm -r $WOK/$PACKAGE
  1.1086 +					sed "/^$PACKAGE\t/d" -i $wan_db $dep_db
  1.1087 +					for i in $fullco $cookorder $cooklist $commits $blocked $broken; do
  1.1088 +						sed "/^$PACKAGE$/d" -i $i
  1.1089 +					done
  1.1090 +					[ -f $LOGS/$pkg.log ] && rm -f $LOGS/$pkg.log
  1.1091 +					if [ "$(sed 1!d $fullco)" != "#PlanSort" ]; then
  1.1092 +						sed 1i"#PlanSort" -i $fullco
  1.1093 +						regen_cooklist=yes
  1.1094 +					fi
  1.1095 +				else
  1.1096 +					echo "$PACKAGE" >> $CACHE/removed
  1.1097 +					sed -n '1,10p' -i $CACHE/removed
  1.1098 +				fi
  1.1099 +			fi
  1.1100 +		fi
  1.1101 +	done
  1.1102 +	rm stamp
  1.1103 +	echo "$updated_pkg" | sed 1d | while read PACKAGE pkg; do
  1.1104 +		erase_package_info
  1.1105 +		get_packages_info
  1.1106 +	done
  1.1107 +	unset updated_pkg
  1.1108 +	
  1.1109 +	# Look for new packages.
  1.1110 +	for pkg in $(echo $pkg_repository/*.tazpkg | fgrep -v '*'); do
  1.1111 +		if ! fgrep -q "  ${pkg##*/}" packages.$SUM; then
  1.1112 +			get_packages_info
  1.1113 +		fi
  1.1114 +	done
  1.1115 +	packages_db_end
  1.1116 +}
  1.1117 +
  1.1118 +pkgdb()
  1.1119 +{
  1.1120 +	case "$1" in
  1.1121 +		incoming)
  1.1122 +			PKGSDB="incoming" ;;
  1.1123 +		packages)
  1.1124 +			PKGSDB="packages" ;;
  1.1125 +		*)
  1.1126 +			[ "$1" ] && PKGSDB="$1"
  1.1127 +			[ ! -d "$PKGSDB" ] && \
  1.1128 +					gettext -e "\nPackages directory doesn't exist\n\n" && exit 1 ;;
  1.1129 +	esac
  1.1130 +	time=$(date +%s)
  1.1131 +	echo "cook:pkgdb" > $command
  1.1132 +	echo "Cook pkgdb: Creating all packages lists" | log
  1.1133 +	echo ""
  1.1134 +	gettext "Creating lists for: "; echo "$PKGSDB"
  1.1135 +	separator
  1.1136 +	gettext "Cook pkgdb started: "; date "+%Y-%m-%d %H:%M"
  1.1137 +	if [ "$PKGSDB" = packages ]; then
  1.1138 +		# Packages package db
  1.1139 +		pkg_repository=$PKGS && gen_packages_db
  1.1140 +		nb=$(ls $PKGS/*.tazpkg | wc -l)
  1.1141 +		time=$(($(date +%s) - $time))
  1.1142 +		echo -e "Packages: $nb - Time: ${time}s\n"
  1.1143 +	elif [ "$PKGSDB" = incoming ]; then
  1.1144 +		# Incoming package db
  1.1145 +		pkg_repository=$INCOMING && gen_packages_db
  1.1146 +		nb=$(ls $INCOMING/*.tazpkg | wc -l)
  1.1147 +		time=$(($(date +%s) - $time))
  1.1148 +		echo -e "Packages: $nb - Time: ${time}s\n"
  1.1149 +	elif [ -d "$PKGSDB" ]; then
  1.1150 +		# User path for package db
  1.1151 +		pkg_repository=$PKGSDB && gen_packages_db
  1.1152 +		nb=$(ls $PKGSDB/*.tazpkg | wc -l)
  1.1153 +		time=$(($(date +%s) - $time))
  1.1154 +		echo -e "Packages: $nb - Time: ${time}s\n"
  1.1155 +	else
  1.1156 +		pkg_repository=$PKGS && gen_packages_db
  1.1157 +		nb=$(ls $PKGS/*.tazpkg | wc -l)
  1.1158 +		time=$(($(date +%s) - $time))
  1.1159 +		echo -e "Packages: $nb - Time: ${time}s\n"
  1.1160 +		pkg_repository=$INCOMING && gen_packages_db
  1.1161 +		incoming_nb=$(ls $INCOMING/*.tazpkg | wc -l)
  1.1162 +		time=$(($(date +%s) - $time))
  1.1163 +		echo -e "Incoming: $incoming_nb - Time: ${time}s\n"
  1.1164 +	fi
  1.1165 +		
  1.1166 +	echo "" && rm -f $command
  1.1167 +}
  1.1168 +
  1.1169 +clean_chroot()
  1.1170 +{
  1.1171 +	# Remove packages which was not in the chroot at creation time.
  1.1172 +	if [ -f "$CACHE/chroot-pkgs" ]; then
  1.1173 +		for pkg in $(ls ${root}${INSTALLED}); do
  1.1174 +			[ -f ${root}${INSTALLED}/$pkg/receipt ] || continue	
  1.1175 +			[ "$(grep ^$pkg$ $CACHE/chroot-pkgs)" ] || tazpkg remove $pkg --auto --root=$root
  1.1176 +		done
  1.1177 +		
  1.1178 +		for pkg in $(ls ${root}${INSTALLED}); do
  1.1179 +			if [ -d ${root}${INSTALLED}/$pkg -a ! -f ${root}${INSTALLED}/$pkg/receipt ]; then
  1.1180 +				echo "empty: $pkg"
  1.1181 +				rm -rf ${root}${INSTALLED}/$pkg
  1.1182 +			fi
  1.1183 +		done
  1.1184 +		
  1.1185 +		for pkg in $(cat $CACHE/chroot-pkgs); do
  1.1186 +			if [ ! -d ${root}${INSTALLED}/$pkg ]; then
  1.1187 +				echo "Reinstalling $pkg"
  1.1188 +				tazpkg get-install $pkg --root=$root --forced
  1.1189 +			fi
  1.1190 +		done
  1.1191 +	fi
  1.1192 +}
  1.1193 +
  1.1194 +update_lib_db()
  1.1195 +{
  1.1196 +	# Update lib_db
  1.1197 +	libs=$(for file in $(find * -type f -not -name "*.o" -not -name "*.ko" -not -name "*.a"); do
  1.1198 +	[ "$(dd if=$file bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ] || continue
  1.1199 +		LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $PWD/$file
  1.1200 +	done | { cut -f 1 -d ' ' | tr -d '\t' | sort -u | \
  1.1201 +	sed -e 's/^linux-gate.so.*$/SLIB/' -e 's~^/lib/ld-.*$~SLIB~' \
  1.1202 +		-e '/^statically$/d' | tr '\n' ' '; })
  1.1203 +	
  1.1204 +	if [ "$libs" ]; then
  1.1205 +		libs=$(echo " $libs" | sed -r 's/( SLIB)+ / /g')
  1.1206 +		echo -e "$PACKAGE\t$libs" >> $lib_db
  1.1207 +		sort -o $lib_db $lib_db
  1.1208 +		echo -e "$PACKAGE\t$libs" >> library.list
  1.1209 +		sort -o library.list library.list
  1.1210 +	fi
  1.1211 +	unset libs
  1.1212 +}
  1.1213 +
  1.1214 +# Check for a specified file list on cmdline.
  1.1215 +check_for_list()
  1.1216 +{
  1.1217 +	if [ ! "$LIST" ]; then
  1.1218 +		echo -e "\nPlease specify the path to the list of packages to cook.\n" >&2
  1.1219 +		exit 1
  1.1220 +	elif ! [ -f "$LIST" ]; then
  1.1221 +		echo -e "\nUnable to find $LIST packages list.\n" >&2
  1.1222 +		exit 1
  1.1223 +	elif ! [ -s "$LIST" ]; then
  1.1224 +		echo -e "\nList is empty.\n" >&2
  1.1225 +		exit 1
  1.1226 +	fi
  1.1227 +}
  1.1228 +
  1.1229 +get_packages_info_main()
  1.1230 +{
  1.1231 +	erase_package_info_main
  1.1232 +	[ "$WANTED" ] && echo -e "$PACKAGE\t$WANTED" >> wanted.txt
  1.1233 +	echo -e "$PACKAGE\t "$DEPENDS" \t "$BUILD_DEPENDS" " >> depends.txt
  1.1234 +}
  1.1235 +
  1.1236 +erase_package_info_main()
  1.1237 +{
  1.1238 +	for i in wanted.txt depends.txt; do
  1.1239 +		[ -f $i ] || continue
  1.1240 +		sed "/^$PACKAGE\t/d" -i $i
  1.1241 +	done
  1.1242 +}