模糊选择器

模糊选择器使用一个名为 fzf 的工具。它允许你基于终端 UI 和智能模糊查找算法过滤所有任务标签。如果未安装 fzf 二进制文件,则会在首次运行时提示你引导安装。

了解界面

当你运行 mach try fuzzy 时,会打开类似于下面所示的界面。这是 fzf

../../../_images/fzf.png

这里有很多内容需要解释,让我们更仔细地检查每个组件。

A. 与当前键入的查询匹配的任务集。在上图中,仅显示与查询 'linux64 mochibrochr 匹配的任务。

B. 已选任务集。这些是当你按下 Enter 键后将要安排的任务。换句话说,如果你想要的任务没有出现在这里,它将不会被安排

C. 形式为 x/y (z) 的计数信息,其中 x 是与当前查询匹配的任务数,y 是任务总数,z 是你已选择的任务数。

D. 用于输入查询的输入栏。当你键入时,你会注意到 A 中的任务列表会立即开始更新。在上图中,已输入查询 'linux64 mochibrochr。相应地,仅显示与该查询匹配的任务。

一般来说,你首先在左侧找到任务。然后通过选择它们将其移动到右侧。一旦你对你的选择满意,按下 Enter 键将其推送到 try。

选择任务

你可以通过几种方式选择任务。如果你感到有点不知所措,最好先使用鼠标开始。

  1. 输入一个查询(例如 mochitest)以稍微减少任务列表。

  2. 向上滚动并查找你想要的任务。

  3. 右键单击 你想要选择的任意多个任务。

  4. 可选地删除你的查询,返回步骤 1) 并重复。

  5. 按下 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 会自动选择光标下的任何任务。这对于你只选择单个任务的情况来说是一个方便的功能。当你使用 右键单击TabCtrl-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

这是因为这两个字母序列(wndwsmchtst)都独立地按顺序出现在此字符串中的某个位置(请记住,术语的顺序无关紧要)。

一开始,模糊术语可能看起来不太有用,但它们实际上非常强大!让我们以界面图像中使用的术语 '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下的测试。

测试标签

可以将添加测试标签指定为位置参数。指定标签时,可供选择的可用任务列表将被筛选,以便只有在具有使用特定标签注释的测试的套件才能被选中。值得注意的是,每个套件/平台的仅第一个块出现。当任务被调度时,只有清单中具有匹配标签的测试才会运行。

注意

使用标签时,请注意所有匹配标签的测试将在同一个块中运行。这可能会产生与在生产分支上运行的顺序不同的顺序,并可能产生不同的结果。

对于在每个清单之间重新启动浏览器的套件(如 mochitest),这应该不是一个很大的问题。

使用标签和路径时的行为是使用逻辑或,因此所有匹配的路径以及这些路径中具有标签的所有测试都将匹配。标签可用于交互式fzf窗口或使用-q/--query参数。例如,运行

$ mach try fuzzy --tag indexedDB -q "!pgo !cov !asan 'linux64"

将生成以下try_task_config.json

{
  "env":{
    "MOZHARNESS_TEST_PATHS":"{\"mochitest\":\"dom/indeedDB/test\"}"
  },
  "tasks":[
    "test-linux64-qr/debug-mochitest-e10s-1",
    "test-linux64-qr/opt-mochitest-e10s-1",
    "test-linux64/debug-mochitest-e10s-1",
    "test-linux64/opt-mochitest-e10s-1",
  ]
}

其他参数

您可能希望使用一些其他命令行参数

-e/--exact 默认情况下,fzf 将术语视为模糊匹配,并且以'为前缀的术语将其转换为精确匹配。如果传入--exact,则此行为将被反转。无前缀的术语变为精确,而'前缀使术语变为模糊。

--full 默认情况下,仅生成目标任务(例如,通常在 mozilla-central 上运行的任务)。传入--full 允许您从所有任务中进行选择。这对于夜间或发布任务等很有用。

-u/--update 将引导的fzf二进制文件更新到最新版本。

有关完整命令行参数列表,请运行

$ mach try fuzzy --help

有关使用fzf的更多信息,请运行

$ man fzf