syntax = "proto3";

package proto;

// Manifest specifies the entries in a container bundle, keyed and sorted by
// path.
message Manifest {
    repeated Resource resource = 1;
}

message Resource {
    // Path specifies the path from the bundle root. If more than one
    // path is present, the entry may represent a hardlink, rather than using
    // a link target. The path format is operating system specific.
    repeated string path = 1;

    // NOTE(stevvooe): Need to define clear precedence for user/group/uid/gid precedence.

    // Uid specifies the user id for the resource. A string type is used for
    // compatibility across different OS.
    string uid = 2;

    // Gid specifies the group id for the resource. A string type is used for
    // compatibility across different OS.
    string gid = 3;

    // user and group are not currently used but their field numbers have been
    // reserved for future use. As such, they are marked as deprecated.
    string user = 4 [deprecated=true];
    string group = 5 [deprecated=true];

    // Mode defines the file mode and permissions. We've used the same
    // bit-packing from Go's os package,
    // http://golang.org/pkg/os/#FileMode, since they've done the work of
    // creating a cross-platform layout.
    uint32 mode = 6;

    // NOTE(stevvooe): Beyond here, we start defining type specific fields.

    // Size specifies the size in bytes of the resource. This is only valid
    // for regular files.
    uint64 size = 7;

    // Digest specifies the content digest of the target file. Only valid for
    // regular files. The strings are formatted as <alg>:<digest hex bytes>.
    // The digests are sorted in lexical order and implementations may choose
    // which algorithms they prefer.
    repeated string digest = 8;

    // Target defines the target of a hard or soft link. Absolute links start
    // with a slash and specify the resource relative to the bundle root.
    // Relative links do not start with a slash and are relative to the
    // resource path.
    string target = 9;

    // Major specifies the major device number for charactor and block devices.
    uint64 major = 10;

    // Minor specifies the minor device number for charactor and block devices.
    uint64 minor = 11;

    // TODO(stevvooe): The use of maps here may be problematic for
    // deterministic generation. Check out this comment:
    // https://developers.google.com/protocol-buffers/docs/proto3#backwards-compatibility
    // Fortunately, the Go implementation correctly sorts the map keys to
    // ensure deterministic generation, but this is not guaranteed for all
    // implementations. If this is problem, we should generate that schema and
    // sort by key. We can do this at any time and retain backwards
    // compatibility.

    // Xattr provides storage for extended attributes for the target resource.
    map<string, bytes> xattr = 12;

    // Ads stores one or more alternate data streams for the target resource.
    map<string, bytes> ads = 13;

}
