From 66d1ecb5defd5515e1619924264933871791e9ce Mon Sep 17 00:00:00 2001 From: "mauro.giachero" Date: Tue, 27 Jan 2009 15:53:47 +0000 Subject: [PATCH] Update list: show progress indicator Show a nice progress indicator instead of a "please wait"-style message. The code containg a CLI implementation of a progress bar, and a gateway function choosing between the "dialog" and the "cli" version depending on whether we're using ncurses. The code should also be generic enough to be reused whenever another gauge comes handy. Many thanks to alkos333 for the idea and for the "dialog" implementation. Signed-off-by: Mauro Giachero --- src/usr/bin/sbopkg | 92 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 7 deletions(-) diff --git a/src/usr/bin/sbopkg b/src/usr/bin/sbopkg index ef51f21..cb989eb 100755 --- a/src/usr/bin/sbopkg +++ b/src/usr/bin/sbopkg @@ -30,9 +30,9 @@ # Antoine, ktabic, Ken Roberts, samac, Bert Babington, Murat D. Kadirov, # The-spiki, David Somero, LukenShiro, Drew Ames, nille, acidchild, mancha, # macavity, Zordrak, João Felipe Santos, cotterochan, necropresto, Pierre -# Cazenave, Mauro Giachero, The-Croupier, Wade Grant, and TSquaredF. This -# script would not be where it is without the help of these folks. If I left -# anyone out, I apologize. Thank you! +# Cazenave, Mauro Giachero, The-Croupier, Wade Grant, TSquaredF and alkos333. +# This script would not be where it is without the help of these folks. If I +# left anyone out, I apologize. Thank you! # #set -x @@ -289,13 +289,84 @@ get_sbo_packages () { fi } +function progressbar_cli () { + # This is a simple progressbar for CLI operations. + # The code shows a bar filling like this: + # 0%[ ] + # 25%[= ] + # 50%[== ] + # 75%[=== ] + # 100%[====] + # This is meant to be an "almost drop-in" replacement for + # "dialog --gauge". The percentage data is read from stdin and the bar + # fills a screen line. + # + # If available, "tput" (part of ncurses) is used to determine the screen + # width and to hide the cursor. + local PROGRESS SCREENPROGRESS i + local SCREENWIDTH BARWIDTH + local BAR SPACES + local HAS_NCURSES=false + + [[ -x /usr/bin/tput ]] && HAS_NCURSES=true + + # Initial messages + if [[ -n "$1" ]]; then + echo "[ $1 ]" + fi + if [[ -n "$2" ]]; then + crunch_fmt "$2" + fi + + # Initialize the bar + # Screen size + if $HAS_NCURSES; then + tput civis # Hide cursor + SCREENWIDTH=$(tput cols) + else + SCREENWIDTH=80 + fi + BARWIDTH=$(($SCREENWIDTH - 7)) + + while read PROGRESS; do + # Show the percentage + printf "\r%3s%%[" $PROGRESS + + # Draw the bar + SCREENPROGRESS=$(($BARWIDTH * $PROGRESS / 100)) + printf -vBAR "%${SCREENPROGRESS}s" "" + printf -vSPACES "%$(($BARWIDTH - $SCREENPROGRESS))s" "" + printf "%s%s]" "${BAR// /=}" "${SPACES// / }" + done + + # Cleanup + echo + if $HAS_NCURSES; then + tput cnorm # Restore cursor + fi +} + +function progressbar () { + # This is a simple progressbar gateway, which automatically chooses + # between the "dialog" and the "cli" bars. + if [[ $DIAG -eq 1 ]]; then + local MESSAGE=$(crunch "$2") + local MESSAGELINES=$(echo "$MESSAGE" |fmt -66 |wc -l) + dialog --title "$1" --gauge "$MESSAGE" $(($MESSAGELINES + 5)) 70 0 + else + progressbar_cli "$1" "$2" + fi +} + check_for_updates () { # This checks for updates to installed SBo packages. Thanks to Mauro # Giachero for this much-improved update code and related functions! local NEWSB NEWINFO NEWVER local VERSION_EXPRESSION - local TEMPFILE + local TEMPFILE UPDATELIST VERSION_FILE local STRING INDEX OLDNAME NAME VER ARCH BUILD + local VER_NUMERIC NEWVER_NUMERIC UPDATED + local PKGS NUMPKGS PROGRESSCOUNTER=0 if [ "$SLACKVER" = "local" ]; then dialog --title "ERROR" --msgbox \ @@ -309,17 +380,20 @@ check_for_updates () { rm -f $UPDATELIST cd /var/log/packages PKGS=$(ls *_SBo) + NUMPKGS=$(echo $PKGS |wc -w) VERSION_FILE=$TMP/sbopkg-script-version if [ -e "$PKGS" ]; then echo "No SlackBuilds.org packages detected." >> $UPDATELIST else - crunch_fmt "Building list of potential updates. This may take a \ - few moments depending on how many SlackBuilds.org packages are \ - installed..." crunch_fmt "Listing installed SlackBuilds.org packages and flagging \ potential updates..." >> $UPDATELIST echo >> $UPDATELIST + { # Grouping for the progressbar for CURPKG in $PKGS; do + # Progress indicator, for the progressbar + echo $(($PROGRESSCOUNTER * 100 / $NUMPKGS)) + (( PROGRESSCOUNTER += 1 )) + # This next code is borrowed and modified from pkgtool #echo $i | sed 's/_SBo$//;s/-[^-]*-[^-]*-[^-]*$//' STRING=$(basename $CURPKG _SBo) @@ -435,6 +509,10 @@ check_for_updates () { fi fi done + echo 100 # To complete the progressbar + } | progressbar "Building list of potential updates" "This may take\ + a few moments depending on how many SlackBuilds.org packages are\ + installed..." echo >> $UPDATELIST echo "Potential update list complete." >> $UPDATELIST fi