72e82ffcb1
Some paths might use names that are not valid UTF-8. We should be able to represent them. We don't actually need to touch the PathInfo structures, as they need to represent StorePaths, which come with their own harder restrictions, which can't encode non-UTF8 data. While this doesn't change any of the wire format of the gRPC messages, it does however change the interface of tvix_eval::EvalIO - its read_dir() method does now return a list of Vec<u8>, rather than SmolStr. Maybe this should be OsString instead? Change-Id: I821016d9a58ec441ee081b0b9f01c9240723af0b Reviewed-on: https://cl.tvl.fyi/c/depot/+/8974 Autosubmit: flokli <flokli@flokli.de> Reviewed-by: raitobezarius <tvl@lahfa.xyz> Tested-by: BuildkiteCI
62 lines
2.2 KiB
Protocol Buffer
62 lines
2.2 KiB
Protocol Buffer
// 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
|
|
bytes 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
|
|
bytes 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
|
|
bytes name = 1;
|
|
// The target of the symlink.
|
|
bytes target = 2;
|
|
}
|