#!/usr/bin/env bash
range="$1"
cmd="$2"
curbranch=$(git rev-parse --abbrev-ref HEAD)
rev=${3:-${curbranch}}
sit=$(which sit)
if [ -z "${range}" ] || [ -z "${cmd}" ]; then
echo "Usage: $0 COMMIT_RANGE COMMAND [REV]"
exit 1
fi
if [ -z "${sit}" ]; then
echo "sit not found"
exit 1
fi
target_rev=$(git rev-parse "${range}" | head -1)
report_branch="ci-$(date +'%s')"
sit_path=$(${sit} path)
files=$(git diff --name-only ${range} | sort)
failed_patch () {
mkdir -p "${sit_path}/items/$1"
tmp_dir=$(mktemp -d)
pushd $(pwd) >/dev/null
cd "${tmpdir}"
echo $2 > record
echo "Failed to apply merge request $2 against revision $4" > text
${sit} -r ${sit_path} record -t Commented,MergeRequestVerificationFailed $1 text record || exit 2
popd >/dev/null
rm -rf ${tmp_dir}
}
failed_ci () {
mkdir -p "${sit_path}/items/$1"
tmp_dir=$(mktemp -d)
pushd $(pwd) >/dev/null
cd "${tmpdir}"
echo $2 > record
printf "Merge request $2 failed against revision $3\nLog
\`\`\`\n$4\`\`\`\n
" > text
${sit} -r ${sit_path} record -t Commented,MergeRequestVerificationFailed $1 text record || exit 2
popd >/dev/null
rm -rf ${tmp_dir}
}
passed_ci () {
mkdir -p "${sit_path}/items/$1"
tmp_dir=$(mktemp -d)
pushd $(pwd) >/dev/null
cd "${tmpdir}"
echo $2 > record
printf "Merge request $2 passed against revision $3\nLog
\`\`\`\n$4\`\`\`\n
" > text
${sit} -r ${sit_path} record -t Commented,MergeRequestVerificationSucceeded $1 text record || exit 2
popd >/dev/null
rm -rf ${tmp_dir}
}
check_mr () {
git_regex="^\.sit/items/$1/$2/git/.+\.patch"
git checkout -b "${report_branch}-${item}-${mr}" "${rev}"
# Apply patches
for file in ${files}; do
if [[ "${file}" =~ ${git_regex} ]]; then
git show "${target_rev}":${file} | git am || (git am --abort; failed_patch $1 $2 "${file}" "${rev}")
fi
done
# Check
output=$(${cmd} | tee /dev/tty)
result=$?
if [ $result -eq 0 ]; then
passed_ci $1 $2 "${rev}" "${output}"
else
failed_ci $1 $2 "${rev}" "${output}"
fi
# Clean up
git reset --hard
git checkout "${curbranch}"
git branch -D "${report_branch}-${item}-${mr}"
}
reported_items=""
for file in ${files}; do
if [[ "${file}" =~ ^\.sit/items/.+/.+/\.type/MergeRequested$ ]]; then
item=$(echo ${file} | sed -E "s/\.sit\/items\/([^\/]+)\/.*/\1/")
mr=$(echo ${file} | sed -E "s/\.sit\/items\/[^\/]+\/([^\/]+)\/.*/\1/")
echo "Found merge request ${item}/${mr}" 1>&2
check_mr "${item}" "${mr}"
reported_items="${reported_items} ${item}"
fi
done
git checkout -b "${report_branch}"
for report in ${reported_items}; do
git add ${sit_path}/items/${report}
done
git commit -m "CI report"
git checkout "${curbranch}"
# This branch can be now sent to the repository via inbox
# or any other means
echo "${report_branch}"