tazpkg rev 122

tazpkg: handle dependancies loop
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jul 15 09:03:00 2008 +0000 (2008-07-15)
parents ec1d2bbce343
children d12e1d8a51b2
files tazpkg
line diff
     1.1 --- a/tazpkg	Mon Jul 14 23:44:32 2008 +0000
     1.2 +++ b/tazpkg	Tue Jul 15 09:03:00 2008 +0000
     1.3 @@ -258,6 +258,16 @@
     1.4  		 # get absolute path
     1.5  		 ROOT=$(cd $ROOT; pwd)
     1.6  	fi
     1.7 +	(
     1.8 +		# Create package path early to avoid dependancies loop
     1.9 +		mkdir -p $TMP_DIR
    1.10 +		( cd $TMP_DIR ; cpio -i receipt > /dev/null) < $PACKAGE_FILE
    1.11 +		. $TMP_DIR/receipt
    1.12 +		rm -rf $TMP_DIR
    1.13 +		# Make the installed package data dir to store
    1.14 +		# the receipt and the files list.
    1.15 +		mkdir -p $ROOT$INSTALLED/$PACKAGE
    1.16 +	)
    1.17  	# Resolv package deps.
    1.18  	check_for_deps $ROOT
    1.19  	if [ ! "$MISSING_PACKAGE" = "" ]; then
    1.20 @@ -296,9 +306,6 @@
    1.21  			echo "$PACKAGE" >> $(dirname $j)/modifiers
    1.22  		done
    1.23  	done
    1.24 -	# Make the installed package data dir to store
    1.25 -	# the receipt and the files list.
    1.26 -	mkdir -p $ROOT$INSTALLED/$PACKAGE
    1.27  	cp receipt files.list $ROOT$INSTALLED/$PACKAGE
    1.28  	# Copy the description if found.
    1.29  	if [ -f "description.txt" ]; then
    1.30 @@ -325,13 +332,41 @@
    1.31  	echo ""
    1.32  }
    1.33  
    1.34 +# Check for loop in deps tree.
    1.35 +check_for_deps_loop()
    1.36 +{
    1.37 +	local list
    1.38 +	local pkg
    1.39 +	local deps
    1.40 +	pkg=$1
    1.41 +	shift
    1.42 +	[ -n "$1" ] || return
    1.43 +	list=""
    1.44 +	# Filter out already processed deps
    1.45 +	for i in $@; do
    1.46 +		case " $ALL_DEPS" in
    1.47 +		*\ $i\ *);;
    1.48 +		*) list="$list $i";;
    1.49 +		esac
    1.50 +	done
    1.51 +	ALL_DEPS="$ALL_DEPS$list "
    1.52 +	for i in $list; do
    1.53 +		[ -f $i/receipt ] || continue
    1.54 +		deps="$(DEPENDS=""; . $i/receipt; echo $DEPENDS)"
    1.55 +		case " $deps " in
    1.56 +		*\ $pkg\ *) echo -e "$MSG  $i"; MSG="";;
    1.57 +		*) check_for_deps_loop $pkg $deps;;
    1.58 +		esac
    1.59 +	done
    1.60 +}
    1.61 +
    1.62  # Check for missing deps listed in a receipt packages.
    1.63  check_for_deps()
    1.64  {
    1.65  	local saved;
    1.66  	saved=$PACKAGE
    1.67  	mkdir -p $TMP_DIR
    1.68 -	( cd $TMP_DIR ; cpio -i receipt ) < $PACKAGE_FILE
    1.69 +	( cd $TMP_DIR ; cpio -i receipt > /dev/null ) < $PACKAGE_FILE
    1.70  	. $TMP_DIR/receipt
    1.71  	PACKAGE=$saved
    1.72  	rm -rf $TMP_DIR
    1.73 @@ -340,6 +375,8 @@
    1.74  		if [ ! -d "$1$INSTALLED/$i" ]; then
    1.75  			MISSING_PACKAGE=$i
    1.76  			deps=$(($deps+1))
    1.77 +		elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
    1.78 +			echo -e "$WARNING Dependancy loop between $PACKAGE and $i."
    1.79  		fi
    1.80  	done
    1.81  	if [ ! "$MISSING_PACKAGE" = "" ]; then
    1.82 @@ -481,6 +518,7 @@
    1.83  	for pkg in $list
    1.84  	do
    1.85  		EXTRAVERSION=""
    1.86 +		[ -f $INSTALLED/$pkg/receipt ] || continue
    1.87  		. $INSTALLED/$pkg/receipt
    1.88  		echo -n "$PACKAGE "
    1.89  		echo -en "\033[24G $VERSION$EXTRAVERSION"
    1.90 @@ -558,7 +596,7 @@
    1.91  		zcat $FLAVOR.flavor | cpio -i 2>/dev/null
    1.92  		while read file; do
    1.93  			for pkg in $(ls -d $INSTALLED/${file%%-*}*); do
    1.94 -				[ -d $pkg ] || continue
    1.95 +				[ -f $pkg/receipt ] || continue
    1.96  				EXTRAVERSION=""
    1.97  				. $pkg/receipt
    1.98  				[ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && break
    1.99 @@ -575,7 +613,7 @@
   1.100  			get-$pkg
   1.101  		done < $FLAVOR.nonfree
   1.102  		[ "$ARG" == "--purge" ] && for pkg in $(ls $INSTALLED); do
   1.103 -			[ -d $INSTALLED/$pkg ] || continue
   1.104 +			[ -f $INSTALLED/$pkg/receipt ] || continue
   1.105  			EXTRAVERSION=""
   1.106  			. $INSTALLED/$pkg/receipt
   1.107  			grep -q ^$PACKAGE-$VERSION$EXTRAVERSION$ $FLAVOR.pkglist && continue
   1.108 @@ -635,6 +673,7 @@
   1.109  			echo "================================================================================"
   1.110  			for pkg in $INSTALLED/*
   1.111  			do
   1.112 +				[ -f $pkg/receipt ] || continue
   1.113  				EXTRAVERSION=""
   1.114  				. $pkg/receipt
   1.115  				if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
   1.116 @@ -653,6 +692,7 @@
   1.117  			echo "================================================================================"
   1.118  			for pkg in $INSTALLED/*
   1.119  			do
   1.120 +				[ -f $pkg/receipt ] || continue
   1.121  				EXTRAVERSION=""
   1.122  				. $pkg/receipt
   1.123  				echo -n "$PACKAGE"
   1.124 @@ -683,6 +723,7 @@
   1.125  		echo -n "Creating packages informations..."
   1.126  		for pkg in $INSTALLED/*
   1.127  		do
   1.128 +			[ -f $pkg/receipt ] || continue
   1.129  			EXTRAVERSION=""
   1.130  			. $pkg/receipt
   1.131  			xhtml_pkg_info
   1.132 @@ -852,7 +893,7 @@
   1.133  		# name and the full path to the file(s).
   1.134  		for pkg in $INSTALLED/*
   1.135  		do
   1.136 -			if grep -q "$2" $pkg/files.list; then
   1.137 +			if grep -qs "$2" $pkg/files.list; then
   1.138  				. $pkg/receipt
   1.139  				echo ""
   1.140  				echo -e "\033[1mPackage $PACKAGE :\033[0m"
   1.141 @@ -969,7 +1010,7 @@
   1.142  		#
   1.143  		check_root
   1.144  		check_for_package_on_cmdline
   1.145 -		if [ ! -d "$INSTALLED/$PACKAGE" ]; then
   1.146 +		if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
   1.147  			echo -e "\n$PACKAGE is not installed.\n"
   1.148  			exit 0
   1.149  		else
   1.150 @@ -1211,7 +1252,8 @@
   1.151  		# Some packages must be installed first
   1.152  		FIRST_CLASS_PACKAGE=" glibc-base slitaz-base-files slitaz-boot-scripts "
   1.153  		for pkg in $INSTALLED/*
   1.154 -		do
   1.155 +		do 
   1.156 +			[ -f $pkg/receipt ] || continue
   1.157  			EXTRAVERSION=""
   1.158  			. $pkg/receipt
   1.159  			# Diplay package name to show that Tazpkg is working...
   1.160 @@ -1326,6 +1368,10 @@
   1.161  		check_root
   1.162  		cd $INSTALLED
   1.163  		for PACKAGE in `ls`; do
   1.164 +			if [ ! -f $PACKAGE/receipt ]; then
   1.165 +				echo "The package $PACKAGE installation is not completed"
   1.166 +				continue
   1.167 +			fi
   1.168  			DEPENDS=""
   1.169  			EXTRAVERSION=""
   1.170  			. $PACKAGE/receipt
   1.171 @@ -1350,6 +1396,9 @@
   1.172  				echo -e "$MSG  $i"
   1.173  				MSG=""
   1.174  			done
   1.175 +			MSG="Dependencies loop between $PACKAGE and :\n"
   1.176 +			ALL_DEPS=""
   1.177 +			check_for_deps_loop $PACKAGE $DEPENDS
   1.178  		done
   1.179  		if [ "$PACKAGE_FILE" = "--full" ]; then
   1.180  			for file in */md5sum; do