I've tested and fixed up yesterday's patch. I think this works rather well, just a few issues: * debconf-apt-progress only advances the bar 15% while downloading, I'll de-hardcode that later. * 50mirror validates a mirror and then adds a deb-src line at the end. The progress bar for downloading/validating that line isn't allowed to advance since it's already advanced all the way. * Needs svn debconf, which I won't upload for at least another 4 days, since Frans's patch needs unstable debconf to propigate testing. * It's too much fun to try farflung mirrors, cancel, and change to another one. Works entirely too well. ;-) -- see shy jo
Index: debian/changelog
===================================================================
--- debian/changelog (revision 50009)
+++ debian/changelog (working copy)
@@ -1,3 +1,21 @@
+apt-setup (1:0.32) UNRELEASED; urgency=low
+
+ * Allocate 100 steps on the progress bar for each generator, and
+ set the progress absolutely to the next position after calling each
+ generator. This allows generators to step the progress bar up to 100
+ steps if desired.
+ * Export PROGRESS_FROM and PROGRESS_TO to generators, giving the
+ starting and ending progress bar position for that generator. This can
+ be used by generators that need an absolute progress bar position for
+ calling debconf-apt-progress.
+ * apt-setup-verify: Use debconf-apt-progress and add a way for generators
+ to specify how it should advance the progress bar.
+ * Allow the progress bar to be canceled (needs debconf 1.5.17 for proper
+ operation).
+ * 50mirror: Call choose-mirror -n to avoid trashing the progress bar.
+
+ -- Joey Hess <joeyh@debian.org> Fri, 02 Nov 2007 16:33:10 -0400
+
apt-setup (1:0.31) unstable; urgency=low
* Correct inverted test for CD sources, which caused it to skip verification
Index: apt-setup
===================================================================
--- apt-setup (revision 50009)
+++ apt-setup (working copy)
@@ -2,7 +2,6 @@
set -e
. /usr/share/debconf/confmodule
-db_capb backup
gendir=/usr/lib/apt-setup/generators
@@ -34,14 +33,19 @@
}
gencount=`ls "$gendir"/* | wc -l`
-db_progress START 0 $gencount apt-setup/progress/title
+db_capb backup progresscancel
+db_progress START 0 $(expr "$gencount" \* 100) apt-setup/progress/title
+PROGRESS_FROM=0
+PROGRESS_TO=100
+export PROGRESS_FROM
+export PROGRESS_TO
for generator in $gendir/*; do
base=$(basename $generator | sed 's/[0-9]*//')
base="${base%%.*}"
if ! db_progress INFO apt-setup/progress/$base; then
db_subst apt-setup/progress/fallback SCRIPT "$base"
- db_progress INFO apt-setup/progress/fallback
+ db_progress INFO apt-setup/progress/fallback || true
fi
tmp=$($chroot $ROOT tempfile)
@@ -63,6 +67,7 @@
log "$generator backed up"
rm -f $ROOT$tmp $ROOT/etc/apt/sources.list.new
db_progress STOP
+ db_capb backup
exit 10
;;
*)
@@ -70,7 +75,10 @@
;;
esac
rm -f $ROOT$tmp
- db_progress STEP 1
+
+ db_progress SET $PROGRESS_TO || true
+ PROGRESS_FROM=$PROGRESS_TO
+ PROGRESS_TO=$(expr $PROGRESS_FROM + 100)
done
mv $ROOT/etc/apt/sources.list.new $ROOT/etc/apt/sources.list
if [ -s $ROOT/etc/apt/apt.conf.new ]; then
@@ -80,3 +88,4 @@
fi
db_progress STOP
+db_capb backup
Index: apt-setup-verify
===================================================================
--- apt-setup-verify (revision 50009)
+++ apt-setup-verify (working copy)
@@ -12,16 +12,27 @@
fi
file="$1"
-saveto="$2"
+if [ "$2" != "--" ]; then
+ saveto="$2"
+fi
+while [ -n "$1" ] && [ "$1" != "--" ]; do
+ shift 1
+done
+if [ "$1" = "--" ]; then
+ shift 1
+fi
+
logoutput=""
if [ "$CATCHLOG" ]; then
logoutput="log-output -t apt-setup"
fi
chroot=
+intarget=
if [ "$ROOT" ]; then
chroot=chroot
+ intarget=in-target
fi
saveline () {
@@ -32,15 +43,20 @@
valid () {
line="$1"
+ shift 1
[ "${line%%:*}" != "deb cdrom" ] || return 0
tmp=$($chroot $ROOT tempfile)
echo "$line" > $ROOT$tmp
-
- if $logoutput $chroot $ROOT apt-get -o APT::Get::List-Cleanup=false \
- -o Dir::Etc::sourcelist=$tmp $ASV_TIMEOUT update
- then
+ code=0
+ $logoutput $intarget debconf-apt-progress \
+ "${@:---no-progress}" --logstderr -- \
+ apt-get -o APT::Get::List-Cleanup=false \
+ -o Dir::Etc::sourcelist=$tmp $ASV_TIMEOUT update || code=$?
+ if [ "$code" == 30 ]; then
+ exit 30 # canceled
+ elif [ "$code" == 0 ]; then
rm -f $ROOT$tmp
else
rm -f $ROOT$tmp
@@ -65,13 +81,22 @@
saveline ""
fi
- if [ -z "$NOTEST" ] && valid "$line"; then
+ if [ -z "$NOTEST" ] && valid "$line" "$@"; then
gooditems=$(expr "$gooditems" + 1)
saveline "$line"
else
saveline "# Line commented out by installer because it failed to verify:"
saveline "#$line"
fi
+
+ # shift away remaining options to avoid passing them
+ # to debconf-apt-progress a second time.
+ while [ -n "$1" ] && [ "$1" != "--" ]; do
+ shift 1
+ done
+ if [ "$1" = "--" ]; then
+ shift 1
+ fi
else
# Ignore leading empty lines
if [ $items != 0 ] || [ "$line" ]; then
Index: generators/50mirror
===================================================================
--- generators/50mirror (revision 50009)
+++ generators/50mirror (working copy)
@@ -184,7 +184,7 @@
echo "deb $protocol://$hostname$directory $codename $dists" > $file
- if apt-setup-verify $file; then
+ if apt-setup-verify $file -- --from $PROGRESS_FROM --to $PROGRESS_TO; then
done=1
else
db_set apt-setup/mirror/error Retry
@@ -192,7 +192,7 @@
db_go || exit 10
db_get apt-setup/mirror/error
if [ "$RET" = "Change mirror" ]; then
- choose-mirror || true
+ choose-mirror -n || true
elif [ "$RET" = Ignore ]; then
exit 1
fi
Index: generators/91security
===================================================================
--- generators/91security (revision 50009)
+++ generators/91security (working copy)
@@ -36,7 +36,7 @@
else
CODE=0
export ASV_TIMEOUT="-o Acquire::http::Timeout=30"
- if ! apt-setup-verify $file; then
+ if ! apt-setup-verify $file -- --from $PROGRESS_FROM --to $PROGRESS_TO; then
db_subst apt-setup/service-failed HOST "$host"
db_input critical apt-setup/service-failed || true
if ! db_go; then
Index: generators/92volatile
===================================================================
--- generators/92volatile (revision 50009)
+++ generators/92volatile (working copy)
@@ -42,7 +42,7 @@
else
CODE=0
export ASV_TIMEOUT="-o Acquire::http::Timeout=30"
- if ! apt-setup-verify $file; then
+ if ! apt-setup-verify $file -- --from $PROGRESS_FROM --to $PROGRESS_TO; then
db_subst apt-setup/service-failed HOST "$host"
db_input critical apt-setup/service-failed || true
if ! db_go; then
Index: README
===================================================================
--- README (revision 50009)
+++ README (working copy)
@@ -6,11 +6,12 @@
(and comments) to.
After the generator finishes writing the file, apt-setup-verify will be run
-on it to verify that each line of the sources sources works, and it will be
+on it to verify that each line of the sources works, and it will be
added to the sources.list. Generators can also run apt-setup-verify
themselves and do their own error recovery if it fails. apt-setup-verify
tests each line of the file and comments out lines that do not work, and
-exits nonzero if all deb and deb-src lines in the file failed.
+exits zero if all deb and deb-src lines in the file are ok, 30 if the
+verification process was canceled, and otherwise nonzero on error.
Generators should add both "deb" lines and corresponding
deb-src lines to the sources.list. apt-setup-verify will handle commenting
@@ -25,6 +26,17 @@
progress template name, so that different scripts that share the same
purpose can easily be written.
+Generators can advance the progress bar from PROGRESS_FROM up to
+PROGRESS_TO, or it will be moved to the next step before the next
+generator is started.
+
+apt-setup-verify runs apt-get update inside debconf-apt-progress, to update
+the progress bar with apt progress information. By default,
+debconf-apt-progress is not allowed to move the progress bar. To override
+this, pass apt-setup-verify options after "--"; these options will be
+passed on to debconf-apt-progress. For example:
+ apt-setup-verify file -- --from 1 --to 100
+
Note that apt-setup and its generators may be run against some other system
in a chroot. (i.e., when installing Debian.) If apt-setup is running this
way, then ROOT will be set to the root of the chroot that it is acting on
Attachment:
signature.asc
Description: Digital signature