summaryrefslogtreecommitdiffstats
path: root/hooks/eatmydata/extract.sh
blob: 7ffe8e5b77428c8bbff2c46fc88a2a647fa3e96a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/bin/sh

set -eu

if [ "${MMDEBSTRAP_VERBOSITY:-1}" -ge 3 ]; then
	set -x
fi

rootdir="$1"

if [ -e "$rootdir/var/lib/dpkg/arch" ]; then
	chrootarch=$(head -1 "$rootdir/var/lib/dpkg/arch")
else
	chrootarch=$(dpkg --print-architecture)
fi

trusted=
eval "$(apt-config shell trusted Dir::Etc::trusted/f)"
trustedparts=
eval "$(apt-config shell trustedparts Dir::Etc::trustedparts/d)"
tmpfile=$(mktemp --tmpdir="$rootdir/tmp")
cat << END > "$tmpfile"
Apt::Architecture "$chrootarch";
Apt::Architectures "$chrootarch";
Dir "$rootdir";
Dir::Etc::Trusted "$trusted";
Dir::Etc::TrustedParts "$trustedparts";
END
# we run "apt-get download --print-uris" in a temporary directory, to make sure
# that the packages do not already exist in the current directory, or otherwise
# nothing will be printed for them
tmpdir=$(mktemp --directory --tmpdir="$rootdir/tmp")
env --chdir="$tmpdir" APT_CONFIG="$tmpfile" apt-get download --print-uris eatmydata libeatmydata1 \
	| sed -ne "s/^'\([^']\+\)'\s\+\(\S\+\)\s\+\([0-9]\+\)\s\+\(SHA256:[a-f0-9]\+\)$/\1 \2 \3 \4/p" \
	| while read -r uri fname size hash; do
		echo "processing $fname" >&2
		if [ -e "$tmpdir/$fname" ]; then
			echo "$tmpdir/$fname already exists" >&2
			exit 1
		fi
		[ -z "$hash" ] && hash="Checksum-FileSize:$size"
		env --chdir="$tmpdir" APT_CONFIG="$tmpfile" /usr/lib/apt/apt-helper download-file "$uri" "$fname" "$hash"
		case "$fname" in
			eatmydata_*_all.deb)
				mkdir -p "$rootdir/usr/bin"
				dpkg-deb --fsys-tarfile "$tmpdir/$fname" \
					| tar --directory="$rootdir/usr/bin" --strip-components=3 --extract --verbose ./usr/bin/eatmydata
				;;
			libeatmydata1_*_$chrootarch.deb)
				libdir="/usr/lib/$(dpkg-architecture -a "$chrootarch" -q DEB_HOST_MULTIARCH)"
				mkdir -p "$rootdir$libdir"
				dpkg-deb --fsys-tarfile "$tmpdir/$fname" \
					| tar --directory="$rootdir$libdir" --strip-components=4 --extract --verbose --wildcards ".$libdir/libeatmydata.so*"
				;;
			*)
				echo "unexpected filename: $fname" >&2
				exit 1
				;;
		esac
		rm "$tmpdir/$fname"
done
rm "$tmpfile"
rmdir "$tmpdir"

mv "$rootdir/usr/bin/dpkg" "$rootdir/usr/bin/dpkg.distrib"
cat << END > "$rootdir/usr/bin/dpkg"
#!/bin/sh
exec /usr/bin/eatmydata /usr/bin/dpkg.distrib "\$@"
END
chmod +x "$rootdir/usr/bin/dpkg"
cat << END  >> "$rootdir/var/lib/dpkg/diversions"
/usr/bin/dpkg
/usr/bin/dpkg.distrib
:
END