模糊选择器¶
模糊选择器使用一个名为 fzf 的工具。它允许你基于终端 UI 和智能模糊查找算法过滤所有任务标签。如果未安装 fzf
二进制文件,则会在首次运行时提示你引导安装。
了解界面¶
当你运行 mach try fuzzy
时,会打开类似于下面所示的界面。这是 fzf。
这里有很多内容需要解释,让我们更仔细地检查每个组件。
A. 与当前键入的查询匹配的任务集。在上图中,仅显示与查询
'linux64 mochibrochr
匹配的任务。B. 已选任务集。这些是当你按下
Enter
键后将要安排的任务。换句话说,如果你想要的任务没有出现在这里,它将不会被安排。C. 形式为
x/y (z)
的计数信息,其中x
是与当前查询匹配的任务数,y
是任务总数,z
是你已选择的任务数。D. 用于输入查询的输入栏。当你键入时,你会注意到
A
中的任务列表会立即开始更新。在上图中,已输入查询'linux64 mochibrochr
。相应地,仅显示与该查询匹配的任务。
一般来说,你首先在左侧找到任务。然后通过选择它们将其移动到右侧。一旦你对你的选择满意,按下 Enter
键将其推送到 try。
选择任务¶
你可以通过几种方式选择任务。如果你感到有点不知所措,最好先使用鼠标开始。
输入一个查询(例如
mochitest
)以稍微减少任务列表。向上滚动并查找你想要的任务。
右键单击
你想要选择的任意多个任务。可选地删除你的查询,返回步骤 1) 并重复。
按下
Enter
键推送(或Esc
键取消)。
注意
依赖项会自动填充,因此你可以选择一个测试任务,而无需选择它所依赖的构建。
当你 右键单击
时,请注意任务标签左侧会出现一个小箭头。这表示任务已选中,并且存在于右侧的预览窗格中。
一旦你对界面稍微熟悉一些,使用键盘在快速选择任务方面会好得多。以下是你需要的主要快捷键
Ctrl-K / Up => Move cursor up
Ctrl-J / Down => Move cursor down
Tab => Select task + move cursor down
Shift-Tab => Select task + move cursor up
Ctrl-A => Select all currently filtered tasks
Ctrl-T => Toggle select all currently filtered tasks
Ctrl-D => De-select all selected tasks (both filtered and not)
Alt-Bspace => Clear query from input bar
Enter => Accept selection and exit
Ctrl-C / Esc => Cancel selection and exit
? => Toggle preview pane
选择任务的过程与使用鼠标时相同。一种特别快速有效的选择任务方法是
Write a precise query => Ctrl-A => Alt-Bspace => Repeat
与之前一样,当你对你的选择满意时,按下 Enter
键,预览窗格中的所有任务都将被推送到 try。如果你改变主意,可以按 Esc
键或 Ctrl-C
键退出界面,而无需推送任何内容。
注意
最初,fzf
会自动选择光标下的任何任务。这对于你只选择单个任务的情况来说是一个方便的功能。当你使用 右键单击
、Tab
或 Ctrl-A
锁定选择时,此功能将被关闭。
编写查询¶
查询由一系列术语组成,每个术语之间用空格分隔。术语通过 AND 运算符逻辑连接。例如
'windows 'mochitest
此查询包含两个术语,相当于说:给我所有同时匹配术语 'windows'
和术语 'mochitest'
的任务。换句话说,此查询匹配所有 Windows mochitest 任务。
每个术语之前的单引号前缀告诉 fzf
使用精确子字符串匹配,因此只有包含字面字符串 windows
和字面字符串 mochitest
的任务才会匹配。
需要注意的另一点是术语的顺序无关紧要,因此 'windows 'mochitest
和 'mochitest 'windows
是等效的。
模糊术语¶
如果术语没有以单引号为前缀,则将其视为模糊术语。这意味着术语中的字符需要按顺序显示,但不需要连续显示。例如,模糊术语 max
将匹配字符串 mozilla firefox
(因为首先有 m
,然后是 a
,最后是 x
),但不会匹配字符串 firefox by mozilla
(因为 x
现在乱序了)。以下是一个不太牵强的例子
wndws mchtst
与上面的查询一样,此查询也将选择所有 Windows mochitest 任务。但它还会选择
test-macosx1014-64-shippable/opt-talos-sessionrestore-many-windows-e10s
这是因为这两个字母序列(wndws
和 mchtst
)都独立地按顺序出现在此字符串中的某个位置(请记住,术语的顺序无关紧要)。
一开始,模糊术语可能看起来不太有用,但它们实际上非常强大!让我们以界面图像中使用的术语 'linux64 mochibrochr
为例。首先,请注意图像中 fzf
如何以绿色突出显示构成匹配的字符。接下来,请注意键入 mochibrochr
如何能快速获得所有 mochitest 浏览器 chrome 任务。模糊术语的强大之处在于,你不需要记住你正在查找的确切任务标签。只需开始键入你认为大致正确的字符,你很可能会看到你正在查找的任务。
术语修饰符¶
以下修饰符可以应用于搜索术语
'word => exact match (line must contain the literal string "word")
^word => exact prefix match (line must start with literal "word")
word$ => exact suffix match (line must end with literal "word")
!word => exact negation match (line must not contain literal "word")
'a | 'b => OR operator (joins two exact match operators together)
例如
^start 'exact | 'other !ignore fuzzy end$
将匹配字符串
starting to bake isn't exactly fun, but pizza is yummy in the end
注意
学习如何编写查询的最佳方法是运行 mach try fuzzy --no-push
并尝试所有这些修饰符!
在命令行上指定查询¶
有时,跳过交互式界面并在命令行上使用 -q/--query
指定查询会更方便。这等效于打开界面然后键入:<query><ctrl-a><enter>
。
例如
# selects all mochitest tasks
$ mach try fuzzy --query "mochitest"
你可以一次传入多个查询,每个查询的结果将组合在一起
# selects all mochitest and reftest tasks
$ mach try fuzzy -q "mochitest" -q "reftest"
如果你希望查询的交集,则可以传入 -x/--and
# selects all windows mochitest tasks
$ mach try fuzzy --and -q "mochitest" -q "windows"
修改预设¶
预设 使运行预定的任务集变得容易。但有时你可能不想完全按原样运行该集,你可能只想将其用作起点,然后根据需要添加或删除任务。这可以通过 -q/--query
或 -i/--interactive
来实现。
以下是一些将任务添加到预设的示例
# selects all perf tasks plus all mochitest-chrome tasks
$ mach try fuzzy --preset perf -q "mochitest-chrome"
# adds tasks to the perf preset interactively
$ mach try fuzzy --preset perf -i
类似地,-x/--and
可用于通过获取两个集合的交集来过滤预设
# limits perf tasks to windows only
$ mach try fuzzy --preset perf -xq "windows"
# limits perf tasks interactively
$ mach try fuzzy --preset perf -xi
Shell 冲突¶
不幸的是,fzf
的查询语言使用了一些字符(即 '
、!
和 $
),这些字符在使用 -q/--query
时可能会干扰你的 shell。以下是一些关于如何在命令行上键入查询的提示。
!
字符通常用于历史记录扩展。如果你不使用此功能,则在命令行上指定查询的最简单方法是禁用它
# bash
$ set +H
$ ./mach try fuzzy -q "'foo !bar"
# zsh
$ setopt no_banghist
$ ./mach try fuzzy -q "'foo !bar"
如果使用bash
,请在~/.bashrc
、~/.bash_profile
或等效文件中添加set +H
。如果使用zsh
,请在~/.zshrc
或等效文件中添加setopt no_banghist
。
如果您不想禁用历史扩展,您可以像这样转义您的查询
# bash
$ ./mach try fuzzy -q $'\'foo !bar'
# zsh
$ ./mach try fuzzy -q "'foo \!bar"
第三种选择是使用-e/--exact
,它反转了'
字符的行为(有关更多详细信息,请参阅其他参数)。使用此标志意味着您无需像以前那样频繁地转义'
字符,并且允许您像这样运行查询
# bash and zsh
$ ./mach try fuzzy -eq 'foo !bar'
此方法仅在您发现几乎总是以'
为前缀(并且很少使用模糊术语)时才有用。否则,一旦您想使用模糊匹配,就会遇到与之前相同的问题。
注意
这三种方法中的所有示例都将选择相同的任务集。
如果您使用fish
shell,则无需转义!
,但需要转义$
# fish
$ ./mach try fuzzy -q "'foo !bar baz\$"
测试路径¶
可以将一个或多个文件或目录的路径指定为位置参数。指定路径时,可供选择的可用任务列表将被筛选,以便只有在指定路径中具有测试的套件才能被选中。值得注意的是,每个套件/平台的仅第一个块出现。当任务被调度时,只有位于指定路径下的测试才会运行。
注意
使用路径时,请注意指定路径下的所有测试将在同一个块中运行。这可能会产生与在生产分支上运行的顺序不同的顺序,并可能产生不同的结果。
对于在每个清单之间重新启动浏览器的套件(如 mochitest),这应该不是一个很大的问题。
路径可用于交互式fzf
窗口或使用-q/--query
参数。例如,运行
$ mach try fuzzy layout/reftests/reftest-sanity -q "!pgo !cov !asan 'linux64"
将生成以下try_task_config.json
{
"env":{
"MOZHARNESS_TEST_PATHS":"{\"reftest\":\"layout/reftests/reftest-sanity\"}"
},
"tasks":[
"test-linux64-qr/debug-reftest-e10s-1",
"test-linux64-qr/opt-reftest-e10s-1",
"test-linux64/debug-reftest-e10s-1",
"test-linux64/debug-reftest-no-accel-e10s-1",
"test-linux64/opt-reftest-e10s-1",
"test-linux64/opt-reftest-no-accel-e10s-1",
]
}
在这些任务内部,reftest harness 只会运行位于layout/reftests/reftest-sanity
下的测试。
其他参数¶
您可能希望使用一些其他命令行参数
-e/--exact
默认情况下,fzf
将术语视为模糊匹配,并且以'
为前缀的术语将其转换为精确匹配。如果传入--exact
,则此行为将被反转。无前缀的术语变为精确,而'
前缀使术语变为模糊。
--full
默认情况下,仅生成目标任务(例如,通常在 mozilla-central 上运行的任务)。传入--full
允许您从所有任务中进行选择。这对于夜间或发布任务等很有用。
-u/--update
将引导的fzf
二进制文件更新到最新版本。
有关完整命令行参数列表,请运行
$ mach try fuzzy --help
有关使用fzf
的更多信息,请运行
$ man fzf