cookutils rev 857

Make "pkgdb" separate module.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Sat Dec 31 04:35:47 2016 +0200 (2016-12-31)
parents c5610a3dfac9
children b3238dd85981
files Makefile cook cooks modules/pkgdb
line diff
     1.1 --- a/Makefile	Mon Dec 26 11:41:49 2016 +0100
     1.2 +++ b/Makefile	Sat Dec 31 04:35:47 2016 +0200
     1.3 @@ -1,10 +1,10 @@
     1.4  # Makefile for SliTaz Cooker.
     1.5  #
     1.6  
     1.7 -PREFIX?=/usr
     1.8 -DESTDIR?=
     1.9 -LINGUAS?=fr pt_BR ru zh_CN zh_TW
    1.10 -VERSION:=$(shell grep ^VERSION cook | cut -d'=' -f2)
    1.11 +PREFIX  ?= /usr
    1.12 +DESTDIR ?=
    1.13 +LINGUAS ?= fr pt_BR ru zh_CN zh_TW
    1.14 +VERSION := $(shell grep ^VERSION cook | cut -d'=' -f2)
    1.15  
    1.16  all:
    1.17  
    1.18 @@ -17,27 +17,30 @@
    1.19  	install -m 0755 -d $(DESTDIR)/etc/slitaz
    1.20  	install -m 0755 -d $(DESTDIR)/etc/init.d
    1.21  	install -m 0755 -d $(DESTDIR)$(PREFIX)/bin
    1.22 +	install -m 0755 -d $(DESTDIR)$(PREFIX)/libexec/cookutils
    1.23  	install -m 0755 -d $(DESTDIR)/var/www/cgi-bin/cooker
    1.24  	install -m 0755 -d $(DESTDIR)$(PREFIX)/share/applications
    1.25  	install -m 0755 -d $(DESTDIR)$(PREFIX)/share/cook/cooktest
    1.26  	install -m 0755 -d $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.27 -	install -m 0755 cook $(DESTDIR)$(PREFIX)/bin
    1.28 -	install -m 0755 cooks $(DESTDIR)$(PREFIX)/bin
    1.29 +	install -m 0755 cook             $(DESTDIR)$(PREFIX)/bin
    1.30 +	install -m 0755 cooks            $(DESTDIR)$(PREFIX)/bin
    1.31  	install -m 0755 fix-desktop-file $(DESTDIR)$(PREFIX)/bin
    1.32 -	install -m 0755 cooker $(DESTDIR)$(PREFIX)/bin
    1.33 -	install -m 0755 cookiso $(DESTDIR)$(PREFIX)/bin
    1.34 -	install -m 0755 cooklinux $(DESTDIR)$(PREFIX)/bin
    1.35 -	install -m 0644 cook.conf $(DESTDIR)/etc/slitaz
    1.36 -	install -m 0644 cook.site $(DESTDIR)/etc/slitaz
    1.37 -	install -m 0644 web/* $(DESTDIR)/var/www/cgi-bin/cooker
    1.38 -	install -m 0644 data/*.desktop $(DESTDIR)$(PREFIX)/share/applications
    1.39 -	install -m 0644 data/cooklist $(DESTDIR)$(PREFIX)/share/cook
    1.40 -	install -m 0644 data/receipt $(DESTDIR)$(PREFIX)/share/cook
    1.41 -	install -m 0644 data/cooktest/* $(DESTDIR)$(PREFIX)/share/cook/cooktest
    1.42 -	install -m 0644 doc/* $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.43 -	install -m 0644 README $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.44 -	install -m 0755 init.d/cooker $(DESTDIR)/etc/init.d
    1.45 +	install -m 0755 cooker           $(DESTDIR)$(PREFIX)/bin
    1.46 +	install -m 0755 cookiso          $(DESTDIR)$(PREFIX)/bin
    1.47 +	install -m 0755 cooklinux        $(DESTDIR)$(PREFIX)/bin
    1.48 +	install -m 0755 modules/pkgdb    $(DESTDIR)$(PREFIX)/libexec/cookutils
    1.49 +	install -m 0644 cook.conf        $(DESTDIR)/etc/slitaz
    1.50 +	install -m 0644 cook.site        $(DESTDIR)/etc/slitaz
    1.51 +	install -m 0644 web/*            $(DESTDIR)/var/www/cgi-bin/cooker
    1.52 +	install -m 0644 data/*.desktop   $(DESTDIR)$(PREFIX)/share/applications
    1.53 +	install -m 0644 data/cooklist    $(DESTDIR)$(PREFIX)/share/cook
    1.54 +	install -m 0644 data/receipt     $(DESTDIR)$(PREFIX)/share/cook
    1.55 +	install -m 0644 data/cooktest/*  $(DESTDIR)$(PREFIX)/share/cook/cooktest
    1.56 +	install -m 0644 doc/*            $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.57 +	install -m 0644 README           $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.58 +	install -m 0755 init.d/cooker    $(DESTDIR)/etc/init.d
    1.59  	chmod 0755 $(DESTDIR)/var/www/cgi-bin/cooker/*.cgi
    1.60 +	find $(DESTDIR)$(PREFIX)/libexec/cookutils -type f -exec sed -i "s|@@PREFIX@@|$(PREFIX)|g" \{\} \;
    1.61  
    1.62  uninstall-cook:
    1.63  	rm -rf \
    1.64 @@ -47,6 +50,7 @@
    1.65  		$(DESTDIR)$(PREFIX)/bin/cooker \
    1.66  		$(DESTDIR)$(PREFIX)/bin/cookiso \
    1.67  		$(DESTDIR)$(PREFIX)/bin/cooklinux \
    1.68 +		$(DESTDIR)$(PREFIX)/libexec/cookutils \
    1.69  		$(DESTDIR)$(PREFIX)/share/cook \
    1.70  		$(DESTDIR)/etc/slitaz/cook.* \
    1.71  		$(DESTDIR)/var/www/cooker
    1.72 @@ -66,8 +70,8 @@
    1.73  	install -m 0755 -d $(DESTDIR)$(PREFIX)/bin
    1.74  	install -m 0755 -d $(DESTDIR)$(PREFIX)/share/cross
    1.75  	install -m 0755 -d $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.76 -	install -m 0755 cross $(DESTDIR)$(PREFIX)/bin
    1.77 -	install -m 0644 doc/cross.txt $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.78 +	install -m 0755 cross             $(DESTDIR)$(PREFIX)/bin
    1.79 +	install -m 0644 doc/cross.txt     $(DESTDIR)$(PREFIX)/share/doc/cookutils
    1.80  	install -m 0644 data/cross-*.conf $(DESTDIR)$(PREFIX)/share/cross
    1.81  
    1.82  uninstall-cross:
    1.83 @@ -83,7 +87,7 @@
    1.84  		--copyright-holder="SliTaz Association" \
    1.85  		--package-name="Cook" \
    1.86  		--package-version="$(VERSION)" \
    1.87 -		./cook
    1.88 +		./cook ./modules.pkgdb
    1.89  
    1.90  msgmerge:
    1.91  	@for l in $(LINGUAS); do \
     2.1 --- a/cook	Mon Dec 26 11:41:49 2016 +0100
     2.2 +++ b/cook	Sat Dec 31 04:35:47 2016 +0200
     2.3 @@ -1587,13 +1587,6 @@
     2.4  }
     2.5  
     2.6  
     2.7 -# Return size of file in human readible format
     2.8 -# Note, "du" in opposite returns size occupied by file on disk (4KB multiple in most cases)
     2.9 -filesize() {
    2.10 -	busybox ls -lh "$1" | awk '{print $5 "B"}'
    2.11 -}
    2.12 -
    2.13 -
    2.14  #
    2.15  # Receipt functions to ease packaging
    2.16  #
    2.17 @@ -1673,8 +1666,6 @@
    2.18  	status
    2.19  }
    2.20  
    2.21 -dblog() { tee -a $LOGS/pkgdb.log; }
    2.22 -
    2.23  
    2.24  
    2.25  
    2.26 @@ -1980,242 +1971,10 @@
    2.27  		;;
    2.28  
    2.29  	pkgdb)
    2.30 -		# Create suitable packages list for TazPKG and only for built packages
    2.31 -		# as well as flavors files for TazLiTo. We dont need logs since we do it
    2.32 +		# Create suitable packages list for TazPkg and only for built packages
    2.33 +		# as well as flavors files for TazLiTo. We don't need logs since we do it
    2.34  		# manually to ensure everything is fine before syncing the mirror.
    2.35 -
    2.36 -		rm $LOGS/pkgdb.log 2>/dev/null
    2.37 -
    2.38 -		case "$2" in
    2.39 -			--flavors|--rmpkg) ;;
    2.40 -			*)
    2.41 -				[ -n "$2" ] && PKGS="$2"
    2.42 -				if [ ! -d "$PKGS" ]; then
    2.43 -					{ newline; _ "Packages directory \"%s\" doesn't exist" "$PKGS"; newline; } | dblog
    2.44 -					exit 1
    2.45 -				fi ;;
    2.46 -		esac
    2.47 -
    2.48 -		time=$(date +%s)
    2.49 -		flavors="$SLITAZ/flavors"
    2.50 -		live="$SLITAZ/live"
    2.51 -
    2.52 -		echo 'cook:pkgdb' > $command
    2.53 -		_ 'Cook pkgdb: Creating all packages lists' | log
    2.54 -		newline; { _ 'Creating lists for "%s"' "$PKGS"; separator; } | dblog
    2.55 -
    2.56 -		{ _ 'Cook pkgdb started: %s' "$(date "$(_ '+%%F %%R')")"; newline; } | dblog
    2.57 -
    2.58 -		cd $PKGS
    2.59 -		rm -f packages.* extra.list
    2.60 -		touch packages.equiv
    2.61 -
    2.62 -		_n 'Creating file "%s"' 'packages.list' | dblog
    2.63 -		ls -1 *.tazpkg | sed s'/.tazpkg//' > $PKGS/packages.list
    2.64 -		echo " ($(filesize $PKGS/packages.list))" | dblog
    2.65 -
    2.66 -		_n 'Creating file "%s"' 'packages.md5' | dblog
    2.67 -		md5sum *.tazpkg > $PKGS/packages.md5
    2.68 -		echo " ($(filesize $PKGS/packages.md5))" | dblog
    2.69 -		cp $PKGS/packages.md5 $PKGS/packages.toremove			# list of duplicates
    2.70 -
    2.71 -		md5sum packages.md5 | cut -d' ' -f1 > ID
    2.72 -		( cat ./ID | tr $'\n' ' '; date -ur ./ID +%s ) > IDs	# md5 and timestamp
    2.73 -
    2.74 -		_n 'Creating file "%s"' 'descriptions.txt' | dblog
    2.75 -		rm $PKGS/descriptions.txt 2>/dev/null
    2.76 -		for i in $(ls $WOK | sort); do
    2.77 -			if [ -e "$WOK/$i/description.txt" ]; then
    2.78 -				echo "$i" >> descriptions.txt
    2.79 -				cat "$WOK/$i/description.txt" | sed 's|^$| |' >> descriptions.txt
    2.80 -				echo >> descriptions.txt
    2.81 -			fi
    2.82 -		done
    2.83 -		echo " ($(filesize $PKGS/descriptions.txt))" | dblog
    2.84 -
    2.85 -
    2.86 -		_ 'Creating lists from "%s"' "$WOK" | dblog
    2.87 -		cd $WOK
    2.88 -		for pkg in *; do
    2.89 -			unset_receipt
    2.90 -			. $pkg/receipt
    2.91 -			# PACKED_SIZE and UNPACKED_SIZE are only in built receipt
    2.92 -			[ -s $pkg/taz/*/receipt ] && . $pkg/taz/*/receipt
    2.93 -
    2.94 -			if [ -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" ] || \
    2.95 -			   [ -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION-$ARCH.tazpkg" ]; then
    2.96 -
    2.97 -				# packages.desc lets us search easily in DB
    2.98 -				cat >> $PKGS/packages.desc <<EOT
    2.99 -$PACKAGE | $VERSION$EXTRAVERSION | $SHORT_DESC | $CATEGORY | $WEB_SITE
   2.100 -EOT
   2.101 -
   2.102 -				# packages.txt used by tazpkg and tazpkg-web also to provide
   2.103 -				# a human readable package list with version and description.
   2.104 -				cat >> $PKGS/packages.txt <<EOT
   2.105 -$PACKAGE
   2.106 -$VERSION$EXTRAVERSION
   2.107 -$SHORT_DESC
   2.108 -$PACKED_SIZE ($UNPACKED_SIZE installed)
   2.109 -
   2.110 -EOT
   2.111 -
   2.112 -				# packages.info combines TazPkg separate files
   2.113 -				# and will substitute them all
   2.114 -				SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
   2.115 -				DEPENDS=$(echo $DEPENDS) # remove newlines from some receipts
   2.116 -				MD5="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" $PKGS/packages.md5 | awk '{print $1}')"
   2.117 -				cat >> $PKGS/packages.info <<EOT
   2.118 -$PACKAGE	$VERSION$EXTRAVERSION	$CATEGORY	$SHORT_DESC	$WEB_SITE	$TAGS	$SIZES	$DEPENDS	$MD5
   2.119 -EOT
   2.120 -
   2.121 -				# packages.equiv is used by tazpkg install to check depends.
   2.122 -				for i in $PROVIDE; do
   2.123 -					DEST=''
   2.124 -					echo $i | fgrep -q : && DEST="${i#*:}:"
   2.125 -					if grep -qs ^${i%:*}= $PKGS/packages.equiv; then
   2.126 -						sed -i "s/^${i%:*}=/${i%:*}=$DEST$PACKAGE /" \
   2.127 -							$PKGS/packages.equiv
   2.128 -					else
   2.129 -						echo "${i%:*}=$DEST$PACKAGE" >> $PKGS/packages.equiv
   2.130 -					fi
   2.131 -				done
   2.132 -
   2.133 -				# files.list provides a list of all packages files.
   2.134 -				cat $pkg/taz/*/files.list | sed s/^/"$pkg: \0"/ >> \
   2.135 -					$PKGS/files.list
   2.136 -
   2.137 -				# list of duplicates
   2.138 -				sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION.tazpkg/d" $PKGS/packages.toremove
   2.139 -			else
   2.140 -				# if receipt variable HOST_ARCH absent/empty or contains ARCH
   2.141 -				if [ -z "$HOST_ARCH" -o "${HOST_ARCH/$ARCH/}" != "$HOST_ARCH" ]; then
   2.142 -					_ '  - absent: %s (%s)' "$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$ARCH" | dblog
   2.143 -				fi
   2.144 -			fi
   2.145 -		done
   2.146 -
   2.147 -		# Display list size.
   2.148 -		_ 'Done: %s (%s)' 'packages.desc'  "$(filesize $PKGS/packages.desc)"  | dblog
   2.149 -		_ 'Done: %s (%s)' 'packages.txt'   "$(filesize $PKGS/packages.txt)"   | dblog
   2.150 -		_ 'Done: %s (%s)' 'packages.info'  "$(filesize $PKGS/packages.info)"  | dblog
   2.151 -		_ 'Done: %s (%s)' 'packages.equiv' "$(filesize $PKGS/packages.equiv)" | dblog
   2.152 -
   2.153 -		cd $PKGS
   2.154 -
   2.155 -
   2.156 -		# Check package duplicates
   2.157 -		if [ -s "$PKGS/packages.toremove" ]; then
   2.158 -			newline | dblog
   2.159 -			_ 'Removing duplicates:' | dblog
   2.160 -			while read pkgsum pkgfile; do
   2.161 -				echo "  - $pkgfile" | dblog
   2.162 -				sed -i "/${pkgfile%.tazpkg}/d" $PKGS/packages.list
   2.163 -				sed -i "/ $pkgfile/d" $PKGS/packages.md5
   2.164 -				[ -n "$rmpkg" ] && rm $PKGS/$pkgfile	# remove packages only with --rmpkg
   2.165 -			done < $PKGS/packages.toremove
   2.166 -			newline | dblog
   2.167 -		fi
   2.168 -		rm $PKGS/packages.toremove
   2.169 -
   2.170 -
   2.171 -		# files.list.lzma
   2.172 -		_n 'Creating file "%s"' 'files.list.lzma' | dblog
   2.173 -		touch files.list
   2.174 -		# pkgs.slitaz.org strongly depends on list sorted by packages names
   2.175 -		lzma e files.list files.list.lzma
   2.176 -		echo " ($(filesize $PKGS/files.list.lzma))" | dblog
   2.177 -
   2.178 -		# Pre-sorting filenames causes 10% smaller resulting lzma file
   2.179 -		_n 'Creating file "%s"' 'files-list.lzma' | dblog
   2.180 -		cat files.list | sort -k2 -o files.list.sorted
   2.181 -		lzma e files.list.sorted files-list.lzma
   2.182 -		rm -f files.list files.list.sorted
   2.183 -		echo " ($(filesize $PKGS/files-list.lzma))" | dblog
   2.184 -
   2.185 -		[ -e files.list.md5 ] && rm files.list.md5
   2.186 -		md5sum files-list.lzma | cut -d' ' -f1 | tr -d $'\n' > files-list.md5
   2.187 -
   2.188 -		# packages.info.lzma
   2.189 -		PI=packages.info
   2.190 -		_n 'Creating file "%s"' 'packages.info.lzma' | dblog
   2.191 -		touch $PI
   2.192 -		lzma e $PI $PI.lzma
   2.193 -		echo " ($(filesize $PKGS/packages.info.lzma))" | dblog
   2.194 -
   2.195 -		# Make bundle to fast recharge
   2.196 -		_n 'Creating file "%s"' 'bundle.tar.lzma' | dblog
   2.197 -		[ -f bundle.tar.lzma ] && rm bundle.tar.lzma
   2.198 -		# Make sure to get "mirrors" file
   2.199 -		until [ -e 'mirrors' ]; do
   2.200 -			wget -q http://mirror1.slitaz.org/mirrors
   2.201 -			echo -n '.' | dblog; sleep 5
   2.202 -		done
   2.203 -		# Make sure to get "extra.list" file
   2.204 -		until [ -e 'extra.list' ]; do
   2.205 -			wget -q -O extra.list http://mirror1.slitaz.org/packages/get.list
   2.206 -			echo -n '.' | dblog; sleep 5
   2.207 -		done
   2.208 -		busybox tar -chaf bundle.tar.lzma \
   2.209 -			mirrors extra.list files-list.md5 packages.info descriptions.txt \
   2.210 -			packages.desc packages.md5 packages.txt packages.list packages.equiv
   2.211 -		rm ./mirrors
   2.212 -		echo " ($(filesize $PKGS/bundle.tar.lzma))" | dblog
   2.213 -
   2.214 -		# Display some info.
   2.215 -		separator | dblog
   2.216 -		nb=$(ls $PKGS/*.tazpkg | wc -l)
   2.217 -		time=$(($(date +%s) - $time))
   2.218 -		# L10n: 's' is for seconds (cooking time)
   2.219 -		{ _ 'Packages: %s - Time: %ss' "$nb" "$time"; newline; } | dblog
   2.220 -
   2.221 -
   2.222 -		# Create all flavors files at once. Do we really need code to monitor
   2.223 -		# flavors changes? Lets just build them with packages lists before
   2.224 -		# syncing the mirror.
   2.225 -		[ "$2" != '--flavors' ] && exit 1
   2.226 -
   2.227 -		if [ ! -d "$flavors" ]; then
   2.228 -			{ _ 'Missing flavors folder "%s"' "$flavors"; newline; } | dblog
   2.229 -			exit 1
   2.230 -		fi
   2.231 -
   2.232 -		[ ! -d "$live" ] && mkdir -p $live
   2.233 -		_ 'Creating flavors files in "%s"' "$live" | dblog
   2.234 -		_ 'Cook pkgdb: Creating all flavors' | log
   2.235 -		separator | dblog
   2.236 -
   2.237 -		_ 'Recharging lists to use latest packages...' | dblog
   2.238 -		tazpkg recharge >/dev/null 2>/dev/null
   2.239 -
   2.240 -		# We need a custom tazlito config to set working dir to /home/slitaz.
   2.241 -		if [ ! -f "$live/tazlito.conf" ]; then
   2.242 -			_ 'Creating configuration file "%s"' 'tazlito.conf' | dblog
   2.243 -			cp /etc/tazlito/tazlito.conf $live
   2.244 -			sed -i s@WORK_DIR=.*@WORK_DIR=\"/home/slitaz\"@ \
   2.245 -				$live/tazlito.conf
   2.246 -		fi
   2.247 -
   2.248 -		# Update Hg flavors repo and pack.
   2.249 -		if [ -d "$flavors/.hg" ]; then
   2.250 -			cd $flavors; hg pull -u
   2.251 -		fi
   2.252 -
   2.253 -		cd $live
   2.254 -		_ 'Starting to generate flavors...' | dblog
   2.255 -		rm -f flavors.list *.flavor
   2.256 -		for i in $flavors/*; do
   2.257 -			fl=$(basename $i)
   2.258 -			_ 'Packing flavor "%s"' "$fl" | dblog
   2.259 -			tazlito pack-flavor $fl >/dev/null || exit 1
   2.260 -			tazlito show-flavor $fl --brief --noheader 2>/dev/null >> flavors.list
   2.261 -		done
   2.262 -		cp -f $live/*.flavor $live/flavors.list $PKGS
   2.263 -		separator | dblog
   2.264 -		{ _ 'Total flavors size: %s' "$(du -sh $live | awk '{print $1}')"; newline; } | dblog
   2.265 -		rm -f $command
   2.266 -		separator | dblog
   2.267 -		_ 'Cook pkgdb end: %s' "$(date "$(_ '+%%F %%R')")" | dblog
   2.268 +		@@PREFIX@@/libexec/cookutils/pkgdb "$2"
   2.269  		;;
   2.270  
   2.271  	*)
     3.1 --- a/cooks	Mon Dec 26 11:41:49 2016 +0100
     3.2 +++ b/cooks	Sat Dec 31 04:35:47 2016 +0200
     3.3 @@ -1,6 +1,6 @@
     3.4  #!/bin/sh
     3.5  # Cook specified package and then cook all the split packages
     3.6 -# that build from the files of just built packages
     3.7 +# that build from the files of just built package
     3.8  
     3.9  case "$1" in
    3.10  	--help|-h)
    3.11 @@ -9,7 +9,7 @@
    3.12  
    3.13  Cook the specified package and then cook all the packages defined in the
    3.14  SPLIT variable in the package receipt.
    3.15 -Note, *-dev packages are implicit and usually omitted.
    3.16 +Note, *-dev packages are implicit and usually omitted in the SPLIT.
    3.17  
    3.18  EOT
    3.19  		exit 0
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/modules/pkgdb	Sat Dec 31 04:35:47 2016 +0200
     4.3 @@ -0,0 +1,272 @@
     4.4 +#!/bin/sh
     4.5 +#
     4.6 +# pkgdb - module of the SliTaz Cook
     4.7 +# Copyright (C) SliTaz GNU/Linux - GNU GPL v3
     4.8 +#
     4.9 +
    4.10 +. /usr/lib/slitaz/libcook.sh
    4.11 +
    4.12 +export output=raw
    4.13 +
    4.14 +echo "flavors='$flavors' rmpkg='$rmpkg' 1='$1' 2='$2'"
    4.15 +
    4.16 +# Internationalization.
    4.17 +
    4.18 +export TEXTDOMAIN='cook'
    4.19 +
    4.20 +
    4.21 +#
    4.22 +# Functions
    4.23 +#
    4.24 +
    4.25 +dblog() { tee -a $LOGS/pkgdb.log; }
    4.26 +
    4.27 +
    4.28 +# Return size of file in human readible format
    4.29 +# Note, "du" in opposite returns size occupied by file on disk (4KB multiple in most cases)
    4.30 +
    4.31 +filesize() { busybox ls -lh "$1" | awk '{print $5 "B"}'; }
    4.32 +
    4.33 +
    4.34 +
    4.35 +
    4.36 +
    4.37 +# Create suitable packages list for TazPkg and only for built packages
    4.38 +# as well as flavors files for TazLiTo. We don't need logs since we do it
    4.39 +# manually to ensure everything is fine before syncing the mirror.
    4.40 +
    4.41 +rm $LOGS/pkgdb.log 2>/dev/null
    4.42 +
    4.43 +case "$1" in
    4.44 +	--flavors|--rmpkg) ;;
    4.45 +	*)
    4.46 +		[ -n "$1" ] && PKGS="$1"
    4.47 +		if [ ! -d "$PKGS" ]; then
    4.48 +			{ newline; _ "Packages directory \"%s\" doesn't exist" "$PKGS"; newline; } | dblog
    4.49 +			exit 1
    4.50 +		fi ;;
    4.51 +esac
    4.52 +
    4.53 +time=$(date +%s)
    4.54 +flavors="$SLITAZ/flavors"
    4.55 +live="$SLITAZ/live"
    4.56 +
    4.57 +echo 'cook:pkgdb' > $command
    4.58 +_ 'Cook pkgdb: Creating all packages lists' | log
    4.59 +newline; { _ 'Creating lists for "%s"' "$PKGS"; separator; } | dblog
    4.60 +
    4.61 +{ _ 'Cook pkgdb started: %s' "$(date "$(_ '+%%F %%R')")"; newline; } | dblog
    4.62 +
    4.63 +cd $PKGS
    4.64 +rm -f packages.* extra.list
    4.65 +touch packages.equiv
    4.66 +
    4.67 +_n 'Creating file "%s"' 'packages.list' | dblog
    4.68 +ls -1 *.tazpkg | sed s'/.tazpkg//' > $PKGS/packages.list
    4.69 +echo " ($(filesize $PKGS/packages.list))" | dblog
    4.70 +
    4.71 +_n 'Creating file "%s"' 'packages.md5' | dblog
    4.72 +md5sum *.tazpkg > $PKGS/packages.md5
    4.73 +echo " ($(filesize $PKGS/packages.md5))" | dblog
    4.74 +cp $PKGS/packages.md5 $PKGS/packages.toremove			# list of duplicates
    4.75 +
    4.76 +md5sum packages.md5 | cut -d' ' -f1 > ID
    4.77 +( cat ./ID | tr $'\n' ' '; date -ur ./ID +%s ) > IDs	# md5 and timestamp
    4.78 +
    4.79 +_n 'Creating file "%s"' 'descriptions.txt' | dblog
    4.80 +rm $PKGS/descriptions.txt 2>/dev/null
    4.81 +for i in $(ls $WOK | sort); do
    4.82 +	if [ -e "$WOK/$i/description.txt" ]; then
    4.83 +		echo "$i" >> descriptions.txt
    4.84 +		cat "$WOK/$i/description.txt" | sed 's|^$| |' >> descriptions.txt
    4.85 +		echo >> descriptions.txt
    4.86 +	fi
    4.87 +done
    4.88 +echo " ($(filesize $PKGS/descriptions.txt))" | dblog
    4.89 +
    4.90 +
    4.91 +_ 'Creating lists from "%s"' "$WOK" | dblog
    4.92 +cd $WOK
    4.93 +for pkg in *; do
    4.94 +	unset_receipt
    4.95 +	. $pkg/receipt
    4.96 +	# PACKED_SIZE and UNPACKED_SIZE are only in built receipt
    4.97 +	[ -s $pkg/taz/*/receipt ] && . $pkg/taz/*/receipt
    4.98 +
    4.99 +	if [ -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" ] || \
   4.100 +	   [ -f "$PKGS/$PACKAGE-$VERSION$EXTRAVERSION-$ARCH.tazpkg" ]; then
   4.101 +
   4.102 +		# packages.desc lets us search easily in DB
   4.103 +		cat >> $PKGS/packages.desc <<EOT
   4.104 +$PACKAGE | $VERSION$EXTRAVERSION | $SHORT_DESC | $CATEGORY | $WEB_SITE
   4.105 +EOT
   4.106 +
   4.107 +		# packages.txt used by tazpkg and tazpkg-web also to provide
   4.108 +		# a human readable package list with version and description.
   4.109 +		cat >> $PKGS/packages.txt <<EOT
   4.110 +$PACKAGE
   4.111 +$VERSION$EXTRAVERSION
   4.112 +$SHORT_DESC
   4.113 +$PACKED_SIZE ($UNPACKED_SIZE installed)
   4.114 +
   4.115 +EOT
   4.116 +
   4.117 +		# packages.info combines TazPkg separate files
   4.118 +		# and will substitute them all
   4.119 +		SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
   4.120 +		DEPENDS=$(echo $DEPENDS) # remove newlines from some receipts
   4.121 +		MD5="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" $PKGS/packages.md5 | awk '{print $1}')"
   4.122 +		cat >> $PKGS/packages.info <<EOT
   4.123 +$PACKAGE	$VERSION$EXTRAVERSION	$CATEGORY	$SHORT_DESC	$WEB_SITE	$TAGS	$SIZES	$DEPENDS	$MD5
   4.124 +EOT
   4.125 +
   4.126 +		# packages.equiv is used by tazpkg install to check depends.
   4.127 +		for i in $PROVIDE; do
   4.128 +			DEST=''
   4.129 +			echo $i | fgrep -q : && DEST="${i#*:}:"
   4.130 +			if grep -qs ^${i%:*}= $PKGS/packages.equiv; then
   4.131 +				sed -i "s/^${i%:*}=/${i%:*}=$DEST$PACKAGE /" \
   4.132 +					$PKGS/packages.equiv
   4.133 +			else
   4.134 +				echo "${i%:*}=$DEST$PACKAGE" >> $PKGS/packages.equiv
   4.135 +			fi
   4.136 +		done
   4.137 +
   4.138 +		# files.list provides a list of all packages files.
   4.139 +		cat $pkg/taz/*/files.list | sed s/^/"$pkg: \0"/ >> \
   4.140 +			$PKGS/files.list
   4.141 +
   4.142 +		# list of duplicates
   4.143 +		sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION.tazpkg/d" $PKGS/packages.toremove
   4.144 +	else
   4.145 +		# if receipt variable HOST_ARCH absent/empty or contains ARCH
   4.146 +		if [ -z "$HOST_ARCH" -o "${HOST_ARCH/$ARCH/}" != "$HOST_ARCH" ]; then
   4.147 +			_ '  - absent: %s (%s)' "$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$ARCH" | dblog
   4.148 +		fi
   4.149 +	fi
   4.150 +done
   4.151 +
   4.152 +# Display list size.
   4.153 +_ 'Done: %s (%s)' 'packages.desc'  "$(filesize $PKGS/packages.desc)"  | dblog
   4.154 +_ 'Done: %s (%s)' 'packages.txt'   "$(filesize $PKGS/packages.txt)"   | dblog
   4.155 +_ 'Done: %s (%s)' 'packages.info'  "$(filesize $PKGS/packages.info)"  | dblog
   4.156 +_ 'Done: %s (%s)' 'packages.equiv' "$(filesize $PKGS/packages.equiv)" | dblog
   4.157 +
   4.158 +cd $PKGS
   4.159 +
   4.160 +
   4.161 +# Check package duplicates
   4.162 +if [ -s "$PKGS/packages.toremove" ]; then
   4.163 +	newline | dblog
   4.164 +	_ 'Removing duplicates:' | dblog
   4.165 +	while read pkgsum pkgfile; do
   4.166 +		echo "  - $pkgfile" | dblog
   4.167 +		sed -i "/${pkgfile%.tazpkg}/d" $PKGS/packages.list
   4.168 +		sed -i "/ $pkgfile/d" $PKGS/packages.md5
   4.169 +		[ -n "$rmpkg" ] && rm $PKGS/$pkgfile	# remove packages only with --rmpkg
   4.170 +	done < $PKGS/packages.toremove
   4.171 +	newline | dblog
   4.172 +fi
   4.173 +rm $PKGS/packages.toremove
   4.174 +
   4.175 +
   4.176 +# files.list.lzma
   4.177 +_n 'Creating file "%s"' 'files.list.lzma' | dblog
   4.178 +touch files.list
   4.179 +# pkgs.slitaz.org strongly depends on list sorted by packages names
   4.180 +lzma e files.list files.list.lzma
   4.181 +echo " ($(filesize $PKGS/files.list.lzma))" | dblog
   4.182 +
   4.183 +# Pre-sorting filenames causes 10% smaller resulting lzma file
   4.184 +_n 'Creating file "%s"' 'files-list.lzma' | dblog
   4.185 +cat files.list | sort -k2 -o files.list.sorted
   4.186 +lzma e files.list.sorted files-list.lzma
   4.187 +rm -f files.list files.list.sorted
   4.188 +echo " ($(filesize $PKGS/files-list.lzma))" | dblog
   4.189 +
   4.190 +[ -e files.list.md5 ] && rm files.list.md5
   4.191 +md5sum files-list.lzma | cut -d' ' -f1 | tr -d $'\n' > files-list.md5
   4.192 +
   4.193 +# packages.info.lzma
   4.194 +PI=packages.info
   4.195 +_n 'Creating file "%s"' 'packages.info.lzma' | dblog
   4.196 +touch $PI
   4.197 +lzma e $PI $PI.lzma
   4.198 +echo " ($(filesize $PKGS/packages.info.lzma))" | dblog
   4.199 +
   4.200 +# Make bundle to fast recharge
   4.201 +_n 'Creating file "%s"' 'bundle.tar.lzma' | dblog
   4.202 +[ -f bundle.tar.lzma ] && rm bundle.tar.lzma
   4.203 +# Make sure to get "mirrors" file
   4.204 +until [ -e 'mirrors' ]; do
   4.205 +	wget -q http://mirror1.slitaz.org/mirrors
   4.206 +	echo -n '.' | dblog; sleep 5
   4.207 +done
   4.208 +# Make sure to get "extra.list" file
   4.209 +until [ -e 'extra.list' ]; do
   4.210 +	wget -q -O extra.list http://mirror1.slitaz.org/packages/get.list
   4.211 +	echo -n '.' | dblog; sleep 5
   4.212 +done
   4.213 +busybox tar -chaf bundle.tar.lzma \
   4.214 +	mirrors extra.list files-list.md5 packages.info descriptions.txt \
   4.215 +	packages.desc packages.md5 packages.txt packages.list packages.equiv
   4.216 +rm ./mirrors
   4.217 +echo " ($(filesize $PKGS/bundle.tar.lzma))" | dblog
   4.218 +
   4.219 +# Display some info.
   4.220 +separator | dblog
   4.221 +nb=$(ls $PKGS/*.tazpkg | wc -l)
   4.222 +time=$(($(date +%s) - $time))
   4.223 +# L10n: 's' is for seconds (cooking time)
   4.224 +{ _ 'Packages: %s - Time: %ss' "$nb" "$time"; newline; } | dblog
   4.225 +
   4.226 +
   4.227 +# Create all flavors files at once. Do we really need code to monitor
   4.228 +# flavors changes? Let's just build them with packages lists before
   4.229 +# syncing the mirror.
   4.230 +[ "$1" != '--flavors' ] && exit 1
   4.231 +
   4.232 +if [ ! -d "$flavors" ]; then
   4.233 +	{ _ 'Missing flavors folder "%s"' "$flavors"; newline; } | dblog
   4.234 +	exit 1
   4.235 +fi
   4.236 +
   4.237 +[ ! -d "$live" ] && mkdir -p $live
   4.238 +_ 'Creating flavors files in "%s"' "$live" | dblog
   4.239 +_ 'Cook pkgdb: Creating all flavors' | log
   4.240 +separator | dblog
   4.241 +
   4.242 +_ 'Recharging lists to use latest packages...' | dblog
   4.243 +tazpkg recharge >/dev/null 2>/dev/null
   4.244 +
   4.245 +# We need a custom tazlito config to set working dir to /home/slitaz.
   4.246 +if [ ! -f "$live/tazlito.conf" ]; then
   4.247 +	_ 'Creating configuration file "%s"' 'tazlito.conf' | dblog
   4.248 +	cp /etc/tazlito/tazlito.conf $live
   4.249 +	sed -i s@WORK_DIR=.*@WORK_DIR=\"/home/slitaz\"@ \
   4.250 +		$live/tazlito.conf
   4.251 +fi
   4.252 +
   4.253 +# Update Hg flavors repo and pack.
   4.254 +if [ -d "$flavors/.hg" ]; then
   4.255 +	cd $flavors; hg pull -u
   4.256 +fi
   4.257 +
   4.258 +cd $live
   4.259 +_ 'Starting to generate flavors...' | dblog
   4.260 +rm -f flavors.list *.flavor
   4.261 +for i in $flavors/*; do
   4.262 +	fl=$(basename $i)
   4.263 +	_ 'Packing flavor "%s"' "$fl" | dblog
   4.264 +	tazlito pack-flavor $fl >/dev/null || exit 1
   4.265 +	tazlito show-flavor $fl --brief --noheader 2>/dev/null >> flavors.list
   4.266 +done
   4.267 +cp -f $live/*.flavor $live/flavors.list $PKGS
   4.268 +separator | dblog
   4.269 +{ _ 'Total flavors size: %s' "$(du -sh $live | awk '{print $1}')"; newline; } | dblog
   4.270 +rm -f $command
   4.271 +separator | dblog
   4.272 +_ 'Cook pkgdb end: %s' "$(date "$(_ '+%%F %%R')")" | dblog
   4.273 +
   4.274 +
   4.275 +exit 0