跳到主要内容

区分大小写

Watchman 目前完全没有意识到文件系统中的大小写区分,并且不尝试对文件名进行任何大小写折叠。 在不区分大小写的文件系统(如 macOS 的 HFS+)上,这可能会以不同的方式表现出来

  • 如果文件 foo.txt 被重命名为 FOO.txt,Watchman 将报告 FOO.txt 已创建,并单独报告 foo.txt 已更改。
  • 如果删除文件 foo.txt,然后稍后添加另一个文件 FOO.txt,Watchman 将报告 FOO.txt 已添加,但它可能会报告 foo.txt 已删除或已更改。

通常,foo.txtFOO.txt 都可以被报告,有时具有不同的统计数据,有时具有相同的统计数据。

为什么 Watchman 不正确支持大小写折叠?

一个问题是,“正确”很难确定。这里至少有四个级别的正确性

  • 仅处理 ASCII 大小写折叠(95% 的解决方案)
  • 仅处理 ASCII + 带重音符号的 ASCII 大小写折叠(98%)
  • 使用 Unicode 数据库完全处理当前的 Unicode 规范(99%)
  • 使用写入磁盘上隐藏文件中的特殊折叠表,该表在文件系统创建时与 Apple 在操作系统发布时对 Unicode 的解释 + 他们自己的怪癖相匹配(100%)

Watchman 的客户端可能对大小写折叠有自己的想法,这可能与 Watchman 的想法兼容或不兼容。 到目前为止,客户端已经成功地在 Watchman 之外处理了大小写折叠。

这重要吗?

这取决于您的应用程序。

示例 1: 您的应用程序是一个构建系统,它具有预先烘焙的文件列表。 您的应用程序希望即使在不区分大小写的文件系统上,文件也以正确的大小写位于磁盘上,并且您声明如果它们不是,则该行为未定义。 您通过询问 Watchman 哪些文件已更改来调用 Watchman。 在这种情况下,Watchman 应该可以工作,而无需您执行任何特殊操作。

示例 2: 您的应用程序是一个构建系统规则,用于生成由 Watchman 触发器在 *.scss 上运行的 CSS 规则。 您希望您关心的所有文件都以字符串 .scss 在不区分大小写的文件系统上结尾,而不是像 .SCSS 这样的其他变体。 在这种情况下,Watchman 应该可以正常工作 - 充其量,它会多次为您提供相同的文件,但大小写变体不同。 无论如何,您可能已经在构建系统中处理了这个问题。

示例 3: 与示例 2 类似,只是您希望 .SCSS 和其他变体也能工作。 在这种情况下,唯一的方法是将所有可能的变体显式添加到触发规则中。

示例 4: 您是一个源代码控制系统,对大小写折叠有自己的想法,这些想法可能与操作系统相匹配,也可能不匹配。 您针对内部数据结构执行大小写折叠,因此,如果数据结构有 foo.txt 并且文件系统有 FOO.txt,则使 foo.txt 优先。 在这种情况下,Watchman 将告诉您 FOO.txtfoo.txt,并且由您来执行规范化。 hgwatchman 仅在文件更改大小写时才查阅文件系统。

致谢

正确性级别由 Matt Mackall mpm@selenic.com 提出。