From f1f6886d0e559ee230c8daad6c1458bebcd73c58 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 8 Sep 2026 21:43:24 -0700 Subject: [PATCH] fix: rebase on latest master before pushing star history chart (#11240) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: rebase on latest master before pushing star history chart The daily star history workflow git push was rejected with a non-fast-forward error because new commits landed on master between the checkout and the push. Fetch full history (fetch-depth: 0) and rebase the generated commit on top of the latest remote branch before pushing so the workflow no longer fails when master has moved. * fix: retry rebase-and-push to handle concurrent master updates Address review feedback: a one-shot rebase still races if master advances between the rebase and the push. Match the bounded retry loop used by java_release.yml — push first, and on rejection rebase and retry up to five times before failing. * fix: serialize runs and ensure every rebase is followed by a push Address review feedback: - Devin (line 54-55): the old loop rebased after the 5th failed push but never pushed the rebased commit. Restructure so each rebase (attempts 2-5) is followed by a push attempt, with a clear 5-attempt cap. - Greptile: overlapping runs could conflict on the SVG during rebase. Add a concurrency group (cancel-in-progress: true, matching the repo convention) so only one chart regeneration runs at a time. * fix: scope concurrency by ref and guard rebase against transient failures Address review feedback: - Devin (line 16): the global star-history concurrency group let a manual run on another branch cancel an in-flight daily master update. Scope the group by github.ref so only same-branch runs cancel each other. - Greptile (line 58): git pull --rebase runs under the fail-fast shell, so a transient fetch error or conflict aborted the whole step before remaining attempts ran. Guard the rebase so a failure aborts the in-progress rebase and continues to the next attempt instead. --- .github/workflows/star_history.yml | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/.github/workflows/star_history.yml b/.github/workflows/star_history.yml index 9d20d7576..0734b2735 100644 --- a/.github/workflows/star_history.yml +++ b/.github/workflows/star_history.yml @@ -9,6 +9,14 @@ on: permissions: contents: write +concurrency: + # Only one chart regeneration per branch at a time; a newer run on the same + # branch cancels an in-flight one so overlapping runs never conflict on + # note/star_history.svg during rebase. Scoped by ref so a manual run on + # another branch can't cancel the daily master update. + group: star-history-${{ github.ref }} + cancel-in-progress: true + jobs: render: name: Regenerate star history chart @@ -17,6 +25,9 @@ jobs: steps: - name: Checkout uses: actions/checkout@v7 + with: + # Full history so the chart commit can rebase onto a moved master. + fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v7 @@ -43,4 +54,21 @@ jobs: fi git add note/star_history.svg git commit -m "docs: regenerate star history chart" - git push + # Rebase and retry so a concurrent push to master doesn't lose the chart. + for attempt in 1 2 3 4 5; do + if [ "$attempt" -gt 1 ]; then + # Guard the rebase: a transient fetch error or conflict must not + # abort the fail-fast shell before the remaining attempts run. + if ! git pull --rebase origin "$GITHUB_REF_NAME"; then + echo "rebase failed (attempt ${attempt}); aborting and retrying" + git rebase --abort || true + continue + fi + fi + if git push origin HEAD:"$GITHUB_REF_NAME"; then + exit 0 + fi + echo "push rejected (attempt ${attempt}); will rebase and retry" + done + echo "::error::could not push star history chart after retries" + exit 1