123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #!/bin/sh
- # See deb-prerm(5).
- set -e
- ensure_no_triggers_noawait()
- {
- admindir=${DPKG_ADMINDIR:-/var/lib/dpkg}
- pkgadmindir=$admindir/info
- trig_noawait=$(find "$pkgadmindir" -name "*.triggers" -type f | \
- xargs -r grep -El "^(interest|activate)-(no)?await" | \
- sed -e 's,^.*/\([^/.:]\+\)[^/]\+$,\1,')
- # Abort if we cannot possibly downgrade
- if [ -n "$trig_noawait" ]; then
- cat <<- MSG
- dpkg: error: You have packages using the "interest-noawait" and/or
- "activate-noawait" trigger directives but the dpkg version that
- you're trying to downgrade to doesn't support them. Aborting
- downgrade.
- List of affected packages:
- $trig_noawait
- MSG
- exit 1
- fi
- bad_triggers_files=$(find "$admindir/triggers" -type f | \
- xargs -r grep -l "/noawait$" || true)
- if [ -n "$bad_triggers_files" ]; then
- cat <<- MSG
- dpkg: error: Some internal trigger files unexpectedly reference
- packages tagged with "/noawait" while their corresponding
- infodb files doesn't seem to contain any "interest-noawait"
- directive. Aborting the downgrade as those tags are not supported
- by the version you're trying to downgrade to.
- List of internal trigger files that are affected:
- $bad_triggers_files
- MSG
- exit 1
- fi
- }
- downgrade_multiarch_infodb()
- {
- admindir=${DPKG_ADMINDIR:-/var/lib/dpkg}
- pkgadmindir=$admindir/info
- triggersdir=$admindir/triggers
- 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
- file_triggers_pkgs="`sed -n -e 's/^[^ ]\+ \([^:]\+\):[^.]\+$/\1/p' \
- $triggersdir/File| sort -u`"
- if [ -n "$file_triggers_pkgs" ]; then
- cat <<-MSG
- dpkg: error: The triggers database contains arch-qualified package
- names that the old dpkg won't parse. You should get rid of them (or
- downgrade them to a non Multi-Arch: same version) before proceeding
- with dpkg's downgrade.
- List of affected packages:
- $file_triggers_pkgs
- 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
- # (interest|activate)-noawait trigger directives
- 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)
- ;;
- *)
- echo "$0 called with unknown argument '$1'" 1>&2
- exit 1
- ;;
- esac
- #DEBHELPER#
- exit 0
|