提交前检查

发送到 Fuchsia 的所有更改列表都会在预提交阶段接受一系列静态分析检查。

检查类型

语言检查器

系统会自动针对多种语言运行 Linter,并在 Gerrit 的检查标签页中留下注释。

提交前工具

部分提交前检查工具与语言无关,但可让您对变更列表的质量更有信心。

keep-sorted

keep-sorted 是一种选择启用的 lint 工具,用于强制要求源代码行按字母顺序排列。只需将代码块封装在 keep-sorted startkeep-sorted end 注释中,即可启用此功能。

例如,以下列表的元素必须按字母顺序排列,这是通过预提交检查强制执行的:

a_list = [
    # keep-sorted start
    "bar",
    "baz",
    "foo",
    # keep-sorted end
]

keep-sorted 不受语言限制,支持“#”和“//”注释。

如需查看所有选项,请参阅上游文档

keep-sorted 也会由 fx format-code 强制执行。

IfThisThenThat

IfThisThenThat 是一种检查,可用于确保相互共同更改的文件保持同步。如果一个文件发生更改,系统会发出警告,提示同一更改列表中的其他文件也应随之更改。理想情况下,不应需要此类检查,但在可执行代码需要与配置文件同步时,可能会出现这种情况。

IfThisThenThat 会留下警告,因此不会阻止提交更改列表。

示例

与其他独立运行的预提交检查不同,IFTTT 检查需要手动实现。如需设置新的 IFTTT 检查,请在应一起更新的每个文件中插入特殊注释 // LINT.IfChange// LINT.ThenChange(<other_file_path>)

在以下示例中,针对 test.gomain.rs 实现了 IFTTT 检查。如果只有其中一个文件发生更改,Gerrit 中会显示警告。

test.go

import fmt

// LINT.IfChange

fmt.Println("When this block changes, so must main.rs")

// LINT.ThenChange(main.rs)

main.rs

// LINT.IfChange

println!("When this block changes, so must test.go");

// LINT.ThenChange(test.go)

请注意,对于 Markdown 文件,结构必须封装在注释中,以便 Markdown 忽略该语法。

<!--

// LINT.IfChange

-->

Block to be changed.

<!--

// LINT.ThenChange(test.go)

-->

IfThisThenThat 支持绝对文件路径(以 / 开头的路径)和相对路径(不以 / 开头的路径)。使用 // 可引用签出的顶级目录。

LINT.IfChange() 中,只要以逗号分隔,就可以指定多个文件路径。支持空格和多行定义,例如:

# LINT.IfChange
... some definitions
# LINT.ThenChange(
#    //build/config/foo.gni,
#    //build/script/foo.py,
# )

您可以使用 LINT.IfChange(name) 为每个块命名,并在稍后使用 LINT.IfChange(path/to/file:name) 引用它。E.g.:

# From //build/config/foo.gni

# LINT.IfChange(foo_modes)
foo_modes = [ ... ]
# LINT.ThenChange(//build/scripts/foo.py:foo_modes)

# From //build/scripts/foo.py

# LINT.IfChange(foo_modes)
FOO_MODES = { ... }
# LINT.ThenChange(//build/config/foo.gni:foo_modes)

如果 LINT.IfChange/ThenChange 指令中的文本发生更改,所指向的其他文件也必须相应更改。文件应始终在每个联接的文件中包含 LINT 指令。单向指令意味着一个文件可能会失去与另一个文件的同步。

如果违反了 IfThisThenThat 指令,系统会在 CL 上留下评论:

IfThisThenThat 显示为行注释

警告也会显示在检查标签页中:

“检查”标签页中显示的“IfThisThenThat”

选择停用

如需针对特定更改选择不进行 IfThisThenThat 检查,请在提交消息中添加 NO_IFTTT=<reason>