#!/bin/sh

# ===========
# = Globals =
# ===========

SCRIPTS_DIR=$(dirname "$0")
cd "$SCRIPTS_DIR/.."
BASE_DIR="$(pwd)"
BUILD_DIR="$BASE_DIR/build"
ICHECK_DIR="$BASE_DIR/icheck"

CMPVERSION="0.9.6"
# XXX: updates here require update in doc/VERSION.md
FILES="src/include/kdbmeta.h src/include/kdbease.h src/include/kdbmerge.h src/include/kdbmodule.h src/include/kdbnotification.h src/include/kdbplugin.h src/plugins/doc/doc.h src/include/kdbopts.h"

# =============
# = Functions =
# =============

init_build() {
	rm -rf "$BUILD_DIR"
	mkdir "$BUILD_DIR"
}

init_cmake() {
	cd "$BUILD_DIR"
	cmake "$BASE_DIR"
	cd "$BASE_DIR"
}

canonify() {
	init_build
	init_cmake
	icheck --canonify -I"$BASE_DIR/src/include" -I"$BUILD_DIR/src/include" ${FILES} -o "$1"
}

# Remove old dir
rm -rf "$ICHECK_DIR"
mkdir "$ICHECK_DIR"

# Check out current version

canonify "$ICHECK_DIR/new_interface.h"

while IFS= read line || test -n "$line"; do
	printf '%s' "$line" | grep -q '^\s*//' && continue
	printf 'Remove entry matching “%s” from new interface\n' "$line"
	printf 'H\ng/^.*%s.*$/d\nw\n' "$line" | ed -s "$ICHECK_DIR/new_interface.h"
done < "tests/icheck.suppression"

# Compare against the version we want to be ABI/API compatible with
git checkout $CMPVERSION
canonify "$ICHECK_DIR/old_interface.h"

icheck --compare "$ICHECK_DIR/old_interface.h" "$ICHECK_DIR/new_interface.h"
if [ $? != "0" ]; then
	echo "There are some incompatible changes in the API (public header files)."
	echo "Please make sure that all changes are compatible with previous APIs"
	echo "or suppressed via tests/icheck.suppression."
	exit 1
fi
