// SPDX-FileCopyrightText: edef <edef@unfathomable.blue> // SPDX-License-Identifier: OSL-3.0 OR MIT OR Apache-2.0 syntax = "proto3"; package tvix.store.v1; option go_package = "code.tvl.fyi/tvix/store/protos;storev1"; // A Directory can contain Directory, File or Symlink nodes. // Each of these nodes have a name attribute, which is the basename in that directory // and node type specific attributes. // The name attribute: // - MUST not contain slashes or null bytes // - MUST not be '.' or '..' // - MUST be unique across all three lists // Elements in each list need to be lexicographically ordered by the name // attribute. message Directory { repeated DirectoryNode directories = 1; repeated FileNode files = 2; repeated SymlinkNode symlinks = 3; } // A DirectoryNode represents a directory in a Directory. message DirectoryNode { // The (base)name of the directory string name = 1; // The blake3 hash of a Directory message, serialized in protobuf canonical form. bytes digest = 2; // Number of child elements in the Directory referred to by `digest`. // Calculated by summing up the numbers of `directories`, `files` and // `symlinks`, and for each directory, its size field. Used for inode // number calculation. // This field is precisely as verifiable as any other Merkle tree edge. // Resolve `digest`, and you can compute it incrementally. Resolve the // entire tree, and you can fully compute it from scratch. // A credulous implementation won't reject an excessive size, but this is // harmless: you'll have some ordinals without nodes. Undersizing is // obvious and easy to reject: you won't have an ordinal for some nodes. uint32 size = 3; } // A FileNode represents a regular or executable file in a Directory. message FileNode { // The (base)name of the file string name = 1; // The blake3 digest of the file contents bytes digest = 2; // The file content size uint32 size = 3; // Whether the file is executable bool executable = 4; } // A SymlinkNode represents a symbolic link in a Directory. message SymlinkNode { // The (base)name of the symlink string name = 1; // The target of the symlink. string target = 2; }