state-enter
自 4.4 版本起
state-enter
命令与 state-leave 结合使用,以方便 订阅中的高级稳定。
state-enter
会将监视标记为处于特定的命名状态。该状态一直有效,直到发出相应的 state-leave
命令,或者直到进入该状态的 watchman 客户端会话断开连接。这种自动清理有助于避免在启动状态的工具意外终止时破坏订阅者。
订阅可以使用 defer 和 drop 字段来延迟或删除在监视处于特定命名状态时生成的通知。
示例
这是最简单的例子;进入一个名为 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 在输入状态时存在尚未处理的缓冲通知。