+# This loop simply wants to be fed by a list of values (see below)
+# made out of 5 columns.
+# The first four are the array values for the stage function, the
+# fifth tells us if we should background the stage call.
+#
+# - FUNC - the function name to call
+# - ARGS - Possible arguments to hand to the function. Can be the empty string
+# - TIME - The timestamp name. Can be the empty string
+# - ERR - if this is the string false, then the call will be surrounded by
+# set +e ... set -e calls, so errors in the function do not exit
+# dinstall. Can be the empty string, meaning true.
+# - BG - Background the function stage?
+#
+# ATTENTION: Spaces in arguments or timestamp names need to be escaped by \
+#
+# NOTE 1: There are two special values for the first column (FUNC).
+# STATE - do not call stage function, call the state
+# function to update the public statefile "where is dinstall"
+# NOSTAGE - do not call stage function, call the command directly.
+#
+# Note 2: If you want to hand an empty value to the stage function,
+# use the word "none" in the list below.
+while read FUNC ARGS TIME ERR BACKGROUND; do
+ debug "FUNC: $FUNC ARGS: $ARGS TIME: $TIME ERR: $ERR BG: $BACKGROUND"
+
+ # Empty values in the value list are the string "none" (or the
+ # while read loop won't work). Here we ensure that variables that
+ # can be empty, are empty if the string none is set for them.
+ for var in ARGS TIME; do
+ if [[ ${!var} == none ]]; then
+ typeset ${var}=''
+ fi
+ done
+
+ # ERR/BACKGROUND are boolean, check that they are.
+ for var in ERR BACKGROUND; do
+ if [[ ${!var} != false ]] && [[ ${!var} != true ]]; then
+ error "Illegal value ${!var} for ${var} (should be true or false), line for function ${FUNC}"
+ fi
+ done
+
+ case ${FUNC} in
+ STATE)
+ state ${ARGS}
+ ;;
+ NOSTAGE)
+ ${ARGS}
+ ;;
+ *)
+ GO=(
+ FUNC=${FUNC}
+ TIME=${TIME}
+ ARGS=${ARGS}
+ ERR=${ERR}
+ )
+ if [[ ${BACKGROUND} == true ]]; then
+ stage $GO &
+ else
+ stage $GO
+ fi
+ ;;
+ esac
+done < <(cat - <<EOF
+savetimestamp none none false false
+qa1 none init true true
+pg_timestamp predinstall pg_dump1 false false
+updates none External\ Updates false false
+i18n1 none i18n\ 1 false false
+dep11 none dep11\ 1 false false
+NOSTAGE lockaccepted none false false
+punew stable-new p-u-new false false
+opunew oldstable-new o-p-u-new false false
+backports_policy none backports-policy false false
+cruft none cruft false false
+STATE indices none false false
+dominate none dominate false false
+autocruft none autocruft false false
+fingerprints none import-keyring false false
+overrides none overrides false false
+mpfm none pkg-file-mapping false false
+STATE packages/contents none false false
+packages none apt-ftparchive false false
+STATE dists/ none false false
+pdiff none pdiff false false
+release none release\ files false false
+dakcleanup none cleanup false false
+STATE scripts none false false
+mkmaintainers none mkmaintainers false false
+copyoverrides none copyoverrides false false
+mklslar none mklslar false false
+mkfilesindices none mkfilesindices false false
+mkchecksums none mkchecksums false false
+signotherfiles none signotherfiles false false
+mirror none mirror\ hardlinks false false
+NOSTAGE remove_locks none false false
+STATE postlock none false false
+ddaccess none ddaccessible\ sync true true
+changelogs none changelogs false true
+pg_timestamp postdinstall pg_dump2 false false
+expire none expire_dumps false true
+transitionsclean none transitionsclean false true
+dm none none false true
+bts none none false true
+mirrorpush none mirrorpush false true
+mirrorpush-backports none mirrorpush-backports false true
+i18n2 none i18n\ 2 false true
+stats none stats false true
+testingsourcelist none none false true
+NOSTAGE rm\ -f\ "\${LOCK_BRITNEY}" none false false
+cleantransactions none none false false
+EOF
+ )
+# FUNC ARGS TIME ERR BG