#!/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\n
Log

\`\`\`\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\n
Log

\`\`\`\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}"