# HG changeset patch # User Christophe Lincoln # Date 1488254281 -3600 # Node ID 090432cab6730d3b2fb5b6210417535aeea81529 # Parent 454e319df9a63f673fc3d96e9e031ed958c160fc Lots of improvments, implement 'update' cmdline tool handle SQLite packages db diff -r 454e319df9a6 -r 090432cab673 libsup.sh --- a/libsup.sh Tue Feb 28 00:01:30 2017 +0100 +++ b/libsup.sh Tue Feb 28 04:58:01 2017 +0100 @@ -15,9 +15,8 @@ installed="$supdb/installed" activity="$cache/activity.log" -host="http://localhost/~pankso/cgi-bin/scn/" -#host="http://scn.slitaz.org/" -mirror="${host}content/sup/packages" +server="http://scn.slitaz.org/" +mirror="${server}content/sup/packages" pkgsdb="$supdb/packages.sql" wok="$supdb/wok" @@ -38,6 +37,13 @@ echo ${size} } +# Minimal Busybox wget output. Usage: download "name" "url" +download() { + gettext "Fetching"; echo -n $(colorize 30 " db → ") + wget "$2" 2>&1 | tail -n 2 | awk '{printf $3}' \ + | sed s'!*!-!'g +} + # Extract a sup package: extract_sup "/path/to/pkg.sup" extract_sup() { pkg="$(basename ${1%.sup})" @@ -58,10 +64,9 @@ install_sup() { pkg="$(basename ${1%.sup})" supfile="$(readlink -f ${1%.sup}.sup)" - cache="$cache/install" - rm -rf ${cache} && mkdir ${cache} - cp ${supfile} ${cache} && cd ${cache} + rm -rf ${cache}/install && mkdir ${cache}/install + cp ${supfile} ${cache}/install && cd ${cache}/install # Get receip for deps cpio -i receip --quiet < ${supfile} @@ -75,7 +80,7 @@ echo "Missing dependency:"; colorize 35 " $dep" fi done - . /etc/slitaz/slitaz.conf + . /etc/slitaz/slitaz.conf # PKGS_DB for dep in ${DEPENDS}; do if [ ! "$PKGS_DB/installed/$dep" ]; then echo "Missing dependency:"; colorize 35 " $dep" @@ -88,6 +93,7 @@ separator # Extract and source receip first to check deps + md5sum=$(md5sum $supfile | awk '{print $1}') extract_sup "$supfile" # Execute sup_install() in files/ tree so packages maintainers just @@ -95,7 +101,7 @@ cd files if grep -q "^sup_install" ../receip; then gettext "Executing install function:" - indent $(($(tty_size) - 18)) "[ $(colorize 33 sup_install) ]" + indent $(($(tty_size) - 18)) "[ $(colorize 033 sup_install) ]" sup_install fi @@ -103,18 +109,19 @@ if [ "$verbose" ]; then gettext "Creating the list of installed files..."; echo fi - files_list="${cache}/${PACKAGE}-${VERSION}/files.list" + files_list="${cache}/install/${PACKAGE}-${VERSION}/files.list" find . -type f -print > ${files_list} find . -type l -print >> ${files_list} sed -i s/'^.'/''/g ${files_list} # Back to pkg tree - cd ${cache}/${PACKAGE}-${VERSION} + cd ${cache}/install/${PACKAGE}-${VERSION} echo "sup_size=\"$(du -sh files | cut -d " " -f 1)\"" >> receip + echo "md5_sum=\"${md5sum}\"" >> receip # Now we need a place to store package data and set $sup_size - gettext "Installing files:" - echo -n "$(colorize 35 " $(wc -l files.list | cut -d " " -f 1)")" + echo -n "$(colorize 036 "$(gettext 'Installing files:') \ +$(wc -l files.list | cut -d " " -f 1)")" data="${installed}/${PACKAGE}" mkdir -p ${data} @@ -123,8 +130,10 @@ done for file in $(ls -A files); do cp -rf files/${file} ${HOME} - done && status - newline && rm -rf ${cache} + done + status + + newline && rm -rf ${cache}/install } # Remove a sup package @@ -139,8 +148,9 @@ separator gettext "Files to remove :" - indent $(($(tty_size) - 8)) \ - "[ $(colorize 33 $(wc -l ${files_list} | cut -d ' ' -f 1)) ]" + files="$(wc -l ${files_list} | cut -d ' ' -f 1)" in=8 + [ "$files" -gt "10" ] && in=9 && [ "$files" -gt "100" ] && in=10 + indent $(($(tty_size) - ${in})) "[ $(colorize 33 $files) ]" # Remove all files for file in $(cat $files_list) diff -r 454e319df9a6 -r 090432cab673 sup --- a/sup Tue Feb 28 00:01:30 2017 +0100 +++ b/sup Tue Feb 28 04:58:01 2017 +0100 @@ -5,7 +5,7 @@ # Copyright (C) 2017 SliTaz GNU/Linux - BSD License # Author: Christophe Lincoln # -# Colors: installed 36; wok/package 35; commands/functions 33 +# Colors: installed 036/36; wok/package 035/35; commands/functions 033/33 # # Get system wide libsup.sh or development version if working in Hg folder @@ -165,7 +165,7 @@ status size="$(du -sh $cooked/$supfile | cut -d " " -f 1)" - echo "$(gettext 'Packages:') $(colorize 33 $supfile) ($size)" + echo "$(gettext 'Packages:') $(colorize 35 $supfile) ($size)" rm -rf ${cache} && newline ;; -n|new) @@ -227,12 +227,23 @@ fi # Sup on mirror - echo "TODO: check for package on mirror" + [ ! -f "${pkgsdb}" ] && sup -u + if sqlite3 ${pkgsdb} "SELECT name FROM pkgs WHERE name = '$pkg'" >/dev/null + then + vers=$(sqlite3 ${pkgsdb} "SELECT version FROM pkgs WHERE name = '$pkg'") + mkdir -p ${cache}/wget && cd ${cache}/wget + # Download + newline + download "$pkg" "${mirror}/${pkg}-${vers}.sup" + install_sup "${pkg}-${vers}.sup" + rm -rf ${cache}/wget && exit 0 + fi gettext "Can't find sup package:"; colorize 31 " $pkg" ;; -u|update) # Update packages + online="" newline colorize 33 $(gettext "SUP Update") separator @@ -240,22 +251,79 @@ # Skip HTTP/1.1 404 Not Found: 2>/dev/null if ! wget -q -T 5 --spider ${mirror}/packages.sql 2>/dev/null; then gettext "Mirror is unreachable"; newline + else + online=0 fi # Newer packages.sql ? - wget -q "http://localhost/~pankso/cgi-bin/scn/?sup=dbsum" -O - + gettext "Checking packages.sql..." + db_sum=$(wget -q "${server}?sup=dbsum" -O -) + if echo "$db_sum $pkgsdb" | md5sum -s -c -; then + indent $(($(tty_size) - 13)) "[ $(colorize 36 synced) ]" + else + [ "$online" ] && rm -f ${pkgsdb} + indent $(($(tty_size) - 13)) "[ $(colorize 35 update) ]" + fi + # No packages.sql: get latest! + if [ ! -f "$pkgsdb" ] && [ "$online" ]; then + gettext "Fetching db"; echo -n " → " + wget -P ${supdb} ${mirror}/packages.sql 2>&1 | tail -n 2 \ + | awk '{printf $3}'; status + + timestamp=$(sqlite3 ${pkgsdb} 'SELECT timestamp FROM info' \ + | awk '{printf $1 " " $2}') + gettext "Database timestamp:" + indent $(($(tty_size) - 23)) "[ $(boldify $timestamp) ]" + fi - rm -f ${pkgsdb} - wget -P ${supdb} ${mirror}/packages.sql - sqlite3 ${pkgsdb} 'SELECT timestamp FROM info' \ - | awk '{printf "Timestamp : %s %s\n",$1,$2 }' - - for pkg in $(ls $wok); do - echo "$pkg" + # Scan installed packages + count=$(ls $installed | wc -l) in=8 + [ "$count" -gt "10" ] && in=9 && [ "$count" -gt "100" ] && in=10 + gettext "Installed packages:" + indent $(($(tty_size) - ${in})) "[ $(colorize 33 $count) ]" + cat << EOT + +$(boldify Package $(indent 30 Version) $(indent 52 Status)) +-------------------------------------------------------------------------------- +EOT + for pkg in $(ls $installed) + do + . ${installed}/${pkg}/receip + db_sum=$(sqlite3 ${pkgsdb} \ + "SELECT md5sum FROM pkgs WHERE name = '$pkg'") + + # MD5sum not matching: new version our new build ? + if [ "$md5_sum" != "$db_sum" ]; then + vers=$(sqlite3 ${pkgsdb} \ + "SELECT version FROM pkgs WHERE name = '$pkg'") + if [ "$VERSION" != "$vers" ]; then + status="$(gettext "update")" + else + status="$(gettext "rebuilt")" + fi + echo "$pkg $(indent 30 $VERSION) $(indent 52 $status)" + echo "$pkg" >> ${cache}/updates + fi done - newline ;; + if [ -f "$cache/updates" ]; then + count=$(cat $cache/updates | wc -l) + cat << EOT +-------------------------------------------------------------------------------- +EOT + gettext "Available updates:"; colorize 32 " $count" + # --install + if [ "$install" ]; then + for pkg in $(cat $cache/updates); do + sup -i ${pkg} + done + fi + else + gettext "Packages are up-to-date"; echo + newline + fi + rm -f ${cache}/updates ;; -r|remove) # Remove a package