格式化编译器树

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

发生了什么

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

第一个 PR,#65939,包含了初始的格式化基础设施。我们目前直接使用 rustfmt,并锁定在 src/stage0.txt 中指定的版本。我们期望根据需要更新它,否则每个周期更新一次(很可能与引导程序更新同时进行)。

第二个 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 检出目录的父目录中的 format.sh,然后运行 git fetch upstream && ../format.shupstream 应该是 rust-lang/rust 远程仓库的名称。

脚本运行后,您将基于 a916ac22b9f7f 提交。您可能需要运行 git rebase -i upstream/master 之类的命令来完成,但上面的脚本至少可以让您通过格式化 PR。

这应该可以正确地解决大部分冲突,但偶尔如果您在导入中编辑了某些内容(我经常遇到的情况)或以其他方式进行编辑,则无法完全正确解决。不过,通常这将解决 99% 的问题,其余的可以在之后手动修复。