跳到主要内容

发行说明

Watchman 在 Facebook 内部持续部署,这意味着我们不会明确地维护版本号。我们有自动化流程,会使用日期生成每周标签。您可以在兼容性规则文档中了解更多关于如何推理支持的功能和我们的向后兼容性指南的信息。

在这些发行说明中,我们只关注重点内容。如需包含所有详细信息的完整历史记录,请参阅 GitHub 上的提交历史记录

Watchman v2020.07.13.00

  • 添加了脚本 watchman-replicate-subscription。它可以复制现有的 watchman 订阅。集成商可以使用此脚本来验证他们的客户端正在接收的 watchman 通知。
  • 在后缀表达式中添加了对后缀集的支持。现在,您可以通过将第二个参数设置为后缀列表来指定要匹配的多个后缀。有关详细信息,请参阅 suffix-set 文档中的 更多详细信息
  • pywatchman:为 python 引入了新的 pywatchman_aio 客户端
  • Windows:我们不再信任环境变量来定位状态目录,这应该会为混合使用 cygwin、mingw、原生 Windows 和/或 WSL 或其他环境的用户带来更好的体验
  • Windows:我们现在支持 Windows 10 上的 Unix 域套接字。CLI 将优先使用 Unix 域套接字(如果可用)。

自上次发布以来,我们并没有很好地更新发行说明;当时有很多工作是为了支持我们的姊妹项目 EdenFS,这些工作与 FB 之外的人员没有广泛的相关性。

Watchman 4.9.0 (2017-08-24)

  • 新字段:content.sha1hex。此字段扩展为文件内容的 SHA1 哈希值,以十六进制数字表示(40 个字符的十六进制字符串)。Watchman 维护内容哈希的缓存,可以按需计算哈希,也可以在文件更改时进行启发式计算。这对于希望执行更智能的缓存失效或从内容寻址存储中提取构建工件的工具非常有用。
  • 实验性功能:源代码控制感知查询模式。目前仅支持 Mercurial(欢迎提交补丁以添加 Git 支持!)。SCM 感知查询模式有助于在您重新构建代码时,使响应大小更接近 O(what-you-changed),而不是 O(all-repo-changes)。有效使用此功能可能需要一些额外的基础设施来计算数据并将其与您的 repo 中的修订关联。
  • 修复了全局配置中启用 perf_logger_command 时导致 perf 日志线程死锁的问题
  • 修复了大于 1MB 的查询可能导致 PDU 错误响应的问题。
  • 减少了不使用高级结算(dropdefer)选项的订阅的锁争用。
  • 修复了在使用 unix 时间戳而不是首选的时钟字符串语法时 since 生成器的行为
  • 改进了 watchman 结果中“新”文件的报告
  • 提高了不区分大小写的文件系统上处理更改的性能
  • Windows:从 alpha 升级到 beta 状态!
  • Windows:修复了一些性能和可靠性问题
  • Windows:现在可以在 Windows 7 上正常运行
  • Windows:现在可以查看和报告符号链接和连接点
  • Windows:修复了触发器删除中潜在的死锁
  • Windows:修复了 win32 上的堆栈跟踪渲染
  • Windows:改进了 win32 上删除操作周围的 IO 调度
  • Windows:改进了对不区分大小写的 win32 驱动器号的处理
  • pywatchman:python wheel 格式用于发布 watchman pypi 包
  • pywatchman:现在可以在 python 客户端中配置 watchman 路径
  • pywatchman:现在可以将 python 客户端用作上下文管理器
  • Solaris:已删除对 Solaris 的支持。如果您想致力于测试和维护 Solaris 支持,我们很乐意听取您的意见!

Watchman 4.8.0(从未正式发布)

哎呀,我们从未设法将其标记为高于候选版本标签!

  • 新命令 flush-subscriptions 用于同步与当前会话关联的订阅。
  • 在 Windows 上,返回 / 作为目录分隔符。之前我们使用 \。此更改对客户端应该是相当中立的,并且使得更容易处理内部结构和集成测试基础设施。
  • 更严格地强制执行套接字 Unix 组 — 如果 Watchman 无法获得正确的组成员资格(这可能会发生在站点遇到间歇性 LDAP 连接问题时),它现在将拒绝启动。
  • pywatchman 现在正式支持 Python 3。默认情况下,pywatchman 将返回 Unicode 字符串(可能带有代理转义),但可以选择返回字节串。请注意,在 Python 3 上,pywatchman 需要 Watchman 4.8 及以上版本。Python 2 接口和要求保持不变。
  • 在 4.8 之前的版本中,Java WatchmanClient 上返回 ListenableFutures 的方法会在套接字关闭或线程终止等情况下吞噬异常并在未完成状态下挂起。此问题已修复,现在 ListenableFutures 会立即传播异常条件。(请注意,这通常是无法恢复的,用户应创建一个新的 WatchmanClient 以重新建立与 Watchman 的通信。)请参阅 #412。
  • Watchman Java 客户端的最低 Java 版本始终为 1.7,但错误地描述为 1.6。Java 客户端的构建文件已相应修复。
  • Watchman 已从 C 转换为 C++。转换暴露了几个并发错误,所有这些错误现在都已修复。
  • 订阅查询现在在客户端线程的上下文中执行,这意味着订阅是并行分派的。以前,订阅将被串行分派并阻塞磁盘 IO 线程。
  • 触发器现在是并行分派的,等待在其自己的线程中管理(每个触发器一个线程)。这提高了并发性,并解决了几个 waitpid 相关的问题,其中 watchman 可能无法及时获取生成的子进程,或者可能在 CPU 上旋转直到生成另一个子进程。
  • 修复了一个对象生命周期管理问题,该问题可能导致在老化旧/临时文件时发生崩溃。
  • 在服务器和 pywatchman 中实现升级的线协议 BSERv2。BSERv2 可以通过线路携带有关字符串编码的信息。这允许 pywatchman 在 Python 3 上转换为 Unicode 字符串。客户端和服务器知道如何透明地回退到 BSERv1。
  • OS X:我们在使用 launchd 注册时不再使用套接字激活。这是 mac Homebrew 用户的一些升级问题的根源。

Watchman 4.7.0 (2016-09-10)

  • 内存使用量减少了 40%
  • 查询现在可以使用共享锁运行。建议客户端从 n:FOO 样式服务器端命名光标 clockspecs 迁移,以充分利用这一点。
  • 添加了新的 glob 生成器作为查询的遍历策略。这允许 watchman 以最有效的方式评估 globs。我们在 Buck 项目中的朋友已经将其集成到他们的 BUCK 文件解析中,以便在不接触文件系统的情况下评估 globs!
  • 向查询添加了 "case_sensitive": true 选项,以强制匹配以区分大小写的方式发生,即使受监视的根目录位于不区分大小写的文件系统上。这用于加速某些类型的内部遍历:如果我们知道某个路径区分大小写,我们可以执行 O(1) 查找,否则我们将不得不执行 O(number-of-directory-entries) 扫描和比较。
  • 修复了订阅启动期间可能发出不正确的时钟值的竞争条件。
  • 修复了 Mac 上已更改文件的父目录的虚假过度通知。
  • 修复了 Windows 上的一些可靠性问题

Watchman 4.6.0 (2016-07-09)

  • 改进了处理递归删除和深度目录重命名操作时的 I/O 调度。
  • 改进了 OS X 和 Windows 系统上 ignore_dirs 配置选项的性能。我们利用一个未记录的(但受支持的!)API 来进一步加速 OS X 上 ignore_dirs 中的前 8 个条目。依赖此配置来避免重新爬取的用户将需要审查并优先考虑他们最活跃的构建目录,使其位于他们在 .watchmanconfig 文件中指定的 ignore_dirs 的前面。
  • 为 OS X 添加了一个可选的重新爬取恢复策略,该策略将尝试从 fseventsd 日志重新同步,而不是执行完整的文件系统遍历。目前默认情况下禁用此功能,但在下一个 Watchman 版本中可能会默认启用。您可以通过在 /etc/watchman.json 或您的 .watchmanconfig 中设置 fsevents_try_resync: true 来启用此功能。这应该可以降低某些用户/工作负载的重新爬取警告的频率,并提高具有极大树的用户/工作负载的 I/O。
  • 修复了不区分大小写的文件系统(例如 OS X)上递归删除和深度目录重命名操作的意外指数时间复杂度问题。这表现为长时间的高 CPU 利用率。
  • 添加了允许非所有者访问 Watchman 实例的支持。只有所有者才有权创建或删除监视。非所有者可以查看有关现有监视的信息。访问控制基于 unix 域套接字权限。新的但尚未记录的配置选项 sock_groupsock_access 可用于控制此新行为。
  • 添加了对 watchman 服务的 inetd 样式套接字激活的支持。此提交包括 systemd 的示例配置
  • symlink_target 字段添加到文件的存储元数据。这保存了符号链接的文本(如果文件是符号链接)。您可以使用功能名称 field-symlink_target 来测试 watchman 服务器是否支持它。
  • 修复了一个问题,其中 watchman 可能无法获取触发器生成的子进程。
  • 修复了一个问题,其中如果存在其他连接的客户端,watchman 可能会在关闭期间永远阻塞。
  • 添加了 hint_num_dirs 配置选项。

pywatchman 1.4.0 (????-??-??)

(这些更改尚未发布到 pypi)

  • 为 bser 中的数据结果添加了不可变版本。与可变版本相比,从序列化的 bser 表示构建此版本成本更低,并且更适合从 watchman 接收的大型结果集。
  • 修复了许多其他的可移植性问题
  • 添加了 Python 3.x 支持

Watchman 4.5.0 (2016-02-18)

  • 修复了 Watchman 4.4 中引入的用于非原子目录替换的 inotify 竞争条件。

Watchman 4.4.0 (2016-02-02)

  • 添加了 state-enter 和 state-leave 命令,允许订阅者更智能地解决/合并围绕 hg 更新或构建的事件。
  • 修复了一个问题,其中订阅可能会为同一事件双重通知。
  • 修复了一个问题,其中从未匹配任何文件的订阅会为每次订阅分派增加 O(all-observed-files) CPU 成本

Watchman 4.3.0 (2015-12-14)

  • 改进了大小写不敏感的重命名处理;在 OS X 上,内存使用量减少了一半,爬取速度提高了一倍。

Watchman 4.2.0 (2015-12-08)

  • 提高了对符号链接检查的严格性;现在不仅检查目录树的叶子是否为符号链接,还检查从观察根目录向下的每个组件。这改进了对目录到符号链接(反之亦然)转换的检测和处理。
  • 提高了 Watchman 进程在 OS X 上的优先级。

pywatchman 1.3.0 (2015-10-22)

  • 添加了 watchman-makewatchman-wait 命令
  • 添加了 BSER 的纯 Python 实现

Watchman 4.1.0 (2015-10-20)

  • 修复了在使用新的 bulkstat 功能时,在 OS X 上符号链接大小始终报告为 0 的问题

Watchman 4.0.0 (2015-10-19)

  • 修复了目录被符号链接替换时,会导致符号链接遍历,而不是正确更新节点类型并标记子节点为已删除的问题。
  • 修复了在每次目录遍历时以错误的日志级别发出的调试日志行。

Watchman 3.9.0 (2015-10-12)

  • 修复了 OS X 上目录重命名可能导致我们丢失重命名目录中的文件的问题
  • 修复了 Linux 上目录删除和替换可能导致我们丢失替换目录中的文件的问题(与上面 OS X 问题的体现类似,但根本原因不同)。
  • 提高了平均条目数超过几个的目录的(重新)爬取速度(对于平均条目数高达 64 个的目录,改进可能高达 5 倍)。您现在可以在 .watchmanconfig 中调整 hint_num_files_per_dir 设置,以更好地匹配您的树。更多详情
  • 通过使用 getattrlistbulk 提高了 OS X 10.10 及更高版本上的(重新)爬取速度。这允许我们在爬取期间提高数据:系统调用比率,并且对于较大的树,可以将吞吐量提高高达 40%。
  • clock 命令添加了可选的 sync_timeout
  • 避免在我们生成 Watchman 服务时意外传递 stdio 流之外的描述符。
  • 修复了一个竞争条件,如果两个客户端同时发出 watchwatch-project,我们可能会为同一个目录启动两组 watcher 线程
  • 为 OS X 上的 tmux + launchd 问题添加了有用的错误信息

Watchman 3.8.0 (2015-09-14)

  • 提高了处理内核通知的延迟。现在不太可能遇到通知队列溢出。
  • 改进了空闲行为。在一些地方,Watchman 会比严格需要的时间更频繁地唤醒,现在这些问题已得到修复。这主要对使用电池供电的笔记本电脑用户感兴趣。
  • 改进了 inotify 移动跟踪。一些移动操作可能导致 Watchman 变得混乱并触发重新爬取。现在已经解决了这个问题。
  • 加强了 statedir 和权限。存在符号链接攻击的可能性,现在通过重新构建 statedir 布局来缓解此问题。
  • 修复了空闲观察清理器中可能发生的死锁
  • 修复了 Watchman -p log-level debug 可能会在 CLI 中丢弃日志通知的问题
  • 禁用了我们在 3.7 中添加的爬取期间的 IO 限制。事实证明它弊大于利。
  • -j CLI 选项现在接受 stdin 上的 JSON 或 BSER 编码命令
  • 向服务器添加了capabilities,并向 python 和 node 客户端添加了 capabilityCheck 方法。

pywatchman 1.2.0 (2015-08-15)

  • 添加了 capabilityCheck 方法
  • 添加了 SocketTimeout 异常以区分超时和协议级别异常

fb-watchman 1.3.0 for node (2015-08-15)

pywatchman 1.0.0 (2015-08-06)

  • 第一个官方 pypi 版本,感谢 @kwlzn 为此设置了发布机制。

Watchman 3.7.0 (2015-08-05)

(Watchman 3.6.0 没有正式发布)

  • 修复了使用 wholename 范围在 foo*.java 上进行 query match 错误匹配 foo/bar/baz.java 的错误。
  • query match 添加了 src/**/*.java 递归 glob 模式支持。
  • querymatch 运算符添加了 options 字典。
  • query match 添加了 includedotfiles 选项,以包含名称以 . 开头的文件。
  • query match 添加了 noescape 选项,使 \ 匹配文字 \
  • 我们现在将自动老化并停止观察。有关更多信息,请参见 idle_reap_age_seconds
  • watch-project 现在将更加努力地重用现有观察并避免创建重叠观察。
  • 降低了在支持此功能的系统上爬取期间的 I/O 优先级
  • 修复了 Python BSER 模块中 long long 数据类型的问题

fb-watchman 1.2.0 for node (2015-07-11)

  • 更新了节点客户端,以更优雅地处理对象中的 undefined 值;我们现在省略值为 undefined 的键,而不是引发异常。

Watchman 3.5.0 (2015-06-29)

  • 修复了 Watchman 报告的版本号。

Watchman 3.4.0 (2015-06-29)

  • trigger 现在支持可选的 relative_root 参数。触发器相对于此子目录进行评估。有关更多信息,请参见 trigger

fb-watchman 1.1.0 for node (2015-06-25)

  • 更新了节点客户端以使用 node-int64 处理 64 位整数值。如果您的查询字段包含 size 并且您的被观察根目录中有大于 2GB 的文件,则这些值最有可能出现。

fb-watchman 1.0.0 for node (2015-06-23)

  • 更新了节点客户端以支持 BSER 编码,修复了先前使用的 JSON 流解码器中的二次性能问题。

Watchman 3.3.0 (2015-06-22)

  • querysubscribe 现在支持可选的 relative_root 参数。输入和输出相对于此子目录进行评估。有关更多信息,请参见 文件查询