|
|
@@ -59,6 +59,66 @@ ensure_no_triggers_noawait()
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
+downgrade_multiarch_infodb()
|
|
|
+{
|
|
|
+ admindir=${DPKG_ADMINDIR:-/var/lib/dpkg}
|
|
|
+ pkgadmindir=$admindir/info
|
|
|
+
|
|
|
+ coinst_pkgs="`ls "$pkgadmindir" | \
|
|
|
+ sed -n -e 's/^\([^:]\+:[^.]\+\)\..*$/\1/p' | sort -u | \
|
|
|
+ cut -d: -f1 | uniq -d`"
|
|
|
+
|
|
|
+ # Abort if we cannot possibly downgrade
|
|
|
+ if [ -n "$coinst_pkgs" ]; then
|
|
|
+ cat <<- MSG
|
|
|
+ dpkg: error: You have more than one architecture instance for some
|
|
|
+ installed 'Multi-Arch: same' packages, to be able to downgrade dpkg
|
|
|
+ you will need to have only one instance installed per package.
|
|
|
+
|
|
|
+ List of co-installed packages:
|
|
|
+
|
|
|
+ $coinst_pkgs
|
|
|
+ MSG
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ bad_dep_pkgs=$(dpkg-query -f '${Package}\t${Depends} ${Recommends} ${Suggests} ${Enhances} ${Conflicts} ${Replaces} ${Breaks}\n' -W | \
|
|
|
+ grep ":any" | cut -f1 | sort -u)
|
|
|
+ if [ -n "$bad_dep_pkgs" ]; then
|
|
|
+ cat <<- MSG
|
|
|
+ dpkg: error: Some installed packages have multiarch dependencies that
|
|
|
+ the old dpkg won't parse. You should get rid of them (or downgrade
|
|
|
+ them to versions without those dependencies) before proceeding with
|
|
|
+ dpkg's downgrade.
|
|
|
+
|
|
|
+ List of affected packages:
|
|
|
+
|
|
|
+ $bad_dep_pkgs
|
|
|
+ MSG
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ dep_fields='Depends|Recommends|Suggests|Enhances|Conflicts|Replaces|Breaks'
|
|
|
+ if grep -qE "^($dep_fields):.*:any" $admindir/available; then
|
|
|
+ cat <<- MSG
|
|
|
+ dpkg: error: Some available packages have multiarch dependencies that
|
|
|
+ the old dpkg won't parse. You should clear this file before proceeding
|
|
|
+ with dpkg's downgrade, with:
|
|
|
+
|
|
|
+ # dpkg --clear-avail
|
|
|
+ MSG
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo "Downgrading the multiarch dpkg control files database ..."
|
|
|
+ ls $pkgadmindir | grep : | while read oldfile; do
|
|
|
+ # We first do a round of hardlinks to the new names, so that the db
|
|
|
+ # will never be unusable for either of the dpkg versions.
|
|
|
+ newfile=$(echo $oldfile | sed -e 's/:[^.]\+//')
|
|
|
+ ln -f "$pkgadmindir/$oldfile" "$pkgadmindir/$newfile"
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
case "$1" in
|
|
|
upgrade)
|
|
|
# Allow the downgrade only if no package is using the
|
|
|
@@ -66,6 +126,10 @@ case "$1" in
|
|
|
if dpkg --compare-versions "$2" lt 1.16.1~; then
|
|
|
ensure_no_triggers_noawait
|
|
|
fi
|
|
|
+ # Downgrade the multiarch db to a “monoarch” db layout
|
|
|
+ if dpkg --compare-versions "$2" lt 1.16.2~; then
|
|
|
+ downgrade_multiarch_infodb
|
|
|
+ fi
|
|
|
;;
|
|
|
|
|
|
remove|failed-upgrade|deconfigure)
|