Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/checkpkg.in
blob: 6904e329d32193ea314c5546bb64073042534ecd (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/bash
# License: Unspecified

shopt -s extglob

. "$(librelib messages)"

usage() {
	print 'Usage: %s [-h]' "${0##*/}"
	print 'Compare a locally built a package with the one in the repositories.'
	echo
	prose 'This should be run from a directory containing a
	       PKGBUILD.  It searches for a locally built package
	       corresponding to the PKGBUILD, and downloads the last
	       version of that package from the pacman repositories.
	       It then compares the list of .so files provided by each
	       version of the package.  It does this for each part of
	       a split package.'
}

if [[ $1 = '-h' ]]; then
	usage
	exit 0
elif [[ $# -gt 0 ]]; then
	usage >&2
	exit 1
fi

# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
	source '/etc/makepkg.conf'
else
	die '/etc/makepkg.conf not found!'
fi

# Source user-specific makepkg.conf overrides
if [[ -r ~/.makepkg.conf ]]; then
	source ~/.makepkg.conf
fi

if [[ ! -f PKGBUILD ]]; then
	error 'This must be run in the directory of a built package.'
	usage >&2
	exit 1
fi

. ./PKGBUILD
if [[ $arch == 'any' ]]; then
	CARCH='any'
fi

STARTDIR=$(pwd)
TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX)

for _pkgname in "${pkgname[@]}"; do
	target_pkgver=$(get_full_version "$_pkgname")
	if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then
		die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver"
	fi

	ln -s "$pkgfile" "$TEMPDIR"

	pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname")

	if [[ $? -ne 0 ]]; then
		die "Couldn't download previous package for %s." "$_pkgname"
	fi

	oldpkg=${pkgurl##*://*/}

	if [[ ${oldpkg##*/} = ${pkgfile##*/} ]]; then
		die "The built package (%s) is the one in the repo right now!" "$_pkgname"
	fi

	if [[ $pkgurl = file://* ]]; then
		ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg"
	elif [[ -f "$PKGDEST/$oldpkg" ]]; then
		ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg"
	elif [[ -f "$STARTDIR/$oldpkg" ]]; then
		ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg"
	else
		curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl"
	fi

	bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
	bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname"

	sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"

	find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old"
	find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
	if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
		msg "Sonames differ in $_pkgname!"
		echo "$diff_output"
	else
		msg "No soname differences for %s." "$_pkgname"
	fi
done

msg "Files saved to %s" "$TEMPDIR"