blob: 4242bc39b1f5590b21b0c59dc59be748fec0a329 [file] [log] [blame]
#!/bin/bash
# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
# Finds the most recent ancestor (first parents only) of the given commit
# (default HEAD) for which the ci workflow passed. There are GitHub actions that
# allegedly do this, but they mostly seem to be broken, unlicensed, or both.
# This approach iterates through commits in the history and makes a separate
# call for each. The alternative is collecting all the successful runs and then
# sorting them. Empirically, the latter was much slower. Fetching them already
# sorted does not appear to be an option as GitHub does not document any known
# sort order. Fetching for multiple specific commits at once is similarly not an
# option.
set -euo pipefail
commitish="${1:-HEAD}"
# TODO(scotttodd): update from ci.yml to new list
# * linux x64 clang
# * linux x64 clang asan
# * pkgci.yml?
declare -r REQUIRED_WORKFLOWS=(ci.yml)
declare -ar QUERY_PARAMS=(
branch=main
event=push
status=success
exclude_pull_requests=true
)
function get_latest_green() {
while read commit; do
local -a query_params=("${QUERY_PARAMS[@]}" "head_sha=${commit}")
# String join on ampersand
local query_string="$(IFS="&" ; echo "${query_params[*]}")"
local all_passing="true"
for workflow in "${REQUIRED_WORKFLOWS[@]}"; do
local successful_run_count="$(\
gh api --jq '.total_count' \
"/repos/iree-org/iree/actions/workflows/${workflow}/runs?${query_string}" \
)"
# Any successful run of the workflow (including reruns) is OK.
if (( successful_run_count==0 )); then
all_passing="false"
break
fi
done
if [[ "${all_passing}" == true ]]; then
echo "${commit}"
return 0
fi
done < <(git rev-list --first-parent "${commitish}")
echo "Failed to find green commit" >&2
return 1
}
get_latest_green