区分大小写
Watchman 目前完全没有意识到文件系统中的大小写区分,并且不尝试对文件名进行任何大小写折叠。 在不区分大小写的文件系统(如 macOS 的 HFS+)上,这可能会以不同的方式表现出来
- 如果文件
foo.txt
被重命名为FOO.txt
,Watchman 将报告FOO.txt
已创建,并单独报告foo.txt
已更改。 - 如果删除文件
foo.txt
,然后稍后添加另一个文件FOO.txt
,Watchman 将报告FOO.txt
已添加,但它可能会报告foo.txt
已删除或已更改。
通常,foo.txt
和 FOO.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.txt
和 foo.txt
,并且由您来执行规范化。 hgwatchman 仅在文件更改大小写时才查阅文件系统。
致谢
正确性级别由 Matt Mackall mpm@selenic.com 提出。