#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd) ROOT_DIR=$(cd -- "${SCRIPT_DIR}/.." && pwd) DIST_ENV="${ROOT_DIR}/dist/package-info.env" MESA_SRC_DIR="${ROOT_DIR}/work/mesa" REPO_SRC_DIR="${ROOT_DIR}" if [[ ! -f "${DIST_ENV}" ]]; then echo "missing dist metadata: ${DIST_ENV}" >&2 exit 1 fi if [[ ! -d "${MESA_SRC_DIR}/.git" ]]; then echo "missing mesa source checkout: ${MESA_SRC_DIR}" >&2 exit 1 fi if [[ ! -d "${REPO_SRC_DIR}/.git" ]]; then echo "missing repo checkout: ${REPO_SRC_DIR}" >&2 exit 1 fi # shellcheck disable=SC1090 source "${DIST_ENV}" require_env() { local name for name in "$@"; do if [[ -z "${!name:-}" ]]; then echo "missing environment variable: ${name}" >&2 exit 1 fi done } require_env GITEA_SERVER_URL GITEA_REPOSITORY GITEA_TOKEN RELEASE_TAG RELEASES_JSON="$(curl -fsS \ -H "Authorization: token ${GITEA_TOKEN}" \ "${GITEA_SERVER_URL}/api/v1/repos/${GITEA_REPOSITORY}/releases?limit=20")" PREVIOUS_VALUES="$( python3 - "${RELEASES_JSON}" "${RELEASE_TAG}" "${PACKAGE_NAME}" <<'PY' import json import re import sys releases = json.loads(sys.argv[1]) current_tag = sys.argv[2] package_name = sys.argv[3] pattern = re.compile(rf"^{re.escape(package_name)}-.*\+git([0-9a-f]{{12}})-") for release in releases: tag = release.get("tag_name", "") if tag == current_tag: continue match = pattern.match(tag) if match: print(match.group(1)) print(release.get("target_commitish", "")) break PY )" PREVIOUS_MESA_SHA="$(printf '%s\n' "${PREVIOUS_VALUES}" | sed -n '1p')" PREVIOUS_REPO_SHA="$(printf '%s\n' "${PREVIOUS_VALUES}" | sed -n '2p')" CURRENT_REPO_SHA="$(git -C "${REPO_SRC_DIR}" rev-parse HEAD)" REPO_COMMITS_TRUNCATED=0 REPO_COMMIT_LIMIT=20 MESA_COMMITS_TRUNCATED=0 MESA_COMMIT_LIMIT=50 if [[ -n "${PREVIOUS_REPO_SHA}" ]] && git -C "${REPO_SRC_DIR}" rev-parse --verify --quiet "${PREVIOUS_REPO_SHA}^{commit}" >/dev/null; then REPO_COMPARE_RANGE="${PREVIOUS_REPO_SHA}..${CURRENT_REPO_SHA}" mapfile -t REPO_COMMITS < <(git -C "${REPO_SRC_DIR}" log --no-merges --format='- %h %s' "${REPO_COMPARE_RANGE}") REPO_RANGE_LABEL="Repo changes since \`${PREVIOUS_REPO_SHA}\`" else REPO_COMPARE_RANGE="${CURRENT_REPO_SHA}" mapfile -t REPO_COMMITS < <(git -C "${REPO_SRC_DIR}" log --no-merges -n "${REPO_COMMIT_LIMIT}" --format='- %h %s' "${REPO_COMPARE_RANGE}") REPO_RANGE_LABEL="Recent repo commits" fi if (( ${#REPO_COMMITS[@]} > REPO_COMMIT_LIMIT )); then REPO_COMMITS=( "${REPO_COMMITS[@]:0:${REPO_COMMIT_LIMIT}}" ) REPO_COMMITS_TRUNCATED=1 fi if [[ -n "${PREVIOUS_MESA_SHA}" ]] && git -C "${MESA_SRC_DIR}" rev-parse --verify --quiet "${PREVIOUS_MESA_SHA}^{commit}" >/dev/null; then MESA_COMPARE_RANGE="${PREVIOUS_MESA_SHA}..${UPSTREAM_GIT_SHA}" mapfile -t MESA_COMMITS < <(git -C "${MESA_SRC_DIR}" log --no-merges --format='- %h %s' "${MESA_COMPARE_RANGE}") MESA_RANGE_LABEL="Mesa upstream changes since \`${PREVIOUS_MESA_SHA}\`" else MESA_COMPARE_RANGE="${UPSTREAM_GIT_SHA}" mapfile -t MESA_COMMITS < <(git -C "${MESA_SRC_DIR}" log --no-merges -n "${MESA_COMMIT_LIMIT}" --format='- %h %s' "${MESA_COMPARE_RANGE}") MESA_RANGE_LABEL="Recent Mesa upstream commits" fi if (( ${#MESA_COMMITS[@]} > MESA_COMMIT_LIMIT )); then MESA_COMMITS=( "${MESA_COMMITS[@]:0:${MESA_COMMIT_LIMIT}}" ) MESA_COMMITS_TRUNCATED=1 fi { printf '## Repo Changes\n\n' printf -- '- Repo commit: `%s`\n' "${CURRENT_REPO_SHA}" printf -- '- Release tag: `%s`\n\n' "${RELEASE_TAG}" printf '### %s\n\n' "${REPO_RANGE_LABEL}" if (( ${#REPO_COMMITS[@]} == 0 )); then printf -- '- No repo changes found for this release.\n' else printf '%s\n' "${REPO_COMMITS[@]}" fi if (( REPO_COMMITS_TRUNCATED == 1 )); then printf '\n_Repo changes truncated to the first %d commits._\n' "${REPO_COMMIT_LIMIT}" fi printf '\n## Mesa Upstream\n\n' printf -- '- Upstream: `%s`\n' "${UPSTREAM_GIT_URL}" printf -- '- Ref: `%s`\n' "${UPSTREAM_GIT_REF}" printf -- '- Commit: `%s`\n' "${UPSTREAM_GIT_SHA_SHORT}" printf -- '- Package: `%s`\n\n' "${PACKAGE_FILE}" printf '### %s\n\n' "${MESA_RANGE_LABEL}" if (( ${#MESA_COMMITS[@]} == 0 )); then printf -- '- No new upstream commits found for this release.\n' else printf '%s\n' "${MESA_COMMITS[@]}" fi if (( MESA_COMMITS_TRUNCATED == 1 )); then printf '\n_Mesa upstream changes truncated to the first %d commits._\n' "${MESA_COMMIT_LIMIT}" fi } > "${ROOT_DIR}/dist/release-notes.md"