Rust 1.XX (beta) -> ## Rust 1.XX
【免费下载链接】rust-clippyA bunch of lints to catch common mistakes and improve your Rust code. Book: https://doc.rust-lang.org/clippy/项目地址: https://gitcode.com/GitHub_Trending/ru/rust-clippy
- 更新新稳定版本的发布日期行: ```markdown Current beta, release 20YY-MM-DD -> Current stable, released 20YY-MM-DD更新上一稳定版本的发布日期行:
Current stable, released 20YY-MM-DD -> Released 20YY-MM-DD
变更日志更新:为每次 Rust 发布撰写 CHANGELOG
何时更新
针对新 Rust 发布的 changelog 更新,理想情况下应在即将到来的稳定版发布前一周完成(发布日期见 Rust Forge)。多数时候只需为 Rust 的小版本更新 changelog,Clippy 改动被包含进 patch 版本的情况非常罕见。不过,错别字及其他小修小补随时欢迎提交。
更新步骤
第 1 步:找到相关的 Clippy commits
每个 Rust 版本都携带自己的 Clippy 版本(作为 subtree 位于 Rust 仓库的tools目录)。根据更新目标选择对应的 commit 来源:
- 为即将到来的稳定版写发布说明:checkout 当前 Rust
beta分支上的 Clippy commit; - 为即将到来的 beta 版本写发布说明:checkout 当前 Rust
main上的 Clippy commit; - 为过去的稳定版补写发布说明:checkout 对应稳定版的 release tag。
通常要写的是即将到来的稳定版的 changelog,但需先确认 Rust 仓库中beta分支已经切出。在rust-lang/rustcheckout(大多数时候在upstream/beta分支)中查找 commit hash:
git log --oneline -- src/tools/clippy/ | grep -o "Merge commit '[a-f0-9]*' into .*" | head -1 | sed -e "s/Merge commit '\([a-f0-9]*\)' into .*/\1/g"第 2 步:抓取这两个 commit 之间的 PR
拿到正确的 commit 区间后运行:
util/fetch_prs_between.sh start_commit end_commit > changes.txt其中end_commit是上一步得到的 commit hash,start_commit是当前 CHANGELOG.md 中记录的 commit hash。然后用编辑器打开changes.txt。
第 3 步:撰写最终 changelog
脚本会导出所有相关 PR 并过滤掉大部分无关 PR,但建议再手动清理一遍,挑选有价值的 PR;不确定的 PR 可以留在文件中供 review 时讨论。之后逐条把 PR 的changelog:内容移入 CHANGELOG.md,措辞可自行润色但要保持连贯。各节顺序大致如下:
### New Lints * Added [`LINT`] to `GROUP` ### Moves and Deprecations * Moved [`LINT`] to `GROUP` (From `GROUP`, now LEVEL-by-default) * Renamed `LINT` to [`LINT`] ### Enhancements ### False Positive Fixes ### ICE Fixes ### Documentation Improvements ### Others同时务必更新文件顶部的Unreleased/Beta/In Rust Nightly区段中的 commit 区间,并新增Rust <version>区段,注明发布日期与 PR 区间。
第 4 步:纳入 beta-accepted 的 PR
查找带 [beta-accepted] 标签的 PR,确保它们也被写进 changelog。若可行,在 changelog PR 合并后移除这些标签。注意:其中部分 PR 可能被 backport 到上一个beta,这类 PR 必须写进上一个版本的 changelog。
第 5 步:更新#[clippy::version]属性
核对新增 lint 的#[clippy::version]属性是否为正确的版本号。针对 "New Lints" 一节中的每个 lint 运行:
grep -rB1 "pub $LINT_NAME" .显示的版本应与本次 changelog 对应的发布版本一致;不一致则更新为该 changelog 版本。
Backport:紧急修复回流 beta
某些情况下需要把改动 backport 到 Clippy 的 beta 版本。Backport 在 Clippy 中很罕见,必须经 Clippy 团队批准。典型场景包括:修复了关键的 ICE(编译器内部错误),或某个 lint 损坏到必须在进入 stable 前被禁用。
若你认为某个 PR 需要 backport,可为其打上
beta-nominated标签。这必须在发布前一周的周四之前完成。
筛选待 backport 的 PR
先通过beta-nominated标签过滤器找出所有被标记的 PR,然后逐个审视,重点检查三件事:
- 这个修复值得 backport 吗?这比较主观。ICE 修复通常值得;把 lint 移到更低的组(从 warn 默认改为 allow)通常也值得;单独的 FP(误报)修复通常不值得(但如果本来就要 backport,FP 修复也可以顺带包含)。改动量大的 PR 需要更谨慎地评估。
- 该 PR 修复的问题是否已经在
beta中?如果问题还没进入 Rust 仓库的beta分支,且修复已同步到 Rust 仓库,则无需 backport(它会与引入问题的 commit 一起进入 stable)。若修复 PR 尚未同步,则需要在下一个 backport 周期把它"backport"到 Rustmaster或beta。 - 确保修复已在
master上,再移植到beta。修复必须先同步到 Rustmaster分支,否则下一个beta会再次缺少该修复。若确需紧急 backport 而修复还未进master,应先做一次小规模的周期外同步(该同步的改动会直接进入beta,未经 nightly 充分测试,因此必须保持精简)。
Backport 操作步骤
所有命令在 Rust 仓库克隆中执行(先按 release.md 的 "Defining Remotes" 一节定义clippy-upstreamremote):
git fetch clippy-upstream master git switch beta git fetch upstream git reset --hard upstream/betaPR 通过 GitHub merge queue 合并后,会以<PR title> (#<PR number>)的形式关闭。找到该 commit 的<sha1>,在Rust 仓库的克隆中执行:
git cherry-pick -m 1 `<sha1>`对所有需要 backport 的 PR 重复此操作。随后向 Rust 仓库的beta分支(注意不是master)打开 PR,描述模板如下:
[beta] Clippy backports r? @Mark-Simulacrum Backports: - <Link to the Clippy PR> - ... <Short summary of what is backported and why>Mark 来自 release 团队,最终需要他合并此 PR 才能切出新的beta版本,因此要 tag 他。最后列出所有 backport 并简要说明内容与理由。PR 被 backport 到 Rustbeta后,为其打上beta-accepted标签,该标签会在撰写 changelog 时被收集。
周边基础设施:本书维护与性能基准
维护 Clippy Book
你现在正在读的这本书(Clippy book)由 Markdown 编写、mdBook 生成。本地安装 mdBook 后可构建、测试并在本地 serve 以预览改动:
cargo install --locked mdbook在仓库顶层运行mdbook serve book --open启动本地服务器(默认http://localhost:3000),对 book/src 下 Markdown 文件的改动会自动热更新。细节见 book.md。
用 Lintcheck 做性能基准
Clippy 的性能基准直接复用 lintcheck 工具:只需加上--perf标志,Lintcheck 就变成一个简单而强大的基准工具。它依赖系统安装perf工具(底层由 perf 负责 profiling),每次基准会生成一个perf.data文件存放在target/lintcheck/sources/<package>-<version>目录,对应目录中的那个 crate。Lintcheck 使用-g标志,因此可以获取栈回溯,配合 flamegraph 类工具做更丰富的分析。目前只统计指令数这一指标,因为它是可复现性最好的度量,rustc-perf 也将其作为核心指标。
基准某个 PR 时,先切到该 PR 分支跑一次cargo lintcheck --perf,再回到与 master 的最近公共 commit 跑第二次,最后用perf diff对比两次结果:
git fetch upstream pull/<PR_NUMBER>/head:<BRANCH_NAME> git switch BRANCHNAME # 基准 cargo lintcheck --perf # 找到最近公共 commit 并 checkout LAST_COMMIT=$(git log BRANCHNAME..master --oneline | tail -1 | cut -c 1-11) git switch -c temporary $LAST_COMMIT # 现在位于 master 上 # 基准 cargo lintcheck --perf perf diff ./target/lintcheck/sources/CRATE/perf.data ./target/lintcheck/sources/CRATE/perf.data.0【免费下载链接】rust-clippyA bunch of lints to catch common mistakes and improve your Rust code. Book: https://doc.rust-lang.org/clippy/项目地址: https://gitcode.com/GitHub_Trending/ru/rust-clippy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考