#!/bin/sh -ef
export LC_ALL=C

rpm1="$(readlink -ev "$1")"
rpm2="$(readlink -ev "$2")"
set -- "$rpm1" "$rpm2"
b1="${1##*/}"; bb1="${b1%.*.rpm}"
b2="${2##*/}"; bb2="${b2%.*.rpm}"

. tmpdir.sh
cd "$TMPDIR"

rpmsoname "$1" >so1; sort -t$'\t' -u -k2 -o so1 -u so1
rpmsoname "$2" >so2; sort -t$'\t' -u -k2 -o so2 -u so2
join -t$'\t' -j 2 so1 so2 >so3
join -t$'\t' -j 2 -v1 so1 so2 >so3.1
join -t$'\t' -j 2 -v2 so1 so2 >so3.2

if [ -s so3.1 ]; then	echo "	sonames only in $b1 [1]:"; cat so3.1; echo; fi
if [ -s so3.2 ]; then	echo "	sonames only in $b2 [2]:"; cat so3.2; echo; fi
if [ -s so3 ];	then	echo "	common sonames:"; cat so3; echo;
		else	echo "	no common sonames"; exit; fi

rpmelfsym "$1" >sym1; sort -u sym1 -o sym1
rpmelfsym "$2" >sym2; sort -u sym2 -o sym2
cut -f1,2 so3 |sort -t$'\t' -u -k2 |join -t$'\t' -12 -21 -o '1.1 2.2 2.3' - sym1 |awk -F'\t' '$2~/[DTW]/' |sort -u >def1
cut -f1,3 so3 |sort -t$'\t' -u -k2 |join -t$'\t' -12 -21 -o '1.1 2.2 2.3' - sym2 |awk -F'\t' '$2~/[DTW]/' |sort -u >def2
mkdir "$bb1" "$bb2"
cut -f1 so3 |sort -u |while read -r soname; do
	echo "$soname" |join -t$'\t' -o '2.3 2.2' - def1 |sort -u >"$bb1/$soname"; touch -r "$1" "$bb1/$soname"
	echo "$soname" |join -t$'\t' -o '2.3 2.2' - def2 |sort -u >"$bb2/$soname"; touch -r "$2" "$bb2/$soname"
	if diff -U1 "$bb1/$soname" "$bb2/$soname"; then
		echo "$soname definitions unchanged"; echo
		continue
	fi
	echo
	comm -23 "$bb1/$soname" "$bb2/$soname" >minus
	comm -13 "$bb1/$soname" "$bb2/$soname" >plus
	join -t$'\t' -v1 minus plus >removed
	join -t$'\t' -v2 minus plus >added
	join -t$'\t' minus plus >changed
	[ -s removed ] && { echo "	$(wc -l <removed) symbols removed"; awk -F'\t' '{print$2,$1}' removed |sort -u; echo; }
	[ -s added ] && { echo "	$(wc -l <added) symbols added"; awk -F'\t' '{print$2,$1}' added |sort -u; echo; }
	[ -s changed ] && { echo "	$(wc -l <changed) symbols changed"; awk -F'\t' '{print$2,$3,$1}' changed |sort -u; echo; }
	if [ -s added ]; then 
		echo "# template for $soname version script"
		echo "${bb2%-*} {" |sed 's/-.*-/_/;s/-/_/;s/.*/\U&/'
		echo "    global:"
		cut -f1 added |sort -u |sed 's/^/\t/;s/$/;/'
		echo "};"
		echo
	fi
done

echo vim\:ft=diff
