Bug#185424: base-config: Should display progress bar while installing packages
On Tue, Aug 02, 2005 at 08:41:53PM +0100, Colin Watson wrote:
> I've implemented a first cut at the base-config code for this (although
> in Ubuntu base-config which uses aptitude rather than tasksel, so it
> would take a small change to port it to Debian; however I've made it
> fairly generic so I don't expect it to be difficult), which I'm testing
> at the moment.
Oh, I should post my work so far. It's in arch here:
baz register-archive http://people.ubuntu.com/~cjwatson/archives/colin.watson@canonical.com--2005
baz get colin.watson@canonical.com--2005/base-config--pkgsel-progress--0
... and the diff against Ubuntu's current base-config is attached. It
needs an extra versioned dependency on apt, but I don't know which
version will have Michael's progress code yet. It also doesn't wrap all
the bits of pkgsel that print output to the console, but that can come
in time.
Cheers,
--
Colin Watson [cjwatson@debian.org]
* finding or making colin.watson@canonical.com--2005/base-config--ubuntu--0--patch-67
* finding or making colin.watson@canonical.com--2005/base-config--pkgsel-progress--0--patch-5
* auto-adding colin.watson@canonical.com--2005/base-config--pkgsel-progress--0--patch-5 to greedy revision library /home/cjwatson/.arch-revlib
* computing changeset
A/ {arch}/base-config/base-config--pkgsel-progress
A/ {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0
A/ {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005
A/ {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005/patch-log
A {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005/patch-log/base-0
A {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005/patch-log/patch-1
A {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005/patch-log/patch-2
A {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005/patch-log/patch-3
A {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005/patch-log/patch-4
A {arch}/base-config/base-config--pkgsel-progress/base-config--pkgsel-progress--0/colin.watson@canonical.com--2005/patch-log/patch-5
M debian/templates
M debian/control
M lib/menu/pkgsel
* changeset report
* modified files
--- orig/debian/control
+++ mod/debian/control
@@ -8,7 +8,7 @@
Package: base-config
Architecture: all
-Depends: debconf (>= 1.4.42ubuntu3), apt, adduser, console-data (>= 2002.12.04dbs-16), console-tools, passwd (>= 20000902-6), bsdutils (>= 1:2.11l), debianutils (>= 1.6), gettext-base
+Depends: debconf (>= 1.4.55), apt, adduser, console-data (>= 2002.12.04dbs-16), console-tools, passwd (>= 20000902-6), bsdutils (>= 1:2.11l), debianutils (>= 1.6), gettext-base
Conflicts: tasksel (<< 2.25)
Description: Debian base system configurator
This package handles setting up the Debian base system. It contains the
--- orig/debian/templates
+++ mod/debian/templates
@@ -167,6 +167,19 @@
Type: text
_Description: Execute a shell
+Template: base-config/progress/main-title
+Type: text
+_Description: Installing packages
+
+Template: base-config/progress/main-prep
+Type: text
+_Description: Preparing to install packages...
+
+Template: base-config/progress/info
+Type: text
+# Not translated; apt emits translated descriptions for us already.
+Description: ${DESCRIPTION}
+
Template: debian-installer/keymap
Type: string
Description: dummy item
--- orig/lib/menu/pkgsel
+++ mod/lib/menu/pkgsel
@@ -10,6 +10,41 @@
/usr/bin/scrollkeeper-rebuilddb
}
+# Wrap package installation in a progress bar. The nominated subprocess
+# should output apt install-status information to fd 4, and should ensure to
+# keep fds 5 and 6 open when invoking debconf (directly or indirectly), as
+# those fds will be used for the debconf passthrough protocol.
+progress () {
+ TITLE="$1"
+ PREPINFO="$2"
+ shift 2
+
+ # Create a temporary config database for use by the debconf instance
+ # responsible for displaying the progress bar. This allows it to
+ # avoid locking the normal config database, which will be needed by
+ # other debconf instances while installing packages.
+ debconf-copydb configdb progressdb -c Name:progressdb -c Driver:File \
+ -c Filename:"$BC_TMPDIR/progress.dat" \
+ --pattern='^base-config/progress/'
+
+ # This is much less messy than trying to use normal pipes.
+ rm -f "$BC_TMPDIR/progress.fifo"
+ mkfifo -m 0600 "$BC_TMPDIR/progress.fifo"
+
+ # Start up the progress bar in the background.
+ DEBCONF_DB_REPLACE="File{$BC_TMPDIR/progress.dat}" \
+ $0 progress "$TITLE" "$PREPINFO" 4<"$BC_TMPDIR/progress.fifo" &
+ PROGRESS_PID="$!"
+
+ # Do the installation.
+ DEBIAN_FRONTEND=passthrough DEBCONF_READFD=5 DEBCONF_WRITEFD=6 \
+ "$@" >/var/log/base-config-pkgsel.log \
+ 2>&1 4>"$BC_TMPDIR/progress.fifo"
+
+ # Clean up the progress bar process.
+ wait "$PROGRESS_PID"
+}
+
case "$1" in
''|new)
# Make dpkg not background itself to get a shell.
@@ -77,9 +112,13 @@
|| true
else
PATTERN="$($0 get_package_selection 4>&1)"
- if [ "$PATTERN" ] && ! DEBIAN_PRIORITY=high aptitude \
- --without-recommends -y install \
- "$PATTERN"; then
+ if [ "$PATTERN" ] && ! DEBIAN_PRIORITY=high \
+ progress base-config/progress/main-title \
+ base-config/progress/main-prep \
+ aptitude -o APT::Status-Fd=4 \
+ -o APT::Keep-Fds::=5 -o APT::Keep-Fds::=6 \
+ --without-recommends -y install \
+ "$PATTERN"; then
cleanup
$0 failure
DEBIAN_PRIORITY=high aptitude \
@@ -204,4 +243,27 @@
db_get base-config/install-language-support
echo "$RET" >&4
;;
+progress)
+ . /usr/share/debconf/confmodule
+ shift
+ TITLE="$1"
+ PREPINFO="$2"
+ shift 2
+ db_progress START 0 100 "$TITLE"
+ db_progress INFO "$PREPINFO"
+ OLDIFS="$IFS"
+ IFS=:
+ while read status pkg percent description <&4; do
+ IFS="$OLDIFS"
+ case $status in
+ status) ;;
+ *) continue ;;
+ esac
+ db_progress SET "${percent%%.*}"
+ db_subst base-config/progress/info DESCRIPTION "$description"
+ db_progress INFO base-config/progress/info
+ IFS=:
+ done
+ IFS="$OLDIFS"
+ ;;
esac
Reply to: