77 type : boolean
88 default : true
99
10+ # даём боту право писать в репо; без этого пуш/PR не взлетит
11+ permissions :
12+ contents : write
13+ pull-requests : write
14+
1015jobs :
1116 ci :
1217 runs-on : ubuntu-latest
1823 - uses : actions/checkout@v4
1924 with :
2025 fetch-depth : 0
21- persist-credentials : true
26+ persist-credentials : true # оставляем токен в origin, чтобы git push работал
2227
2328 - name : Read MSRV from Cargo.toml
2429 id : msrv
4651 - name : Install nightly rustfmt
4752 uses : dtolnay/rust-toolchain@v1
4853 with :
49- toolchain : nightly-2025-08-01
54+ toolchain : nightly
5055 components : rustfmt
5156
5257 - name : Cache cargo
@@ -101,8 +106,9 @@ jobs:
101106 echo "README is up to date (PR)."
102107 fi
103108
104- - name : README autocommit on main
109+ - name : README autocommit on main (push or PR)
105110 if : github.event_name == 'push' && github.ref == 'refs/heads/main'
111+ id : readme_update
106112 shell : bash
107113 env :
108114 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
@@ -116,37 +122,60 @@ jobs:
116122 fi
117123 if [ "$need_update" -eq 0 ]; then
118124 echo "README is up to date (main)."
125+ echo "updated=false" >> "$GITHUB_OUTPUT"
119126 exit 0
120127 fi
121- echo "Updating README on main and pushing..."
128+
129+ echo "Updating README working tree..."
130+ cp -f "$README_CANDIDATE" README.md
131+ git add README.md
132+
122133 git config user.name "github-actions[bot]"
123134 git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
124135 git config --global --add safe.directory "$GITHUB_WORKSPACE"
125- cp -f "$README_CANDIDATE" README.md
126- git add README.md
127- git commit -m "chore(readme): auto-refresh [skip ci]"
128- git pull --rebase --autostash origin main || true
129- git push origin HEAD:main || {
130- git pull --rebase --autostash origin main
131- git push origin HEAD:main
132- }
133- git fetch origin main
134- git reset --hard origin/main
135- git clean -fdx
136136
137- - name : Ensure tree is clean before package
138- shell : bash
139- run : |
140- set -euo pipefail
141- if ! git diff --quiet; then
142- echo "Working tree is dirty:"
143- git status --porcelain
144- exit 1
137+ git commit -m "chore(readme): auto-refresh [skip ci]" || true
138+
139+ set +e
140+ git pull --rebase --autostash origin main
141+ git push origin HEAD:main
142+ rc=$?
143+ set -e
144+
145+ if [ $rc -eq 0 ]; then
146+ echo "Push to main succeeded."
147+ echo "updated=true" >> "$GITHUB_OUTPUT"
148+ # вычистим дерево, чтобы дальше всё было чисто
149+ git fetch origin main
150+ git reset --hard origin/main
151+ git clean -fdx
152+ exit 0
145153 fi
154+
155+ echo "Push to main denied (likely branch protection). Preparing PR..."
156+ echo "updated=true" >> "$GITHUB_OUTPUT"
157+ # создаём ветку для PR
158+ BR="ci/readme-auto-refresh"
159+ git switch -c "$BR" || git checkout -b "$BR"
160+ # коммит уже есть, просто запушим ветку
161+ git push -u origin "$BR"
162+
163+ - name : Create pull request for README (fallback)
164+ if : steps.readme_update.outputs.updated == 'true' && github.event_name == 'push' && github.ref == 'refs/heads/main'
165+ uses : peter-evans/create-pull-request@v6
166+ with :
167+ token : ${{ secrets.GITHUB_TOKEN }}
168+ branch : ci/readme-auto-refresh
169+ title : " chore(readme): auto-refresh"
170+ body : |
171+ Автоматически сгенерированный апдейт README. Прямой пуш в `main` запрещён политикой, поэтому открыт PR.
172+ commit-message : " chore(readme): auto-refresh [skip ci]"
173+ labels : ci, chore
174+ delete-branch : true
146175 # ---------- end README handling ----------
147176
148177 - name : Check formatting (nightly rustfmt)
149- run : cargo +nightly-2025-08-01 fmt --all -- --check
178+ run : cargo +nightly fmt --all -- --check
150179
151180 - name : Clippy (MSRV)
152181 shell : bash
@@ -168,6 +197,16 @@ jobs:
168197 cargo +${{ steps.msrv.outputs.msrv }} test --workspace --no-fail-fast
169198 fi
170199
200+ - name : Ensure tree is clean before package
201+ shell : bash
202+ run : |
203+ set -euo pipefail
204+ if ! git diff --quiet; then
205+ echo "Working tree is dirty:"
206+ git status --porcelain
207+ exit 1
208+ fi
209+
171210 - name : Package (dry-run)
172211 run : cargo +${{ steps.msrv.outputs.msrv }} package --locked
173212
0 commit comments