格式化编译器代码树

2019 年 12 月 23 日 · Mark Rousskov 代表 编译器团队

发生了什么

我们最近合并了两个 PR,它们共同重新格式化了编译器代码树中的所有代码。

第一个 PR 是 #65939,它包含了最初的格式化基础设施。我们目前直接使用 rustfmt,版本固定在 src/stage0.txt 文件中指定。我们预计会根据需要进行更新,否则每个周期更新一次(很可能与 bootstrap 升级同步)。

第二个 PR 重新格式化了代码库的大部分内容,它是 #67540

此更改已与以下 rustfmt 配置一起合并。请注意,此配置可能会发生变化(特别是,merge_derives 将来可能会被移除),但应该相当稳定。您的编辑器应在 rust-lang/rust 仓库中自动选择此配置(它位于根目录的 rustfmt.toml 文件中)。

version = "Two"
use_small_heuristics = "Max"
merge_derives = false

如何使用格式化

您可以使用 x.py fmt 重新格式化仓库,并使用 x.py fmt --check 来验证格式;这些命令目前有点慢。Tidy 目前也会内部运行这两个检查中的后者(x.py fmt --check),但如果无法提高整个代码库的格式化速度,将来可能会改变。

解决冲突

如果您正在处理一个进行中的分支,很可能会遇到合并冲突。以下内容应该能帮助您解决它们

#!/bin/bash

set -xeo pipefail

if [ "$1" = "from-rebase" ] ; then
	git rev-parse HEAD > /tmp/commit
	git rev-parse HEAD >> /tmp/old.shas
	./x.py fmt
	git commit -a --amend --no-edit
	git rev-parse HEAD >> /tmp/new.shas
	git reset --hard $(cat /tmp/commit)
else
	rm -f /tmp/old.shas /tmp/commit /tmp/new.shas
	git rebase 8eb7c58dbb7 --exec '../format.sh from-rebase'
	branch=$(git rev-parse --abbrev-ref HEAD) # get branch name
	git reset --hard 8eb7c58dbb7
	for sha in $(cat /tmp/new.shas); do
		git cherry-pick $sha -Xtheirs
	done
  # put yourself atop the format the world PR
  git rebase -Xtheirs a916ac22b9f7f1f0f7aba0a41a789b3ecd765018
fi

此脚本应保存到您的 Rust checkout 的父目录中的 format.sh 文件中,然后运行 git fetch upstream && ../format.shupstream 应该是 rust-lang/rust 远程仓库的名称。

脚本运行后,您将基于 a916ac22b9f7f 提交。您可能希望接着运行 git rebase -i upstream/master 或类似命令来完成,但上面的脚本至少可以帮您通过格式化 PR 的部分。

这应该可以正确解决大部分冲突,但偶尔如果您修改了 import 相关内容(我遇到的一个常见情况)或其他方面,可能无法完全正确解决。不过,通常这会解决 99% 的问题,其余的可以在之后手动修复。