tazpkg rev 824

Add module "mkdb"; pkgs.cgi: fix AJAX loader display
author Aleksej Bobylev <al.bobylev@gmail.com>
date Tue Aug 04 02:29:51 2015 +0300 (2015-08-04)
parents 6d8c84911558
children f7c8cfc02b2c
files Makefile modules/mkdb tazpanel/pkgs.cgi tazpkg
line diff
     1.1 --- a/Makefile	Sat Jul 25 22:54:10 2015 +0200
     1.2 +++ b/Makefile	Tue Aug 04 02:29:51 2015 +0300
     1.3 @@ -30,7 +30,7 @@
     1.4  		--package-name=TazPkg \
     1.5  		--package-version="$(VERSION)" -kaction -ktitle -k_ -k_n -k_p:1,2 \
     1.6  		./tazpkg \
     1.7 -		./modules/convert ./modules/find-depends ./modules/help \
     1.8 +		./modules/convert ./modules/find-depends ./modules/help ./modules/mkdb \
     1.9  		./tazpkg-box ./tazpkg-notify ./tazpanel/pkgs.cgi
    1.10  
    1.11  msgmerge:
    1.12 @@ -113,9 +113,7 @@
    1.13  
    1.14  uninstall:
    1.15  	rm -f  $(DESTDIR)$(bindir)/tazpkg
    1.16 -	rm -f  $(DESTDIR)$(libexecdir)/tazpkg/convert
    1.17 -	rm -f  $(DESTDIR)$(libexecdir)/tazpkg/find-depends
    1.18 -	rm -f  $(DESTDIR)$(libexecdir)/tazpkg/help
    1.19 +	rm -rf $(DESTDIR)$(libexecdir)/tazpkg
    1.20  
    1.21  	rm -f  $(DESTDIR)$(bindir)/tazpkg-notify
    1.22  	rm -f  $(DESTDIR)$(bindir)/tazpkg-box
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/modules/mkdb	Tue Aug 04 02:29:51 2015 +0300
     2.3 @@ -0,0 +1,222 @@
     2.4 +#!/bin/sh
     2.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
     2.6 +# mkdb - TazPkg module
     2.7 +# Make TazPkg database for folder with *.tazpkg packages
     2.8 +
     2.9 +
    2.10 +# Input:  $1 - path to folder contains *.tazpkg packages
    2.11 +# Output files in the $1 folder:
    2.12 +#    packages.info
    2.13 +#    packages.equiv
    2.14 +#    descriptions.txt
    2.15 +#    files.list.lzma
    2.16 +#    IDs
    2.17 +# Do nothing if database already exists; force rebuild it with --forced option.
    2.18 +
    2.19 +# DB format:
    2.20 +# ==========
    2.21 +
    2.22 +# packages.info
    2.23 +# -------------
    2.24 +# Record is line; fields are tab-separated. Fields description:
    2.25 +# 1: package name
    2.26 +# 2: version with extra-version
    2.27 +# 3: category
    2.28 +# 4: short description
    2.29 +# 5: upstream web site
    2.30 +# 6: tags (space-separated)
    2.31 +# 7: packed and unpacked sizes (space-separated) in human readable format
    2.32 +# 8: depends
    2.33 +# 9: checksum
    2.34 +
    2.35 +# packages.equiv
    2.36 +# --------------
    2.37 +# This DB file used before package installation
    2.38 +# Record is line. Separator is "="
    2.39 +# Field 1 is package name to install (pkg1)
    2.40 +# Field 2 is space-separated list of items in the special format:
    2.41 +#    a) pkg2:pkg3
    2.42 +#       If pkg2 is installed, then install pkg3 instead of pkg1. Example:
    2.43 +#       busybox=pam:busybox-pam
    2.44 +#       If 'pam' is installed, then install 'busybox-pam' instead of 'busybox'
    2.45 +#    b) pkg2
    2.46 +#       If pkg2 already installed, then pkg1 will not be installed. Example:
    2.47 +#       mysql=mariadb
    2.48 +#       If 'mariadb' already installed, then 'mysql' will not be installed
    2.49 +# Complex rule example:
    2.50 +#    ssh=pam:openssh-pam openssh pam:dropbear-pam dropbear
    2.51 +
    2.52 +# descriptions.txt
    2.53 +# ----------------
    2.54 +# Field is line; record separator is empty line.
    2.55 +# First field is package name, rest - description itself.
    2.56 +# Empty lines in the description appended with space (" ") to avoid mess
    2.57 +# with end of record.
    2.58 +
    2.59 +# files.list.lzma
    2.60 +# ---------------
    2.61 +# It is "files.list" compressed using lzma due to it's big size.
    2.62 +# Format of the files.list: record is line; field separator is ": ".
    2.63 +# First field is package name, second field is file path.
    2.64 +# There are DB records for all files installed with the package.
    2.65 +
    2.66 +
    2.67 +# Preparations
    2.68 +# Get config values (CHECKSUM)
    2.69 +. /etc/slitaz/slitaz.conf
    2.70 +# Connect functions library
    2.71 +. /lib/libtaz.sh
    2.72 +
    2.73 +
    2.74 +# Report error and finish work
    2.75 +die() { longline "$(_ "$@")" >&2; exit 1; }
    2.76 +
    2.77 +
    2.78 +# Exit if input folder not specified
    2.79 +[ -z "$1" ] && die 'Input folder not specified'
    2.80 +
    2.81 +# Exit if input folder not exists
    2.82 +folder="$(realpath "$1")" || exit 1
    2.83 +
    2.84 +# Exit if folder is not writable
    2.85 +[ ! -w "$folder" ] && die 'You are not allowed to write to the folder "%s"' "$folder"
    2.86 +
    2.87 +# Exit if input folder does not contain packages
    2.88 +[ -z "$(find "$folder" -maxdepth 1 -name '*.tazpkg')" ] && \
    2.89 +	die 'Folder "%s" does not contain packages' "$folder"
    2.90 +
    2.91 +
    2.92 +# DB file names
    2.93 +DBi="$folder/packages.info"
    2.94 +DBe="$folder/packages.equiv"
    2.95 +DBd="$folder/descriptions.txt"
    2.96 +DBf="$folder/files.list"
    2.97 +
    2.98 +# Pre-remove DB if --forced and DB exists
    2.99 +if [ -n "$forced" ]; then
   2.100 +	[ -e "$DBi" ] && rm "$DBi"
   2.101 +	[ -e "$DBe" ] && rm "$DBe"
   2.102 +	[ -e "$DBd" ] && rm "$DBd"
   2.103 +	[ -e "$DBf.lzma" ] && rm "$DBf.lzma"
   2.104 +fi
   2.105 +
   2.106 +if [ -s "$DBi" ]; then
   2.107 +	_ 'Packages DB already exists.' >&2
   2.108 +	exit 1
   2.109 +fi
   2.110 +
   2.111 +# Random temporary folder
   2.112 +tempd="$(mktemp -d)"
   2.113 +
   2.114 +# Make temporary list of packages checksum (usually md5sum)
   2.115 +_n 'Calculate %s...' "$CHECKSUM"
   2.116 +cd "$folder"; $CHECKSUM *.tazpkg > "$tempd/$SUM"
   2.117 +status
   2.118 +
   2.119 +cd "$tempd"
   2.120 +
   2.121 +# Loop for every package
   2.122 +while read pkgsum pkgfile; do
   2.123 +	# Current processed package
   2.124 +	echo -n "$pkgfile"
   2.125 +
   2.126 +	# Extract receipt from package
   2.127 +	cpio -F "$folder/$pkgfile" -i receipt >/dev/null 2>&1
   2.128 +
   2.129 +	# Unset variables that may absent in the receipt
   2.130 +	unset EXTRAVERSION TAGS DEPENDS PROVIDE
   2.131 +	# Get values
   2.132 +	. receipt; rm receipt
   2.133 +
   2.134 +
   2.135 +	# Make packages.info
   2.136 +	echo -en "$PACKAGE\t$VERSION$EXTRAVERSION\t$CATEGORY\t" >> "$DBi"
   2.137 +	echo -en "$SHORT_DESC\t$WEB_SITE\t$TAGS\t" >> "$DBi"
   2.138 +	echo -en "$PACKED_SIZE $UNPACKED_SIZE\t" | sed 's|\.0||g' >> "$DBi"
   2.139 +	echo -n $DEPENDS$'\t' >> "$DBi"
   2.140 +	echo $pkgsum >> "$DBi"
   2.141 +
   2.142 +
   2.143 +	# Make packages.equiv
   2.144 +	for i in $PROVIDE; do
   2.145 +		# Example from busybox-pam package:
   2.146 +		# PACKAGE="busybox-pam", PROVIDE="busybox:pam"
   2.147 +		case $i in
   2.148 +			# DEST="pam:"
   2.149 +			*:*) DEST="${i#*:}:";;
   2.150 +			*)   DEST='';;
   2.151 +		esac
   2.152 +		# PKG="busybox"
   2.153 +		PKG="${i%:*}"
   2.154 +		if grep -qs ^$PKG= "$DBe"; then
   2.155 +			# Append existing record
   2.156 +			sed -i "s|^$PKG=|\0 $DEST$PACKAGE|" "$DBe"
   2.157 +		else
   2.158 +			# Add new record
   2.159 +			echo "$PKG=$DEST$PACKAGE" >> "$DBe"
   2.160 +		fi
   2.161 +	done
   2.162 +
   2.163 +
   2.164 +	# Make descriptions.txt
   2.165 +	if cpio -F "$folder/$pkgfile" -t 2>/dev/null | fgrep -q 'description.txt'; then
   2.166 +		# Extract description.txt from package
   2.167 +		cpio -F "$folder/$pkgfile" -i description.txt >/dev/null 2>&1
   2.168 +		# Append descriptions DB
   2.169 +		echo "$PACKAGE" >> "$DBd"
   2.170 +		cat description.txt | sed 's|^$| |' >> "$DBd"
   2.171 +		echo >> "$DBd"
   2.172 +		rm description.txt
   2.173 +	fi
   2.174 +
   2.175 +
   2.176 +	# Make files.list
   2.177 +	if cpio -F "$folder/$pkgfile" -t 2>/dev/null | fgrep -q 'files.list'; then
   2.178 +		# Extract files.list from package
   2.179 +		cpio -F "$folder/$pkgfile" -i files.list >/dev/null 2>&1
   2.180 +		# Append files list DB
   2.181 +		sed "s|.*|$PACKAGE: \0|" files.list >> "$DBf"
   2.182 +		rm files.list
   2.183 +	fi
   2.184 +
   2.185 +	# End line with the status
   2.186 +	status
   2.187 +done < "$tempd/$SUM"
   2.188 +
   2.189 +
   2.190 +# Sort DB alphabetically
   2.191 +sort -o "$tempd/pi" "$DBi"; mv -f "$tempd/pi" "$DBi"
   2.192 +
   2.193 +# Create empty files if they not exists
   2.194 +touch "$DBi" "$DBe" "$DBd" "$DBf"
   2.195 +
   2.196 +# Compress files.list using lzma
   2.197 +sort -k2 -o "$DBf.sorted" "$DBf"
   2.198 +lzma e "$DBf.sorted" "$DBf.lzma"
   2.199 +rm "$DBf" "$DBf.sorted"
   2.200 +
   2.201 +# Make DB readable for all
   2.202 +chmod a+r "$DBi" "$DBe" "$DBd" "$DBf.lzma"
   2.203 +
   2.204 +
   2.205 +# Make files for DB recharge
   2.206 +# --------------------------
   2.207 +
   2.208 +cd "$folder"
   2.209 +
   2.210 +# Make IDs: md5 and timestamp
   2.211 +( md5sum "$tempd/$SUM" | cut -d' ' -f1 | tr '\n' ' '; date -ur "$DBi" +%s ) > IDs
   2.212 +
   2.213 +
   2.214 +# Make files-list.md5: decide whether to download files.list.lzma or not
   2.215 +md5sum "$DBf.lzma" | cut -d' ' -f1 | tr -d $'\n' > files-list.md5
   2.216 +
   2.217 +# Make bundle to fast recharge
   2.218 +[ -f 'bundle.tar.lzma' ] && rm 'bundle.tar.lzma'
   2.219 +busybox tar -chaf bundle.tar.lzma \
   2.220 +	files-list.md5 packages.info descriptions.txt packages.equiv
   2.221 +
   2.222 +# Clean up
   2.223 +rm files-list.md5
   2.224 +rm -r "$tempd"
   2.225 +
     3.1 --- a/tazpanel/pkgs.cgi	Sat Jul 25 22:54:10 2015 +0200
     3.2 +++ b/tazpanel/pkgs.cgi	Tue Aug 04 02:29:51 2015 +0300
     3.3 @@ -947,25 +947,12 @@
     3.4  		<a data-icon="slitaz" href="?improve=$pkg">$(_ 'Improve package')</a>
     3.5  	</footer>
     3.6  </section>
     3.7 -<span id="ajaxStatus" style="display:none"></span>
     3.8  
     3.9 -<script type="text/javascript">
    3.10 -	var links = document.getElementById('infoTable').getElementsByTagName('a');
    3.11 -	for (var i = 0; i < links.length; i++) {
    3.12 -		console.log('i=%s, icon=%s.', i, links[i].dataset.icon);
    3.13 -		if (links[i].dataset.icon == 'clock') {
    3.14 -			links[i].parentNode.id = 'link' + i;
    3.15 -			pkg = links[i].innerText.replace(/\+/g, '%2B');
    3.16 -			ajax('pkgs.cgi?status&pkg=' + pkg, '1', 'link' + i);
    3.17 -		}
    3.18 -	}
    3.19 -
    3.20 -</script>
    3.21  EOT
    3.22  
    3.23  		# Show description
    3.24  		DESC="$(tazpkg desc $pkg)"
    3.25 -		[ -n "$DESC" ] && echo "<section><pre class="pre-wrap">$DESC</pre></section>"
    3.26 +		[ -n "$DESC" ] && echo "<section><pre class=\"pre-wrap\">$DESC</pre></section>"
    3.27  
    3.28  		# Show configuration files list
    3.29  		CONFIGS="$(tazpkg list-config $pkg | sed 's|\(.*\)|\1 \1|')"
    3.30 @@ -982,10 +969,24 @@
    3.31  <section>
    3.32  	<header>$(_ 'Installed files')</header>
    3.33  	<span id="fileList">
    3.34 -		<div style="text-align: center;"><span id="ajaxStatus"></span>$(_ 'Please wait')</div>
    3.35 +		<div style="text-align: center;"><span data-icon="clock">$(_ 'Please wait')</span></div>
    3.36  	</span>
    3.37  </section>
    3.38 -<script type="text/javascript">ajax('pkgs.cgi?filelist&pkg=$pkg', '1', 'fileList');</script>
    3.39 +
    3.40 +
    3.41 +<script type="text/javascript">
    3.42 +	var links = document.getElementById('infoTable').getElementsByTagName('a');
    3.43 +	for (var i = 0; i < links.length; i++) {
    3.44 +		console.log('i=%s, icon=%s.', i, links[i].dataset.icon);
    3.45 +		if (links[i].dataset.icon == 'clock') {
    3.46 +			links[i].parentNode.id = 'link' + i;
    3.47 +			pkg = links[i].innerText.replace(/\+/g, '%2B');
    3.48 +			ajax('pkgs.cgi?status&pkg=' + pkg, '1', 'link' + i);
    3.49 +		}
    3.50 +	}
    3.51 +
    3.52 +	ajax('pkgs.cgi?filelist&pkg=$pkg', '1', 'fileList');
    3.53 +</script>
    3.54  EOT
    3.55  		;;
    3.56  
     4.1 --- a/tazpkg	Sat Jul 25 22:54:10 2015 +0200
     4.2 +++ b/tazpkg	Tue Aug 04 02:29:51 2015 +0300
     4.3 @@ -3050,8 +3050,7 @@
     4.4  	convert|-c)
     4.5  		# convert misc package format to .tazpkg
     4.6  		check_for_package_file
     4.7 -		shift
     4.8 -		@@MODULES@@/convert $@
     4.9 +		shift; @@MODULES@@/convert $@
    4.10  		;;
    4.11  
    4.12  
    4.13 @@ -3119,6 +3118,11 @@
    4.14  		shift; @@MODULES@@/help $@ ;;
    4.15  
    4.16  
    4.17 +	mkdb)
    4.18 +		# Make TazPkg database
    4.19 +		shift; @@MODULES@@/mkdb $@ ;;
    4.20 +
    4.21 +
    4.22  	'')
    4.23  		# Default to summary
    4.24  		title "$(_ 'SliTaz package manager - Version: %s' $(colorize 34 $VERSION))"