傳送至 Fuchsia 的所有變更清單都會在預先提交時,經過一系列靜態分析檢查。
檢查類型
語言檢查工具
系統會自動為各種語言執行 Lint,並在 Gerrit 的「Checks」分頁中留下註解。
預先提交工具
部分預先提交檢查工具與語言無關,但可提高對變更清單品質的信心。
keep-sorted
keep-sorted 是選擇加入的 Lint 工具,可確保原始碼行維持字母順序。如要啟用這項功能,請將程式碼區塊包裝在 keep-sorted
start 和 keep-sorted
end 註解中。
舉例來說,下列清單的元素必須依字母順序排列,且預先提交檢查會強制執行這項規定:
a_list = [
# keep-sorted start
"bar",
"baz",
"foo",
# keep-sorted end
]
keep-sorted 與語言無關,並支援「#」和「//」註解。
如要瞭解所有選項,請參閱上游文件。
fx format-code 也會強制執行 keep-sorted。
IfThisThenThat
IfThisThenThat 是一項檢查,可確保相互共同變更的檔案保持同步。如果其中一個檔案發生變更,系統會發出警告,指出其他檔案也應在同一個變更清單中變更。理想情況下,這類檢查應該是不必要的,但當可執行程式碼需要與設定檔同步時,可能會出現這種情況。
IfThisThenThat 會留下警告,因此不會封鎖變更清單提交作業。
範例
與其他獨立運作的預先提交檢查不同,IFTTT 檢查需要手動實作。如要設定新的 IFTTT 檢查,請在應一併更新的每個檔案中插入特殊註解 // LINT.IfChange 和 // LINT.ThenChange(<other_file_path>)。
在下列範例中,系統會為 test.go 和 main.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 檢查,請在提交訊息中加入 NO_IFTTT=<reason>。