@@ -11,14 +11,15 @@ jobs:
1111 ci :
1212 runs-on : ubuntu-latest
1313 env :
14- CARGO_LOCKED : " true" # don't mutate Cargo.lock during CI
14+ CARGO_LOCKED : " true"
1515 CARGO_TERM_COLOR : always
16+
1617 steps :
1718 - uses : actions/checkout@v4
1819 with :
1920 fetch-depth : 0
21+ persist-credentials : true
2022
21- # Read MSRV (rust-version) from Cargo.toml
2223 - name : Read MSRV from Cargo.toml
2324 id : msrv
2425 shell : bash
@@ -36,14 +37,12 @@ jobs:
3637 echo "msrv=${RV}" >> "$GITHUB_OUTPUT"
3738 echo "Using MSRV: $RV"
3839
39- # Install MSRV for clippy/tests/package
4040 - name : Install Rust (${{ steps.msrv.outputs.msrv }})
4141 uses : dtolnay/rust-toolchain@v1
4242 with :
4343 toolchain : ${{ steps.msrv.outputs.msrv }}
4444 components : clippy
4545
46- # Pin nightly for rustfmt because unstable_features = true in .rustfmt.toml
4746 - name : Install nightly rustfmt
4847 uses : dtolnay/rust-toolchain@v1
4948 with :
5554 with :
5655 save-if : ${{ github.ref == 'refs/heads/main' }}
5756
58- # Ensure Cargo.lock is present when CARGO_LOCKED=1
5957 - name : Verify lockfile is committed
6058 shell : bash
6159 run : |
6563 exit 1
6664 fi
6765
66+ # ---------- README: regenerate early, normalize, drift handling ----------
67+ - name : Regenerate README via build.rs (MSRV, deterministic)
68+ shell : bash
69+ run : |
70+ set -euo pipefail
71+ export TZ=UTC
72+ export LC_ALL=C.UTF-8
73+ export NO_COLOR=1
74+ export CARGO_TERM_COLOR=never
75+ export SOURCE_DATE_EPOCH=0
76+ cargo +${{ steps.msrv.outputs.msrv }} build --workspace -q || cargo +${{ steps.msrv.outputs.msrv }} build -q
77+
78+ - name : Normalize README (ensure trailing newline) — bash only
79+ if : hashFiles('README.md') != ''
80+ shell : bash
81+ run : |
82+ set -euo pipefail
83+ if [ -f README.md ] && [ -s README.md ]; then
84+ last_byte="$(tail -c1 README.md 2>/dev/null || true)"
85+ if [ "$last_byte" != $'\n' ]; then
86+ printf '\n' >> README.md
87+ fi
88+ fi
89+
90+ - name : README drift report (PR)
91+ if : github.event_name == 'pull_request'
92+ shell : bash
93+ run : |
94+ set -euo pipefail
95+ if git diff --quiet -- README.md; then
96+ echo "README is up to date (PR)."
97+ else
98+ echo "::warning::README differs on PR. Tests will use regenerated content."
99+ git --no-pager diff -- README.md || true
100+ fi
101+
102+ - name : README drift autocommit (main)
103+ if : github.event_name == 'push' && github.ref == 'refs/heads/main'
104+ shell : bash
105+ env :
106+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
107+ run : |
108+ set -euo pipefail
109+ if git diff --quiet -- README.md; then
110+ echo "README is up to date (main)."
111+ exit 0
112+ fi
113+ echo "Auto-committing refreshed README on main..."
114+ git config user.name "github-actions[bot]"
115+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
116+ git add README.md
117+ git commit -m "chore(readme): auto-refresh [skip ci]"
118+ git push
119+ # -----------------------------------------------------------------------
120+
68121 - name : Check formatting (nightly rustfmt)
69122 run : cargo +nightly-2025-08-01 fmt --all -- --check
70123
@@ -88,6 +141,17 @@ jobs:
88141 cargo +${{ steps.msrv.outputs.msrv }} test --workspace --no-fail-fast
89142 fi
90143
144+ # На PR возвращаем README к HEAD, чтобы дерево стало чистым перед упаковкой
145+ - name : Restore README to HEAD on PR (keep tree clean)
146+ if : github.event_name == 'pull_request'
147+ shell : bash
148+ run : |
149+ set -euo pipefail
150+ if ! git diff --quiet -- README.md; then
151+ echo "Restoring README.md to HEAD to keep tree clean on PR..."
152+ git restore --worktree --source=HEAD -- README.md || git checkout -- README.md
153+ fi
154+
91155 - name : Ensure tree is clean before package
92156 shell : bash
93157 run : |
@@ -100,3 +164,4 @@ jobs:
100164
101165 - name : Package (dry-run)
102166 run : cargo +${{ steps.msrv.outputs.msrv }} package --locked
167+
0 commit comments