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