跳到主要内容

state-enter

自 4.4 版本起

state-enter 命令与 state-leave 结合使用,以方便 订阅中的高级稳定

state-enter 会将监视标记为处于特定的命名状态。该状态一直有效,直到发出相应的 state-leave 命令,或者直到进入该状态的 watchman 客户端会话断开连接。这种自动清理有助于避免在启动状态的工具意外终止时破坏订阅者。

订阅可以使用 deferdrop 字段来延迟或删除在监视处于特定命名状态时生成的通知。

示例

这是最简单的例子;进入一个名为 mystate 的状态

["state-enter", "/path/to/root", "mystate"]

它将导致任何订阅者从 watchman 服务器接收单方面订阅 PDU

{
"subscription": "mysubscriptionname",
"root": "/path/to/root",
"state-enter": "mystate",
"clock": "c:1446410081:18462:7:127"
}

响应中的 clock 字段是输入状态时的时间(已同步;见下文)时钟,可以与相应的 state-leave 订阅 PDU 时钟结合使用,以查找在断言状态时发生更改的内容。

一个更复杂的例子演示了将元数据传递给任何订阅者。 metadata 字段会传播到订阅者,并且不会被 watchman 服务器解释。它可以是任何 JSON 值。

["state-enter", "/path/to/root", {
"name": "mystate",
"metadata": {
"foo": "bar"
}
}]

这将向所有订阅者发出以下单方面订阅 PDU

{
"subscription": "mysubscriptionname",
"root": "/path/to/root",
"state-enter": "mystate",
"clock": "c:1446410081:18462:7:137",
"metadata": {
"foo": "bar"
}
}

同步

状态与文件系统的状态同步,以便订阅者可以推断文件相对于状态何时发生更改。

这意味着发出 state-enter 命令将 执行查询同步,以确保事物处于同步状态。

state-enter 命令将使用默认的 sync_timeout,即 60 秒。如果在配置的 sync_timeout 内未观察到同步 cookie,则将返回错误,并且不会进入该状态

在某些情况下,例如在对非常大的树进行初始爬取时,您可以为超时指定一个替代值;该值以毫秒表示

["state-enter", "/path/to/root", {
"name": "mystate",
"sync_timeout": 10000,
"metadata": {
"foo": "bar"
}
}]

您还可以为超时指定 0,以禁用此特定命令的同步。这可能会导致状态在逻辑上看起来在实际发生之前已经进入客户端,如果 watchman 在输入状态时存在尚未处理的缓冲通知。