[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: