tazpkg rev 299

Speedup install_package
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Sep 30 14:32:08 2009 +0200 (2009-09-30)
parents 2affdd0c18e2
children 3e0b726b512b
files tazpkg
line diff
     1.1 --- a/tazpkg	Fri Sep 18 10:10:23 2009 +0200
     1.2 +++ b/tazpkg	Wed Sep 30 14:32:08 2009 +0200
     1.3 @@ -398,6 +398,17 @@
     1.4  	fi
     1.5  }
     1.6  
     1.7 +remove_with_path()
     1.8 +{
     1.9 +	local dir
    1.10 +	rm -f $1 2>/dev/null
    1.11 +	dir="$1"
    1.12 +	while [ "$dir" != "/" ]; do
    1.13 +		dir="$(dirname $dir)"
    1.14 +		rmdir $dir 2> /dev/null || break
    1.15 +	done
    1.16 +}
    1.17 +
    1.18  # This function installs a package in the rootfs.
    1.19  install_package()
    1.20  {
    1.21 @@ -471,28 +482,46 @@
    1.22  		done < $PACKAGE/files.list > $TMP_DIR/files2remove.list
    1.23  	fi
    1.24  	# Remember modified packages
    1.25 -	for i in $(grep -v '\[' $TMP_DIR/files.list); do
    1.26 +	{ check=false
    1.27 +	  for i in $(grep -v '\[' $TMP_DIR/files.list); do
    1.28  		[ -e "$ROOT$i" ] || continue
    1.29  		[ -d "$ROOT$i" ] && continue
    1.30 -		for j in $(grep -l "^$i$" */files.list); do
    1.31 -			local dir
    1.32 -			dir=$(dirname $j)
    1.33 -			[ "$j" = "$PACKAGE/files.list" ] && continue
    1.34 -			if grep -qs ^$dir$ $PACKAGE/modifiers; then
    1.35 -				# Do not overload an overloaded file !
    1.36 -				rm $TMP_DIR$i 2> /dev/null
    1.37 -				continue
    1.38 -			fi
    1.39 -			grep -qs ^$PACKAGE$ $dir/modifiers && continue
    1.40 -			if [ -s "$dir/volatile.cpio.gz" ]; then
    1.41 -				# We can modify backed up files
    1.42 -				zcat $dir/volatile.cpio.gz | \
    1.43 -					cpio -t 2> /dev/null | \
    1.44 -					grep -q "^${i#/}$" && continue
    1.45 -			fi
    1.46 -			echo "$PACKAGE" >> $dir/modifiers
    1.47 -		done
    1.48 +		echo "- $i"
    1.49 +		check=true
    1.50 +	  done ; 
    1.51 +	  $check && for i in *; do 
    1.52 +	  	[ "$i" == "$PACKAGE" ] && continue
    1.53 +	  	awk "{ printf \"$i %s\\n\",\$1 }" < $i/files.list
    1.54 +	  done } | awk '
    1.55 +{
    1.56 +	if ($1 == "-" || file[$2] != "") {
    1.57 +		file[$2] = file[$2] " " $1
    1.58 +		if ($1 != "-") {
    1.59 +			if (pkg[$1] == "") all = all " " $1
    1.60 +			pkg[$1] = pkg[$1] " " $2
    1.61 +		}
    1.62 +	}
    1.63 +}
    1.64 +END {
    1.65 +	for (i = split(all, p, " "); i > 0; i--)
    1.66 +		for (j = split(pkg[p[i]], f, " "); j > 0; j--)
    1.67 +			printf "%s %s\n",p[i],f[j];
    1.68 +}
    1.69 +		' | while read dir file; do
    1.70 +		if grep -qs ^$dir$ $PACKAGE/modifiers; then
    1.71 +			# Do not overload an overloaded file !
    1.72 +			rm $TMP_DIR$file 2> /dev/null
    1.73 +			continue
    1.74 +		fi
    1.75 +		grep -qs ^$PACKAGE$ $dir/modifiers && continue
    1.76 +		if [ -s "$dir/volatile.cpio.gz" ]; then
    1.77 +			# We can modify backed up files without notice
    1.78 +			zcat $dir/volatile.cpio.gz | cpio -t 2> /dev/null | \
    1.79 +				grep -q "^${file#/}$" && continue
    1.80 +		fi
    1.81 +		echo "$PACKAGE" >> $dir/modifiers
    1.82  	done
    1.83 +
    1.84  	cd $TMP_DIR
    1.85  	cp receipt files.list $ROOT$INSTALLED/$PACKAGE
    1.86  	# Copy the description if found.
    1.87 @@ -529,13 +558,9 @@
    1.88  	if [ -s files2remove.list ]; then
    1.89  		echo -n "Removing old $PACKAGE... "
    1.90  		while read file; do
    1.91 -			rm -f $ROOT$file
    1.92 -			dir=$(dirname $ROOT$file)
    1.93 -			while true; do
    1.94 -				rmdir $dir 2> /dev/null || { true; break; }
    1.95 -				dir=$(dirname $dir)
    1.96 -			done
    1.97 +			remove_with_path $ROOT$file
    1.98  		done < files2remove.list
    1.99 +		true
   1.100  		status
   1.101  	fi
   1.102  	# Remove the temporary random directory.
   1.103 @@ -926,7 +951,7 @@
   1.104  	if (all_deps[pkg] == 1) return
   1.105  	all_deps[pkg] = 1
   1.106  	if (space != "") printf "%s%s\n",space,pkg
   1.107 -	for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
   1.108 +	for (i = 1, n = split(deps[pkg], mydeps, " "); i <= n; i++) {
   1.109  		show_deps(deps, all_deps, mydeps[i],"  " space)
   1.110  	}
   1.111  }
   1.112 @@ -1705,23 +1730,13 @@
   1.113  				for file in `cat $INSTALLED/$PACKAGE/files.list`
   1.114  				do
   1.115  					[ $(grep ^$file$ $INSTALLED/$mod/files.list | wc -l) -gt 1 ] && continue
   1.116 -					rm -f $file 2>/dev/null
   1.117 -					dir="$file"
   1.118 -					while [ "$dir" != "/" ]; do
   1.119 -						dir="$(dirname $dir)"
   1.120 -						rmdir $dir 2> /dev/null || break
   1.121 -					done
   1.122 +					remove_with_path $file
   1.123  				done
   1.124  			    done
   1.125  			else
   1.126  				for file in `cat $INSTALLED/$PACKAGE/files.list`
   1.127  				do
   1.128 -					rm -f $file 2>/dev/null
   1.129 -					dir="$file"
   1.130 -					while [ "$dir" != "/" ]; do
   1.131 -						dir="$(dirname $dir)"
   1.132 -						rmdir $dir 2> /dev/null || break
   1.133 -					done
   1.134 +					remove_with_path $file
   1.135  				done
   1.136  			fi
   1.137  			status