git/t/interop/interop-lib.sh

93 lines
1.8 KiB
Bash

# Interoperability testing framework. Each script should source
# this after setting default $VERSION_A and $VERSION_B variables.
. ../../GIT-BUILD-OPTIONS
INTEROP_ROOT=$(pwd)
BUILD_ROOT=$INTEROP_ROOT/build
build_version () {
if test -z "$1"
then
echo >&2 "error: test script did not set default versions"
return 1
fi
if test "$1" = "."
then
git rev-parse --show-toplevel
return 0
fi
sha1=$(git rev-parse "$1^{tree}") || return 1
dir=$BUILD_ROOT/$sha1
if test -e "$dir/.built"
then
echo "$dir"
return 0
fi
echo >&2 "==> Building $1..."
mkdir -p "$dir" || return 1
(cd "$(git rev-parse --show-cdup)" && git archive --format=tar "$sha1") |
(cd "$dir" && tar x) ||
return 1
for config in config.mak config.mak.autogen config.status
do
if test -e "$INTEROP_ROOT/../../$config"
then
cp "$INTEROP_ROOT/../../$config" "$dir/" || return 1
fi
done
(
cd "$dir" &&
make $GIT_INTEROP_MAKE_OPTS >&2 &&
touch .built
) || return 1
echo "$dir"
}
# Old versions of git don't have bin-wrappers, so let's give a rough emulation.
wrap_git () {
write_script "$1" <<-EOF
GIT_EXEC_PATH="$2"
export GIT_EXEC_PATH
PATH="$2:\$PATH"
export GIT_EXEC_PATH
exec git "\$@"
EOF
}
generate_wrappers () {
mkdir -p .bin &&
wrap_git .bin/git.a "$DIR_A" &&
wrap_git .bin/git.b "$DIR_B" &&
write_script .bin/git <<-\EOF &&
echo >&2 fatal: test tried to run generic git: $*
exit 1
EOF
PATH=$(pwd)/.bin:$PATH
}
VERSION_A=${GIT_TEST_VERSION_A:-$VERSION_A}
VERSION_B=${GIT_TEST_VERSION_B:-$VERSION_B}
if ! DIR_A=$(build_version "$VERSION_A") ||
! DIR_B=$(build_version "$VERSION_B")
then
echo >&2 "fatal: unable to build git versions"
exit 1
fi
TEST_DIRECTORY=$INTEROP_ROOT/..
TEST_OUTPUT_DIRECTORY=$INTEROP_ROOT
TEST_NO_CREATE_REPO=t
. "$TEST_DIRECTORY"/test-lib.sh
generate_wrappers || die "unable to set up interop test environment"