#!/bin/sh

# First, take two libraries, and symbol-diff them.
# On the long-term, also detect when deb files are passed.

function error_temp_creation ()
{
    echo "ERROR: Unable to create a temporary $1 in $2"
    exit 1
}

function error_dpkg ()
{
    echo "ERROR: Failure while running dpkg $1 $2"
}


function compare_so_files ()
{
    #echo "Compare: $1"
    #echo "With:    $2"

    SA=$(mktemp) || error_temp_creation "file" "compare_so_files"
    SB=$(mktemp) || error_temp_creation "file" "compare_so_files"

    nm -D $1 | cut -b 10- | sort -k 2 > $SA
    nm -D $2 | cut -b 10- | sort -k 2 > $SB

    diff -u $SA $SB | tail -n +3 | sed -e 's/^/    /'

    rm $SA $SB
}



function compare_deb_files ()
{
    A=$(tempfile --prefix "debc-") || error_temp_creation "file" "compare_deb_files"
    B=$(tempfile --prefix "debc-") || error_temp_creation "file" "compare_deb_files"

    # TODO: Catch dpkg errors here
    dpkg --contents $1 | awk '{print $6}' > $A
    dpkg --contents $2 | awk '{print $6}' > $B

    echo "File list diff:"
    echo "---------------"
    diff -u $A $B

    echo "Symbol diff:"
    echo "------------"

    C=$(mktemp -d) || error_temp_creation "directory" "compare_deb_files"
    D=$(mktemp -d) || error_temp_creation "directory" "compare_deb_files"

    dpkg -x $1 $C
    dpkg -x $2 $D

    for i in $(< $A); do
	case $i in
	    *.so.[0-9.]*)
		if [ ! -L $C/$i ]; then
		    #echo "Found library: $i"
		    echo "  $i:"
		    compare_so_files "$C/$i" "$D/$i"
		fi
	esac
    done

    rm $A $B
    rm -rf $C $D
}


function usage()
{
    echo "Usage: $0 package-1.2/libfoo.so.1 package-1.3/libfoo.so.1"
    echo "       (Will later support diffing deb's directly.)"
}


# Check parameters
if [ $# -ne 2 ]; then
    echo "ERROR: 2 arguments expected"
    usage
    exit 1
fi

# TODO: Check whether both are libs, or both are debs, fail otherwise.
# At the moment, assume both are libs.

compare_deb_files $1 $2
