|  | #!/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 |