blob: 9ff150afccd8221b1d0e57fa6403e12ad0dfd432 [file]
#!/usr/bin/env bash
# --- begin runfiles.bash initialization ---
# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
set -euo pipefail
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
if [[ -f "$0.runfiles_manifest" ]]; then
export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
elif [[ -f "$0.runfiles/MANIFEST" ]]; then
export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
export RUNFILES_DIR="$0.runfiles"
fi
fi
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
"$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
else
echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
exit 1
fi
# --- end runfiles.bash initialization ---
test_script="$1"
shift
with_tmpdir() {
if [[ -z "${tmpdir}" ]]; then
return 0
fi
"$@"
}
set_git_test_exec_path() {
export GIT_TEST_EXEC_PATH="$1"
}
setup_tmpdir_env() {
export TEST_OUTPUT_DIRECTORY="${tmpdir}"
}
setup_tmp_exec_path() {
local tmp_exec_path base exe mergetools_src
tmp_exec_path="$(mktemp -d "${tmpdir}/git-exec-path.XXXXXX")"
# Avoid literal "git-*" when no runfiles are present.
shopt -s nullglob
for exe in "${GIT_TEST_INSTALLED}"/git-*; do
base="$(basename "${exe}")"
if [[ ! -x "${exe}" ]] || should_strip_exec_bit "${exe}"; then
cp "${exe}" "${tmp_exec_path}/${base}"
chmod 0644 "${tmp_exec_path}/${base}"
else
ln -s "${exe}" "${tmp_exec_path}/${base}"
fi
done
shopt -u nullglob
# Link the mergetools directory if it exists
mergetools_src="${GIT_BUILD_DIR}/mergetools"
if [[ -d "${mergetools_src}" ]]; then
ln -s "${mergetools_src}" "${tmp_exec_path}/mergetools"
fi
set_git_test_exec_path "${tmp_exec_path}"
}
is_text_file() {
LC_ALL=C grep -Iq . "$1"
}
has_shebang() {
[[ "$(head -c 2 "$1" 2>/dev/null)" == "#!" ]]
}
should_strip_exec_bit() {
if ! is_text_file "$1"; then
return 1
fi
if has_shebang "$1"; then
return 1
fi
return 0
}
setup_tmp_templates() {
local template_dst template_src
template_src="${GIT_BUILD_DIR}/templates"
if [[ ! -d "${template_src}" ]]; then
return 0
fi
template_dst="$(mktemp -d "${tmpdir}/git-templates.XXXXXX")"
cp -aL "${template_src}/." "${template_dst}/"
export GIT_TEST_TEMPLATE_DIR="${template_dst}"
}
setup_fake_systemd_analyze() {
local fake_bin
fake_bin="$(mktemp -d "${tmpdir}/fake-bin.XXXXXX")"
cat > "${fake_bin}/systemd-analyze" << 'EOF'
#!/bin/sh
# Fake systemd-analyze that always fails to skip the SYSTEMD_ANALYZE prereq
exit 1
EOF
chmod +x "${fake_bin}/systemd-analyze"
export PATH="${fake_bin}:${PATH}"
}
maybe_materialize_test_directory() {
local test_name test_number data_dir tmp_root entry base
test_name="$(basename "${test_script}")"
test_name="${test_name%.sh}"
test_number="${test_name%%-*}"
if [[ ! "${test_number}" =~ ^t[0-9]{4}$ ]]; then
return 0
fi
data_dir="${TEST_DIRECTORY}/${test_number}"
if [[ ! -d "${data_dir}" ]]; then
return 0
fi
if ! find "${data_dir}" -type l -print -quit | grep -q .; then
return 0
fi
tmp_root="$(mktemp -d "${tmpdir:-/tmp}/testdir.XXXXXX")"
for entry in "${TEST_DIRECTORY}"/*; do
base="$(basename "${entry}")"
if [[ "${base}" == "${test_number}" ]]; then
cp -aL "${entry}" "${tmp_root}/${base}"
else
ln -s "${entry}" "${tmp_root}/${base}"
fi
done
TEST_DIRECTORY="${tmp_root}"
}
workspace="${TEST_WORKSPACE:-}"
if [[ -z "${workspace}" ]]; then
echo "TEST_WORKSPACE not set" >&2
exit 1
fi
tmpdir="${TEST_TMPDIR:-}"
with_tmpdir setup_tmpdir_env
git_bin="$(rlocation "${workspace}/git")"
build_opts="$(rlocation "${workspace}/GIT-BUILD-OPTIONS")"
if [[ -z "${git_bin}" || -z "${build_opts}" ]]; then
echo "missing runfiles: git or GIT-BUILD-OPTIONS" >&2
exit 1
fi
export GIT_TEST_INSTALLED
GIT_TEST_INSTALLED="$(dirname "${git_bin}")"
export GIT_BUILD_DIR
GIT_BUILD_DIR="$(dirname "${build_opts}")"
if [[ -z "${GIT_TEST_EXEC_PATH:-}" ]]; then
set_git_test_exec_path "${GIT_BUILD_DIR}"
fi
with_tmpdir setup_tmp_exec_path
with_tmpdir setup_tmp_templates
export TEST_DIRECTORY
TEST_DIRECTORY="$(cd "$(dirname "${test_script}")" && pwd -P)"
maybe_materialize_test_directory
# Skip systemd-analyze verify tests because the generated service files
# reference temporary exec paths that don't exist when verify runs
with_tmpdir setup_fake_systemd_analyze
cd "${TEST_DIRECTORY}"
exec bash "$(basename "${test_script}")" "$@"