标记系统。使用非分级标记组织文件。
protagonist的Python项目详细描述
主角实现了一个tagsystem:它用于非层次地标记文件,以便可以通过布尔查询找到它们。 主角通过使用特殊目录和链接来连接表示标记系统的特定文件系统结构(如下所述)。
(有关用法示例,请参见examples.rst.)
此项目的一个主要设计限制是提供与Tahoe-LAFS备份存储的无缝兼容性。 tahoe lafs备份将使用一个目录并递归地备份每个子目录中的文件。 它没有符号链接的本机表示。
结构
tagsystem结构是在一个名为“.protogent/”的特殊目录中定义的。
每一个已有的标签,都有一个子目录,名为“主角/标签”,还有一个子目录。 任何标记为t的文件在目录t中都有一个唯一的标识符和一个硬链接。更一般地说,未来的一个特性是,标记系统支持键-值对,目录为“.protogrant/key/value/”
唯一标识符
对于唯一的文件标识,主角在标记时使用内容的(20字节)blake2散列,其文件扩展名与原始文件相同。 基于内容的哈希的潜在优势是:
- 从文件移动中恢复。
- 发现未标记的文件(也可以使用inode)。
- 同一文件的多个副本的标识。
- 启用不可变文件的完整性检查。
对可变文件使用基于内容的散列不会有这些优势,尽管它可以用于帮助澄清意图,例如,允许用户特别列出应该保持不变的文件。
使用硬链接会对删除已标记的文件产生影响。使用符号链接,删除或移动的文件将留下断开的链接。对于硬链接,需要有特殊的逻辑来确定文件是否存在于标签系统之外。 这是在命令行界面中实现的,它包装rm和mv。
真名
使用唯一id的一个问题是,现在用户无法识别tagls的结果。 这会激发truenames索引。
这个项目的部分目标是将底层文件系统的目录结构用作一个可以用作数据结构的基元。 因此,我希望避免符号链接和数据库,而采用文件系统机制。
我选择的设计是创建一个名为“truenames”的特殊目录,其中有一个名为file id的文件,其内容是真正的路径名。 这与实现符号链接非常相似。 它本质上是符号链接,但是隐藏符号链接,在inode表中没有标记为隐藏符号链接,因此后面没有通常跟随符号链接的命令。
方法
标记系统支持:
- 添加和删除标记
- 标记和取消标记文件
- 使用布尔组合查询
- 干净地从文件系统中删除和移动文件,即使它们已被标记。
解除文件标记
当我们希望o从文件中删除标记t,f:
- 如果f是唯一带有标记t的文件,那么标记t也应该从标记系统中删除。
- 由于具有相同内容的文件具有相同的文件ID,因此在未标记f但标记了相同文件f'的情况下请求取消标记f可能会导致取消标记错误的文件副本。因此,必须注意确保f是文件中的正确链接。为此,我们将使用索引节点而不是内容哈希。