Clippy 和 rust-lang/rust 之间同步更改

Clippy 目前使用固定的 nightly 版本构建。

rust-lang/rust 仓库(rustc 所在之处)中,有一个 Clippy 的副本,编译器黑客会不时修改它,以适应编译器不稳定 API 的更改。

我们需要定期将这些更改同步回此仓库,同时在此期间对本仓库所做的更改也需要同步到 rust-lang/rust 仓库。

为了避免淹没 rust-lang/rust 的 PR 队列,如果没有紧急更改,这种双向同步过程会每两周进行一次。这从 Rust 稳定版发布之日开始,然后每隔一周进行。这样我们就保证了我们使这个仓库与最新的编译器 API 保持同步,并且 Clippy 中的每个功能在进入 beta 版之前,都可以在 nightly 版本中使用 2 周。作为参考,首次按照此节奏进行的同步是在 2020-08-27。

以下章节详细描述了此过程。有关 Rust 仓库中 subtree 的一般信息,请参阅rustc-dev-guide

修补 git-subtree 以使其与大型仓库一起工作

目前,git-subtree 中存在一个错误,阻止它与 rust-lang/rust 仓库正常工作。有一个开放的 PR 来修复这个问题,但它已经过时了。在继续以下步骤之前,我们需要手动将该修复程序应用于本地 git-subtree 副本。

您可以从此处获取已修补版本的 git-subtree。将此文件放在 /usr/lib/git-core 下(备份先前的文件),并确保它具有正确的权限

sudo cp --backup /path/to/patched/git-subtree.sh /usr/lib/git-core/git-subtree sudo chmod --reference=/usr/lib/git-core/git-subtree~ /usr/lib/git-core/git-subtree sudo chown --reference=/usr/lib/git-core/git-subtree~ /usr/lib/git-core/git-subtree

注意: 首次运行 git subtree push 时,必须构建缓存。这涉及到完整遍历一次 Clippy 历史记录。为此,您必须增加堆栈限制,您可以使用 ulimit -s 60000 来完成。确保从调用 git subtree 的同一会话中运行 ulimit 命令。

注意: 如果您是 Debian 用户,dash 是脚本默认使用的 shell,而不是 sh。此 shell 的硬编码递归限制设置为 1,000。为了使此过程有效,您需要强制脚本运行 bash。您可以通过编辑 git-subtree 脚本的第一行并将 sh 更改为 bash 来完成此操作。

注意:以下章节假定您已按照定义远程仓库中的说明设置了远程仓库。

执行从 rust-lang/rust 到 Clippy 的同步

以下是同步过程的 TL;DR 版本(以下所有命令都必须在 rust 目录内运行)

  1. 克隆 rust-lang/rust 仓库或确保它是最新的。

  2. 检出最新可用 nightly 的提交。您可以使用 rustup check 获取它。

  3. 将 Clippy 的 rust 副本的更改同步到您的 Clippy 分支

    # Be sure to either use a net-new branch, e.g. `rustup`, or delete the branch beforehand # because changes cannot be fast forwarded and you have to run this command again. git subtree push -P src/tools/clippy clippy-local rustup

    注意: 大多数时候,您必须在 rust-clippy 仓库中创建一个合并提交(这必须在 Clippy 仓库中完成,而不是在 Clippy 的 rust 副本中)

    git fetch upstream # assuming upstream is the rust-lang/rust remote git switch rustup git merge upstream/master --no-ff

    注意:这是允许在 PR 中进行合并提交的少数情况之一。

  4. 通过运行以下命令来提升 Clippy 仓库中的 nightly 版本

    cargo dev sync update_nightly git commit -m "Bump nightly version -> YYYY-MM-DD" rust-toolchain clippy_utils/README.md
  5. 打开一个到 rust-lang/rust-clippy 的 PR 并等待它被合并(为了加速该过程,请在您的 PR 中 ping @rust-lang/clippy 团队和/或在 Zulip 流中询问他们。)

执行从 Clippy 到 rust-lang/rust 的同步

以下所有命令都必须在 rust 目录内运行。

  1. 确保您已检出 rust-lang/rust 的最新 master 分支。
  2. rust-lang/rust-clippy master 分支同步到 Clippy 的 rust 副本
    git switch -c clippy-subtree-update git subtree pull -P src/tools/clippy clippy-upstream master
  3. 打开一个到 rust-lang/rust 的 PR