summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbst-marge-bot <marge-bot@buildstream.build>2020-05-27 09:43:14 +0000
committerbst-marge-bot <marge-bot@buildstream.build>2020-05-27 09:43:14 +0000
commitf51653d96b08c4a3e0b25c1c51bd2ee45d2bdf01 (patch)
treec41dd7cee640b5e959dfb1548e1feca216dc450a
parent654bf559d67e293856406428fbfc8c88e933d62f (diff)
parentba31c25d9b5990c94fa38810c50ca6af9298512f (diff)
downloadbuildstream-f51653d96b08c4a3e0b25c1c51bd2ee45d2bdf01.tar.gz
Merge branch 'juerg/node-properties' into 'master'
Field-based node properties See merge request BuildStream/buildstream!1918
-rw-r--r--.gitlab-ci.yml10
-rw-r--r--src/buildstream/_artifact.py2
-rw-r--r--src/buildstream/_cas/cascache.py19
-rw-r--r--src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution.proto60
-rw-r--r--src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py319
-rw-r--r--src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py8
-rw-r--r--src/buildstream/_protos/build/buildgrid/local_cas.proto4
-rw-r--r--src/buildstream/_protos/build/buildgrid/local_cas_pb2.py103
-rw-r--r--src/buildstream/element.py2
-rw-r--r--src/buildstream/plugins/sources/workspace.py2
-rw-r--r--src/buildstream/storage/_casbaseddirectory.py63
-rw-r--r--src/buildstream/storage/_filebaseddirectory.py13
-rw-r--r--src/buildstream/utils.py37
-rw-r--r--tests/internals/storage.py2
-rw-r--r--tests/internals/storage_vdir_import.py6
15 files changed, 386 insertions, 264 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fa86041dd..1f13c9947 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -24,7 +24,7 @@ variables:
# Our own variables
# Version of the docker images we should use for all the images.
# This is taken from buildstream/buildstream-docker-images
- DOCKER_IMAGE_VERSION: master-140747994
+ DOCKER_IMAGE_VERSION: master-149783478
PYTEST_ADDOPTS: "--color=yes"
INTEGRATION_CACHE: "${CI_PROJECT_DIR}/cache/integration-cache"
PYTEST_ARGS: "--color=yes --integration -n 2"
@@ -298,8 +298,8 @@ tests-wsl-master:
- PATH=/root/.local/bin:$PATH tox --version
script:
# Install static buildbox binaries
- - wget https://buildbox-casd-binaries.nyc3.cdn.digitaloceanspaces.com/buildbox-x86_64-linux-0.0.7-253cb8d6.tar.xz
- - tar -C /root/.local/bin -xf buildbox-x86_64-linux-0.0.7-253cb8d6.tar.xz
+ - wget https://buildbox-casd-binaries.nyc3.cdn.digitaloceanspaces.com/buildbox-x86_64-linux-0.0.8-1e3b6f8e.tar.xz
+ - tar -C /root/.local/bin -xf buildbox-x86_64-linux-0.0.8-1e3b6f8e.tar.xz
- PATH=/root/.local/bin:$PATH ${TEST_COMMAND}
only:
@@ -320,8 +320,8 @@ tests-wsl-non-master:
- PATH=/root/.local/bin:$PATH tox --version
script:
# Install static buildbox binaries
- - wget https://buildbox-casd-binaries.nyc3.cdn.digitaloceanspaces.com/buildbox-x86_64-linux-0.0.7-253cb8d6.tar.xz
- - tar -C /root/.local/bin -xf buildbox-x86_64-linux-0.0.7-253cb8d6.tar.xz
+ - wget https://buildbox-casd-binaries.nyc3.cdn.digitaloceanspaces.com/buildbox-x86_64-linux-0.0.8-1e3b6f8e.tar.xz
+ - tar -C /root/.local/bin -xf buildbox-x86_64-linux-0.0.8-1e3b6f8e.tar.xz
- PATH=/root/.local/bin:$PATH ${TEST_COMMAND}
when: manual
diff --git a/src/buildstream/_artifact.py b/src/buildstream/_artifact.py
index 0a70d096f..cf82a1636 100644
--- a/src/buildstream/_artifact.py
+++ b/src/buildstream/_artifact.py
@@ -165,7 +165,7 @@ class Artifact:
artifact.weak_key = self._weak_cache_key
artifact.was_workspaced = bool(element._get_workspace())
- properties = ["MTime"] if artifact.was_workspaced else []
+ properties = ["mtime"] if artifact.was_workspaced else []
# Store files
if collectvdir:
diff --git a/src/buildstream/_cas/cascache.py b/src/buildstream/_cas/cascache.py
index 74912c4e2..8df0c4640 100644
--- a/src/buildstream/_cas/cascache.py
+++ b/src/buildstream/_cas/cascache.py
@@ -231,18 +231,19 @@ class CASCache:
for filenode in directory.files:
# regular file, create hardlink
fullpath = os.path.join(dest, filenode.name)
- # generally, if the node holds properties we will fallback
- # to copying instead of hardlinking
- if can_link and not filenode.node_properties:
+
+ node_properties = filenode.node_properties
+ if node_properties.HasField("mtime"):
+ mtime = utils._parse_protobuf_timestamp(node_properties.mtime)
+ else:
+ mtime = None
+
+ if can_link and mtime is None:
utils.safe_link(self.objpath(filenode.digest), fullpath)
else:
utils.safe_copy(self.objpath(filenode.digest), fullpath)
- if filenode.node_properties:
- # see https://github.com/bazelbuild/remote-apis/blob/master/build/bazel/remote/execution/v2/nodeproperties.md
- # for supported node property specifications
- for prop in filenode.node_properties:
- if prop.name == "MTime" and prop.value:
- utils._set_file_mtime(fullpath, utils._parse_timestamp(prop.value))
+ if mtime is not None:
+ utils._set_file_mtime(fullpath, mtime)
if filenode.is_executable:
os.chmod(
diff --git a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution.proto b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution.proto
index 0cb33acaf..b69105d72 100644
--- a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution.proto
+++ b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution.proto
@@ -21,6 +21,7 @@ import "google/api/annotations.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
+import "google/protobuf/wrappers.proto";
import "google/rpc/status.proto";
option csharp_namespace = "Build.Bazel.Remote.Execution.V2";
@@ -236,6 +237,10 @@ service ActionCache {
// used in subsequent calls (e.g. to
// [Execute][build.bazel.remote.execution.v2.Execution.Execute]).
//
+// Servers MUST behave as though empty blobs are always available, even if they
+// have not been uploaded. Clients MAY optimize away the uploading or
+// downloading of empty blobs.
+//
// As with other services in the Remote Execution API, any call may return an
// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
// information about when the client should retry the request; clients SHOULD
@@ -550,14 +555,17 @@ message Command {
// empty, then the action is run in the input root.
string working_directory = 6;
- // List of required supported [NodeProperty][build.bazel.remote.execution.v2.NodeProperty]
- // keys. In order to ensure that equivalent `Action`s always hash to the same
- // value, the supported node properties MUST be lexicographically sorted by name.
+ // A list of keys for node properties the client expects to retrieve for
+ // output files and directories. Keys are either names of string-based
+ // [NodeProperty][build.bazel.remote.execution.v2.NodeProperty] or
+ // names of fields in [NodeProperties][build.bazel.remote.execution.v2.NodeProperties].
+ // In order to ensure that equivalent `Action`s always hash to the same
+ // value, the node properties MUST be lexicographically sorted by name.
// Sorting of strings is done by code point, equivalently, by the UTF-8 bytes.
//
- // The interpretation of these properties is server-dependent. If a property is
- // not recognized by the server, the server will return an `INVALID_ARGUMENT`
- // error.
+ // The interpretation of string-based properties is server-dependent. If a
+ // property is not recognized by the server, the server will return an
+ // `INVALID_ARGUMENT`.
repeated string output_node_properties = 8;
}
@@ -686,7 +694,8 @@ message Directory {
repeated SymlinkNode symlinks = 3;
// The node properties of the Directory.
- repeated NodeProperty node_properties = 4;
+ reserved 4;
+ NodeProperties node_properties = 5;
}
// A single property for [FileNodes][build.bazel.remote.execution.v2.FileNode],
@@ -702,6 +711,23 @@ message NodeProperty {
string value = 2;
}
+// Node properties for [FileNodes][build.bazel.remote.execution.v2.FileNode],
+// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and
+// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is
+// responsible for specifying the properties that it accepts.
+//
+message NodeProperties {
+ // A list of string-based
+ // [NodeProperties][build.bazel.remote.execution.v2.NodeProperty].
+ repeated NodeProperty properties = 1;
+
+ // The file's last modification timestamp.
+ google.protobuf.Timestamp mtime = 2;
+
+ // The UNIX file mode, e.g., 0755.
+ google.protobuf.UInt32Value unix_mode = 3;
+}
+
// A `FileNode` represents a single file and associated metadata.
message FileNode {
// The name of the file.
@@ -716,7 +742,8 @@ message FileNode {
bool is_executable = 4;
// The node properties of the FileNode.
- repeated NodeProperty node_properties = 5;
+ reserved 5;
+ NodeProperties node_properties = 6;
}
// A `DirectoryNode` represents a child of a
@@ -747,7 +774,8 @@ message SymlinkNode {
string target = 2;
// The node properties of the SymlinkNode.
- repeated NodeProperty node_properties = 3;
+ reserved 3;
+ NodeProperties node_properties = 4;
}
// A content digest. A digest for a given blob consists of the size of the blob
@@ -1018,7 +1046,8 @@ message OutputFile {
bytes contents = 5;
// The supported node properties of the OutputFile, if requested by the Action.
- repeated NodeProperty node_properties = 6;
+ reserved 6;
+ NodeProperties node_properties = 7;
}
// A `Tree` contains all the
@@ -1073,7 +1102,8 @@ message OutputSymlink {
// The supported node properties of the OutputSymlink, if requested by the
// Action.
- repeated NodeProperty node_properties = 3;
+ reserved 3;
+ NodeProperties node_properties = 4;
}
// An `ExecutionPolicy` can be used to control the scheduling of the action.
@@ -1229,14 +1259,14 @@ message ExecuteOperationMetadata {
// being executed.
Digest action_digest = 2;
- // If set, the client can use this name with
+ // If set, the client can use this resource name with
// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
- // standard output.
+ // standard output from the endpoint hosting streamed responses.
string stdout_stream_name = 3;
- // If set, the client can use this name with
+ // If set, the client can use this resource name with
// [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the
- // standard error.
+ // standard error from the endpoint hosting streamed responses.
string stderr_stream_name = 4;
}
diff --git a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
index e3e0e4a86..cab2f499e 100644
--- a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
+++ b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
@@ -16,6 +16,7 @@ from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot
from buildstream._protos.google.longrunning import operations_pb2 as google_dot_longrunning_dot_operations__pb2
from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
from buildstream._protos.google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
@@ -24,9 +25,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
package='build.bazel.remote.execution.v2',
syntax='proto3',
serialized_options=b'\n\037build.bazel.remote.execution.v2B\024RemoteExecutionProtoP\001Z\017remoteexecution\242\002\003REX\252\002\037Build.Bazel.Remote.Execution.V2',
- serialized_pb=b'\n6build/bazel/remote/execution/v2/remote_execution.proto\x12\x1f\x62uild.bazel.remote.execution.v2\x1a\x1f\x62uild/bazel/semver/semver.proto\x1a\x1cgoogle/api/annotations.proto\x1a#google/longrunning/operations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto\"\xdb\x01\n\x06\x41\x63tion\x12?\n\x0e\x63ommand_digest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x42\n\x11input_root_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12*\n\x07timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0c\x64o_not_cache\x18\x07 \x01(\x08J\x04\x08\x03\x10\x06J\x04\x08\x08\x10\t\"\xed\x02\n\x07\x43ommand\x12\x11\n\targuments\x18\x01 \x03(\t\x12[\n\x15\x65nvironment_variables\x18\x02 \x03(\x0b\x32<.build.bazel.remote.execution.v2.Command.EnvironmentVariable\x12\x14\n\x0coutput_files\x18\x03 \x03(\t\x12\x1a\n\x12output_directories\x18\x04 \x03(\t\x12\x14\n\x0coutput_paths\x18\x07 \x03(\t\x12;\n\x08platform\x18\x05 \x01(\x0b\x32).build.bazel.remote.execution.v2.Platform\x12\x19\n\x11working_directory\x18\x06 \x01(\t\x12\x1e\n\x16output_node_properties\x18\x08 \x03(\t\x1a\x32\n\x13\x45nvironmentVariable\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"{\n\x08Platform\x12\x46\n\nproperties\x18\x01 \x03(\x0b\x32\x32.build.bazel.remote.execution.v2.Platform.Property\x1a\'\n\x08Property\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x92\x02\n\tDirectory\x12\x38\n\x05\x66iles\x18\x01 \x03(\x0b\x32).build.bazel.remote.execution.v2.FileNode\x12\x43\n\x0b\x64irectories\x18\x02 \x03(\x0b\x32..build.bazel.remote.execution.v2.DirectoryNode\x12>\n\x08symlinks\x18\x03 \x03(\x0b\x32,.build.bazel.remote.execution.v2.SymlinkNode\x12\x46\n\x0fnode_properties\x18\x04 \x03(\x0b\x32-.build.bazel.remote.execution.v2.NodeProperty\"+\n\x0cNodeProperty\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xb6\x01\n\x08\x46ileNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08\x12\x46\n\x0fnode_properties\x18\x05 \x03(\x0b\x32-.build.bazel.remote.execution.v2.NodePropertyJ\x04\x08\x03\x10\x04\"V\n\rDirectoryNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"s\n\x0bSymlinkNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x46\n\x0fnode_properties\x18\x03 \x03(\x0b\x32-.build.bazel.remote.execution.v2.NodeProperty\"*\n\x06\x44igest\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x03\"\xec\x04\n\x16\x45xecutedActionMetadata\x12\x0e\n\x06worker\x18\x01 \x01(\t\x12\x34\n\x10queued_timestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12:\n\x16worker_start_timestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1aworker_completed_timestamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12?\n\x1binput_fetch_start_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x1finput_fetch_completed_timestamp\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12=\n\x19\x65xecution_start_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1d\x65xecution_completed_timestamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1doutput_upload_start_timestamp\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n!output_upload_completed_timestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x9f\x05\n\x0c\x41\x63tionResult\x12\x41\n\x0coutput_files\x18\x02 \x03(\x0b\x32+.build.bazel.remote.execution.v2.OutputFile\x12L\n\x14output_file_symlinks\x18\n \x03(\x0b\x32..build.bazel.remote.execution.v2.OutputSymlink\x12G\n\x0foutput_symlinks\x18\x0c \x03(\x0b\x32..build.bazel.remote.execution.v2.OutputSymlink\x12L\n\x12output_directories\x18\x03 \x03(\x0b\x32\x30.build.bazel.remote.execution.v2.OutputDirectory\x12Q\n\x19output_directory_symlinks\x18\x0b \x03(\x0b\x32..build.bazel.remote.execution.v2.OutputSymlink\x12\x11\n\texit_code\x18\x04 \x01(\x05\x12\x12\n\nstdout_raw\x18\x05 \x01(\x0c\x12>\n\rstdout_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x12\n\nstderr_raw\x18\x07 \x01(\x0c\x12>\n\rstderr_digest\x18\x08 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12S\n\x12\x65xecution_metadata\x18\t \x01(\x0b\x32\x37.build.bazel.remote.execution.v2.ExecutedActionMetadataJ\x04\x08\x01\x10\x02\"\xca\x01\n\nOutputFile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08\x12\x10\n\x08\x63ontents\x18\x05 \x01(\x0c\x12\x46\n\x0fnode_properties\x18\x06 \x03(\x0b\x32-.build.bazel.remote.execution.v2.NodePropertyJ\x04\x08\x03\x10\x04\"~\n\x04Tree\x12\x38\n\x04root\x18\x01 \x01(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12<\n\x08\x63hildren\x18\x02 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\"c\n\x0fOutputDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\x12<\n\x0btree_digest\x18\x03 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.DigestJ\x04\x08\x02\x10\x03\"u\n\rOutputSymlink\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\x12\x46\n\x0fnode_properties\x18\x03 \x03(\x0b\x32-.build.bazel.remote.execution.v2.NodeProperty\"#\n\x0f\x45xecutionPolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"&\n\x12ResultsCachePolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"\xb3\x02\n\x0e\x45xecuteRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x19\n\x11skip_cache_lookup\x18\x03 \x01(\x08\x12>\n\raction_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12J\n\x10\x65xecution_policy\x18\x07 \x01(\x0b\x32\x30.build.bazel.remote.execution.v2.ExecutionPolicy\x12Q\n\x14results_cache_policy\x18\x08 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicyJ\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"Z\n\x07LogFile\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x16\n\x0ehuman_readable\x18\x02 \x01(\x08\"\xd0\x02\n\x0f\x45xecuteResponse\x12=\n\x06result\x18\x01 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12\x15\n\rcached_result\x18\x02 \x01(\x08\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\x12U\n\x0bserver_logs\x18\x04 \x03(\x0b\x32@.build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry\x12\x0f\n\x07message\x18\x05 \x01(\t\x1a[\n\x0fServerLogsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x37\n\x05value\x18\x02 \x01(\x0b\x32(.build.bazel.remote.execution.v2.LogFile:\x02\x38\x01\"a\n\x0e\x45xecutionStage\"O\n\x05Value\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0f\n\x0b\x43\x41\x43HE_CHECK\x10\x01\x12\n\n\x06QUEUED\x10\x02\x12\r\n\tEXECUTING\x10\x03\x12\r\n\tCOMPLETED\x10\x04\"\xd8\x01\n\x18\x45xecuteOperationMetadata\x12\x44\n\x05stage\x18\x01 \x01(\x0e\x32\x35.build.bazel.remote.execution.v2.ExecutionStage.Value\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x1a\n\x12stdout_stream_name\x18\x03 \x01(\t\x12\x1a\n\x12stderr_stream_name\x18\x04 \x01(\t\"$\n\x14WaitExecutionRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xba\x01\n\x16GetActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\rinline_stdout\x18\x03 \x01(\x08\x12\x15\n\rinline_stderr\x18\x04 \x01(\x08\x12\x1b\n\x13inline_output_files\x18\x05 \x03(\t\"\x8b\x02\n\x19UpdateActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x44\n\raction_result\x18\x03 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12Q\n\x14results_cache_policy\x18\x04 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicy\"o\n\x17\x46indMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"a\n\x18\x46indMissingBlobsResponse\x12\x45\n\x14missing_blob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xd6\x01\n\x17\x42\x61tchUpdateBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12R\n\x08requests\x18\x02 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request\x1aP\n\x07Request\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\xda\x01\n\x18\x42\x61tchUpdateBlobsResponse\x12U\n\tresponses\x18\x01 \x03(\x0b\x32\x42.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"h\n\x15\x42\x61tchReadBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x38\n\x07\x64igests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xe4\x01\n\x16\x42\x61tchReadBlobsResponse\x12S\n\tresponses\x18\x01 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response\x1au\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\"\x8c\x01\n\x0eGetTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x11\n\tpage_size\x18\x03 \x01(\x05\x12\x12\n\npage_token\x18\x04 \x01(\t\"k\n\x0fGetTreeResponse\x12?\n\x0b\x64irectories\x18\x01 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"/\n\x16GetCapabilitiesRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\xe3\x02\n\x12ServerCapabilities\x12N\n\x12\x63\x61\x63he_capabilities\x18\x01 \x01(\x0b\x32\x32.build.bazel.remote.execution.v2.CacheCapabilities\x12V\n\x16\x65xecution_capabilities\x18\x02 \x01(\x0b\x32\x36.build.bazel.remote.execution.v2.ExecutionCapabilities\x12:\n\x16\x64\x65precated_api_version\x18\x03 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x33\n\x0flow_api_version\x18\x04 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x34\n\x10high_api_version\x18\x05 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\"f\n\x0e\x44igestFunction\"T\n\x05Value\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06SHA256\x10\x01\x12\x08\n\x04SHA1\x10\x02\x12\x07\n\x03MD5\x10\x03\x12\x07\n\x03VSO\x10\x04\x12\n\n\x06SHA384\x10\x05\x12\n\n\x06SHA512\x10\x06\"7\n\x1d\x41\x63tionCacheUpdateCapabilities\x12\x16\n\x0eupdate_enabled\x18\x01 \x01(\x08\"\xac\x01\n\x14PriorityCapabilities\x12W\n\npriorities\x18\x01 \x03(\x0b\x32\x43.build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange\x1a;\n\rPriorityRange\x12\x14\n\x0cmin_priority\x18\x01 \x01(\x05\x12\x14\n\x0cmax_priority\x18\x02 \x01(\x05\"P\n\x1bSymlinkAbsolutePathStrategy\"1\n\x05Value\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDISALLOWED\x10\x01\x12\x0b\n\x07\x41LLOWED\x10\x02\"\xb9\x03\n\x11\x43\x61\x63heCapabilities\x12N\n\x0f\x64igest_function\x18\x01 \x03(\x0e\x32\x35.build.bazel.remote.execution.v2.DigestFunction.Value\x12h\n action_cache_update_capabilities\x18\x02 \x01(\x0b\x32>.build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities\x12Z\n\x1b\x63\x61\x63he_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\x12\"\n\x1amax_batch_total_size_bytes\x18\x04 \x01(\x03\x12j\n\x1esymlink_absolute_path_strategy\x18\x05 \x01(\x0e\x32\x42.build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value\"\x80\x02\n\x15\x45xecutionCapabilities\x12N\n\x0f\x64igest_function\x18\x01 \x01(\x0e\x32\x35.build.bazel.remote.execution.v2.DigestFunction.Value\x12\x14\n\x0c\x65xec_enabled\x18\x02 \x01(\x08\x12^\n\x1f\x65xecution_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\x12!\n\x19supported_node_properties\x18\x04 \x03(\t\"6\n\x0bToolDetails\x12\x11\n\ttool_name\x18\x01 \x01(\t\x12\x14\n\x0ctool_version\x18\x02 \x01(\t\"\xa7\x01\n\x0fRequestMetadata\x12\x42\n\x0ctool_details\x18\x01 \x01(\x0b\x32,.build.bazel.remote.execution.v2.ToolDetails\x12\x11\n\taction_id\x18\x02 \x01(\t\x12\x1a\n\x12tool_invocation_id\x18\x03 \x01(\t\x12!\n\x19\x63orrelated_invocations_id\x18\x04 \x01(\t2\xb9\x02\n\tExecution\x12\x8e\x01\n\x07\x45xecute\x12/.build.bazel.remote.execution.v2.ExecuteRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/actions:execute:\x01*0\x01\x12\x9a\x01\n\rWaitExecution\x12\x35.build.bazel.remote.execution.v2.WaitExecutionRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{name=operations/**}:waitExecution:\x01*0\x01\x32\xd6\x03\n\x0b\x41\x63tionCache\x12\xd7\x01\n\x0fGetActionResult\x12\x37.build.bazel.remote.execution.v2.GetActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"\\\x82\xd3\xe4\x93\x02V\x12T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}\x12\xec\x01\n\x12UpdateActionResult\x12:.build.bazel.remote.execution.v2.UpdateActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"k\x82\xd3\xe4\x93\x02\x65\x1aT/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}:\raction_result2\x9b\x06\n\x19\x43ontentAddressableStorage\x12\xbc\x01\n\x10\x46indMissingBlobs\x12\x38.build.bazel.remote.execution.v2.FindMissingBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.FindMissingBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:findMissing:\x01*\x12\xbc\x01\n\x10\x42\x61tchUpdateBlobs\x12\x38.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:batchUpdate:\x01*\x12\xb4\x01\n\x0e\x42\x61tchReadBlobs\x12\x36.build.bazel.remote.execution.v2.BatchReadBlobsRequest\x1a\x37.build.bazel.remote.execution.v2.BatchReadBlobsResponse\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/blobs:batchRead:\x01*\x12\xc8\x01\n\x07GetTree\x12/.build.bazel.remote.execution.v2.GetTreeRequest\x1a\x30.build.bazel.remote.execution.v2.GetTreeResponse\"X\x82\xd3\xe4\x93\x02R\x12P/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree0\x01\x32\xbd\x01\n\x0c\x43\x61pabilities\x12\xac\x01\n\x0fGetCapabilities\x12\x37.build.bazel.remote.execution.v2.GetCapabilitiesRequest\x1a\x33.build.bazel.remote.execution.v2.ServerCapabilities\"+\x82\xd3\xe4\x93\x02%\x12#/v2/{instance_name=**}/capabilitiesBr\n\x1f\x62uild.bazel.remote.execution.v2B\x14RemoteExecutionProtoP\x01Z\x0fremoteexecution\xa2\x02\x03REX\xaa\x02\x1f\x42uild.Bazel.Remote.Execution.V2b\x06proto3'
+ serialized_pb=b'\n6build/bazel/remote/execution/v2/remote_execution.proto\x12\x1f\x62uild.bazel.remote.execution.v2\x1a\x1f\x62uild/bazel/semver/semver.proto\x1a\x1cgoogle/api/annotations.proto\x1a#google/longrunning/operations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x17google/rpc/status.proto\"\xdb\x01\n\x06\x41\x63tion\x12?\n\x0e\x63ommand_digest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x42\n\x11input_root_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12*\n\x07timeout\x18\x06 \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0c\x64o_not_cache\x18\x07 \x01(\x08J\x04\x08\x03\x10\x06J\x04\x08\x08\x10\t\"\xed\x02\n\x07\x43ommand\x12\x11\n\targuments\x18\x01 \x03(\t\x12[\n\x15\x65nvironment_variables\x18\x02 \x03(\x0b\x32<.build.bazel.remote.execution.v2.Command.EnvironmentVariable\x12\x14\n\x0coutput_files\x18\x03 \x03(\t\x12\x1a\n\x12output_directories\x18\x04 \x03(\t\x12\x14\n\x0coutput_paths\x18\x07 \x03(\t\x12;\n\x08platform\x18\x05 \x01(\x0b\x32).build.bazel.remote.execution.v2.Platform\x12\x19\n\x11working_directory\x18\x06 \x01(\t\x12\x1e\n\x16output_node_properties\x18\x08 \x03(\t\x1a\x32\n\x13\x45nvironmentVariable\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"{\n\x08Platform\x12\x46\n\nproperties\x18\x01 \x03(\x0b\x32\x32.build.bazel.remote.execution.v2.Platform.Property\x1a\'\n\x08Property\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\x9a\x02\n\tDirectory\x12\x38\n\x05\x66iles\x18\x01 \x03(\x0b\x32).build.bazel.remote.execution.v2.FileNode\x12\x43\n\x0b\x64irectories\x18\x02 \x03(\x0b\x32..build.bazel.remote.execution.v2.DirectoryNode\x12>\n\x08symlinks\x18\x03 \x03(\x0b\x32,.build.bazel.remote.execution.v2.SymlinkNode\x12H\n\x0fnode_properties\x18\x05 \x01(\x0b\x32/.build.bazel.remote.execution.v2.NodePropertiesJ\x04\x08\x04\x10\x05\"+\n\x0cNodeProperty\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t\"\xaf\x01\n\x0eNodeProperties\x12\x41\n\nproperties\x18\x01 \x03(\x0b\x32-.build.bazel.remote.execution.v2.NodeProperty\x12)\n\x05mtime\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\tunix_mode\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\"\xbe\x01\n\x08\x46ileNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08\x12H\n\x0fnode_properties\x18\x06 \x01(\x0b\x32/.build.bazel.remote.execution.v2.NodePropertiesJ\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06\"V\n\rDirectoryNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"{\n\x0bSymlinkNode\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\x12H\n\x0fnode_properties\x18\x04 \x01(\x0b\x32/.build.bazel.remote.execution.v2.NodePropertiesJ\x04\x08\x03\x10\x04\"*\n\x06\x44igest\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\x03\"\xec\x04\n\x16\x45xecutedActionMetadata\x12\x0e\n\x06worker\x18\x01 \x01(\t\x12\x34\n\x10queued_timestamp\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12:\n\x16worker_start_timestamp\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12>\n\x1aworker_completed_timestamp\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12?\n\x1binput_fetch_start_timestamp\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x43\n\x1finput_fetch_completed_timestamp\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12=\n\x19\x65xecution_start_timestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1d\x65xecution_completed_timestamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x41\n\x1doutput_upload_start_timestamp\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x45\n!output_upload_completed_timestamp\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x9f\x05\n\x0c\x41\x63tionResult\x12\x41\n\x0coutput_files\x18\x02 \x03(\x0b\x32+.build.bazel.remote.execution.v2.OutputFile\x12L\n\x14output_file_symlinks\x18\n \x03(\x0b\x32..build.bazel.remote.execution.v2.OutputSymlink\x12G\n\x0foutput_symlinks\x18\x0c \x03(\x0b\x32..build.bazel.remote.execution.v2.OutputSymlink\x12L\n\x12output_directories\x18\x03 \x03(\x0b\x32\x30.build.bazel.remote.execution.v2.OutputDirectory\x12Q\n\x19output_directory_symlinks\x18\x0b \x03(\x0b\x32..build.bazel.remote.execution.v2.OutputSymlink\x12\x11\n\texit_code\x18\x04 \x01(\x05\x12\x12\n\nstdout_raw\x18\x05 \x01(\x0c\x12>\n\rstdout_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x12\n\nstderr_raw\x18\x07 \x01(\x0c\x12>\n\rstderr_digest\x18\x08 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12S\n\x12\x65xecution_metadata\x18\t \x01(\x0b\x32\x37.build.bazel.remote.execution.v2.ExecutedActionMetadataJ\x04\x08\x01\x10\x02\"\xd2\x01\n\nOutputFile\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\ris_executable\x18\x04 \x01(\x08\x12\x10\n\x08\x63ontents\x18\x05 \x01(\x0c\x12H\n\x0fnode_properties\x18\x07 \x01(\x0b\x32/.build.bazel.remote.execution.v2.NodePropertiesJ\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07\"~\n\x04Tree\x12\x38\n\x04root\x18\x01 \x01(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12<\n\x08\x63hildren\x18\x02 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\"c\n\x0fOutputDirectory\x12\x0c\n\x04path\x18\x01 \x01(\t\x12<\n\x0btree_digest\x18\x03 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.DigestJ\x04\x08\x02\x10\x03\"}\n\rOutputSymlink\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x0e\n\x06target\x18\x02 \x01(\t\x12H\n\x0fnode_properties\x18\x04 \x01(\x0b\x32/.build.bazel.remote.execution.v2.NodePropertiesJ\x04\x08\x03\x10\x04\"#\n\x0f\x45xecutionPolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"&\n\x12ResultsCachePolicy\x12\x10\n\x08priority\x18\x01 \x01(\x05\"\xb3\x02\n\x0e\x45xecuteRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x19\n\x11skip_cache_lookup\x18\x03 \x01(\x08\x12>\n\raction_digest\x18\x06 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12J\n\x10\x65xecution_policy\x18\x07 \x01(\x0b\x32\x30.build.bazel.remote.execution.v2.ExecutionPolicy\x12Q\n\x14results_cache_policy\x18\x08 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicyJ\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06\"Z\n\x07LogFile\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x16\n\x0ehuman_readable\x18\x02 \x01(\x08\"\xd0\x02\n\x0f\x45xecuteResponse\x12=\n\x06result\x18\x01 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12\x15\n\rcached_result\x18\x02 \x01(\x08\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\x12U\n\x0bserver_logs\x18\x04 \x03(\x0b\x32@.build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry\x12\x0f\n\x07message\x18\x05 \x01(\t\x1a[\n\x0fServerLogsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x37\n\x05value\x18\x02 \x01(\x0b\x32(.build.bazel.remote.execution.v2.LogFile:\x02\x38\x01\"a\n\x0e\x45xecutionStage\"O\n\x05Value\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0f\n\x0b\x43\x41\x43HE_CHECK\x10\x01\x12\n\n\x06QUEUED\x10\x02\x12\r\n\tEXECUTING\x10\x03\x12\r\n\tCOMPLETED\x10\x04\"\xd8\x01\n\x18\x45xecuteOperationMetadata\x12\x44\n\x05stage\x18\x01 \x01(\x0e\x32\x35.build.bazel.remote.execution.v2.ExecutionStage.Value\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x1a\n\x12stdout_stream_name\x18\x03 \x01(\t\x12\x1a\n\x12stderr_stream_name\x18\x04 \x01(\t\"$\n\x14WaitExecutionRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xba\x01\n\x16GetActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x15\n\rinline_stdout\x18\x03 \x01(\x08\x12\x15\n\rinline_stderr\x18\x04 \x01(\x08\x12\x1b\n\x13inline_output_files\x18\x05 \x03(\t\"\x8b\x02\n\x19UpdateActionResultRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12>\n\raction_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x44\n\raction_result\x18\x03 \x01(\x0b\x32-.build.bazel.remote.execution.v2.ActionResult\x12Q\n\x14results_cache_policy\x18\x04 \x01(\x0b\x32\x33.build.bazel.remote.execution.v2.ResultsCachePolicy\"o\n\x17\x46indMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"a\n\x18\x46indMissingBlobsResponse\x12\x45\n\x14missing_blob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xd6\x01\n\x17\x42\x61tchUpdateBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12R\n\x08requests\x18\x02 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request\x1aP\n\x07Request\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\xda\x01\n\x18\x42\x61tchUpdateBlobsResponse\x12U\n\tresponses\x18\x01 \x03(\x0b\x32\x42.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"h\n\x15\x42\x61tchReadBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x38\n\x07\x64igests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xe4\x01\n\x16\x42\x61tchReadBlobsResponse\x12S\n\tresponses\x18\x01 \x03(\x0b\x32@.build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response\x1au\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\"\x8c\x01\n\x0eGetTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x11\n\tpage_size\x18\x03 \x01(\x05\x12\x12\n\npage_token\x18\x04 \x01(\t\"k\n\x0fGetTreeResponse\x12?\n\x0b\x64irectories\x18\x01 \x03(\x0b\x32*.build.bazel.remote.execution.v2.Directory\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"/\n\x16GetCapabilitiesRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\xe3\x02\n\x12ServerCapabilities\x12N\n\x12\x63\x61\x63he_capabilities\x18\x01 \x01(\x0b\x32\x32.build.bazel.remote.execution.v2.CacheCapabilities\x12V\n\x16\x65xecution_capabilities\x18\x02 \x01(\x0b\x32\x36.build.bazel.remote.execution.v2.ExecutionCapabilities\x12:\n\x16\x64\x65precated_api_version\x18\x03 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x33\n\x0flow_api_version\x18\x04 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\x12\x34\n\x10high_api_version\x18\x05 \x01(\x0b\x32\x1a.build.bazel.semver.SemVer\"f\n\x0e\x44igestFunction\"T\n\x05Value\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06SHA256\x10\x01\x12\x08\n\x04SHA1\x10\x02\x12\x07\n\x03MD5\x10\x03\x12\x07\n\x03VSO\x10\x04\x12\n\n\x06SHA384\x10\x05\x12\n\n\x06SHA512\x10\x06\"7\n\x1d\x41\x63tionCacheUpdateCapabilities\x12\x16\n\x0eupdate_enabled\x18\x01 \x01(\x08\"\xac\x01\n\x14PriorityCapabilities\x12W\n\npriorities\x18\x01 \x03(\x0b\x32\x43.build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange\x1a;\n\rPriorityRange\x12\x14\n\x0cmin_priority\x18\x01 \x01(\x05\x12\x14\n\x0cmax_priority\x18\x02 \x01(\x05\"P\n\x1bSymlinkAbsolutePathStrategy\"1\n\x05Value\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0e\n\nDISALLOWED\x10\x01\x12\x0b\n\x07\x41LLOWED\x10\x02\"\xb9\x03\n\x11\x43\x61\x63heCapabilities\x12N\n\x0f\x64igest_function\x18\x01 \x03(\x0e\x32\x35.build.bazel.remote.execution.v2.DigestFunction.Value\x12h\n action_cache_update_capabilities\x18\x02 \x01(\x0b\x32>.build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities\x12Z\n\x1b\x63\x61\x63he_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\x12\"\n\x1amax_batch_total_size_bytes\x18\x04 \x01(\x03\x12j\n\x1esymlink_absolute_path_strategy\x18\x05 \x01(\x0e\x32\x42.build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value\"\x80\x02\n\x15\x45xecutionCapabilities\x12N\n\x0f\x64igest_function\x18\x01 \x01(\x0e\x32\x35.build.bazel.remote.execution.v2.DigestFunction.Value\x12\x14\n\x0c\x65xec_enabled\x18\x02 \x01(\x08\x12^\n\x1f\x65xecution_priority_capabilities\x18\x03 \x01(\x0b\x32\x35.build.bazel.remote.execution.v2.PriorityCapabilities\x12!\n\x19supported_node_properties\x18\x04 \x03(\t\"6\n\x0bToolDetails\x12\x11\n\ttool_name\x18\x01 \x01(\t\x12\x14\n\x0ctool_version\x18\x02 \x01(\t\"\xa7\x01\n\x0fRequestMetadata\x12\x42\n\x0ctool_details\x18\x01 \x01(\x0b\x32,.build.bazel.remote.execution.v2.ToolDetails\x12\x11\n\taction_id\x18\x02 \x01(\t\x12\x1a\n\x12tool_invocation_id\x18\x03 \x01(\t\x12!\n\x19\x63orrelated_invocations_id\x18\x04 \x01(\t2\xb9\x02\n\tExecution\x12\x8e\x01\n\x07\x45xecute\x12/.build.bazel.remote.execution.v2.ExecuteRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/actions:execute:\x01*0\x01\x12\x9a\x01\n\rWaitExecution\x12\x35.build.bazel.remote.execution.v2.WaitExecutionRequest\x1a\x1d.google.longrunning.Operation\"1\x82\xd3\xe4\x93\x02+\"&/v2/{name=operations/**}:waitExecution:\x01*0\x01\x32\xd6\x03\n\x0b\x41\x63tionCache\x12\xd7\x01\n\x0fGetActionResult\x12\x37.build.bazel.remote.execution.v2.GetActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"\\\x82\xd3\xe4\x93\x02V\x12T/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}\x12\xec\x01\n\x12UpdateActionResult\x12:.build.bazel.remote.execution.v2.UpdateActionResultRequest\x1a-.build.bazel.remote.execution.v2.ActionResult\"k\x82\xd3\xe4\x93\x02\x65\x1aT/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}:\raction_result2\x9b\x06\n\x19\x43ontentAddressableStorage\x12\xbc\x01\n\x10\x46indMissingBlobs\x12\x38.build.bazel.remote.execution.v2.FindMissingBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.FindMissingBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:findMissing:\x01*\x12\xbc\x01\n\x10\x42\x61tchUpdateBlobs\x12\x38.build.bazel.remote.execution.v2.BatchUpdateBlobsRequest\x1a\x39.build.bazel.remote.execution.v2.BatchUpdateBlobsResponse\"3\x82\xd3\xe4\x93\x02-\"(/v2/{instance_name=**}/blobs:batchUpdate:\x01*\x12\xb4\x01\n\x0e\x42\x61tchReadBlobs\x12\x36.build.bazel.remote.execution.v2.BatchReadBlobsRequest\x1a\x37.build.bazel.remote.execution.v2.BatchReadBlobsResponse\"1\x82\xd3\xe4\x93\x02+\"&/v2/{instance_name=**}/blobs:batchRead:\x01*\x12\xc8\x01\n\x07GetTree\x12/.build.bazel.remote.execution.v2.GetTreeRequest\x1a\x30.build.bazel.remote.execution.v2.GetTreeResponse\"X\x82\xd3\xe4\x93\x02R\x12P/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree0\x01\x32\xbd\x01\n\x0c\x43\x61pabilities\x12\xac\x01\n\x0fGetCapabilities\x12\x37.build.bazel.remote.execution.v2.GetCapabilitiesRequest\x1a\x33.build.bazel.remote.execution.v2.ServerCapabilities\"+\x82\xd3\xe4\x93\x02%\x12#/v2/{instance_name=**}/capabilitiesBr\n\x1f\x62uild.bazel.remote.execution.v2B\x14RemoteExecutionProtoP\x01Z\x0fremoteexecution\xa2\x02\x03REX\xaa\x02\x1f\x42uild.Bazel.Remote.Execution.V2b\x06proto3'
,
- dependencies=[build_dot_bazel_dot_semver_dot_semver__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_longrunning_dot_operations__pb2.DESCRIPTOR,google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
+ dependencies=[build_dot_bazel_dot_semver_dot_semver__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_longrunning_dot_operations__pb2.DESCRIPTOR,google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
@@ -59,8 +60,8 @@ _EXECUTIONSTAGE_VALUE = _descriptor.EnumDescriptor(
],
containing_type=None,
serialized_options=None,
- serialized_start=4438,
- serialized_end=4517,
+ serialized_start=4688,
+ serialized_end=4767,
)
_sym_db.RegisterEnumDescriptor(_EXECUTIONSTAGE_VALUE)
@@ -101,8 +102,8 @@ _DIGESTFUNCTION_VALUE = _descriptor.EnumDescriptor(
],
containing_type=None,
serialized_options=None,
- serialized_start=6899,
- serialized_end=6983,
+ serialized_start=7149,
+ serialized_end=7233,
)
_sym_db.RegisterEnumDescriptor(_DIGESTFUNCTION_VALUE)
@@ -127,8 +128,8 @@ _SYMLINKABSOLUTEPATHSTRATEGY_VALUE = _descriptor.EnumDescriptor(
],
containing_type=None,
serialized_options=None,
- serialized_start=7248,
- serialized_end=7297,
+ serialized_start=7498,
+ serialized_end=7547,
)
_sym_db.RegisterEnumDescriptor(_SYMLINKABSOLUTEPATHSTRATEGY_VALUE)
@@ -180,8 +181,8 @@ _ACTION = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=282,
- serialized_end=501,
+ serialized_start=314,
+ serialized_end=533,
)
@@ -218,8 +219,8 @@ _COMMAND_ENVIRONMENTVARIABLE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=819,
- serialized_end=869,
+ serialized_start=851,
+ serialized_end=901,
)
_COMMAND = _descriptor.Descriptor(
@@ -297,8 +298,8 @@ _COMMAND = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=504,
- serialized_end=869,
+ serialized_start=536,
+ serialized_end=901,
)
@@ -335,8 +336,8 @@ _PLATFORM_PROPERTY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=955,
- serialized_end=994,
+ serialized_start=987,
+ serialized_end=1026,
)
_PLATFORM = _descriptor.Descriptor(
@@ -365,8 +366,8 @@ _PLATFORM = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=871,
- serialized_end=994,
+ serialized_start=903,
+ serialized_end=1026,
)
@@ -400,8 +401,8 @@ _DIRECTORY = _descriptor.Descriptor(
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='node_properties', full_name='build.bazel.remote.execution.v2.Directory.node_properties', index=3,
- number=4, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
+ number=5, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
@@ -417,8 +418,8 @@ _DIRECTORY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=997,
- serialized_end=1271,
+ serialized_start=1029,
+ serialized_end=1311,
)
@@ -455,8 +456,53 @@ _NODEPROPERTY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1273,
- serialized_end=1316,
+ serialized_start=1313,
+ serialized_end=1356,
+)
+
+
+_NODEPROPERTIES = _descriptor.Descriptor(
+ name='NodeProperties',
+ full_name='build.bazel.remote.execution.v2.NodeProperties',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='properties', full_name='build.bazel.remote.execution.v2.NodeProperties.properties', index=0,
+ number=1, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ serialized_options=None, file=DESCRIPTOR),
+ _descriptor.FieldDescriptor(
+ name='mtime', full_name='build.bazel.remote.execution.v2.NodeProperties.mtime', index=1,
+ number=2, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ serialized_options=None, file=DESCRIPTOR),
+ _descriptor.FieldDescriptor(
+ name='unix_mode', full_name='build.bazel.remote.execution.v2.NodeProperties.unix_mode', index=2,
+ number=3, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ serialized_options=None, file=DESCRIPTOR),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ serialized_options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=1359,
+ serialized_end=1534,
)
@@ -490,8 +536,8 @@ _FILENODE = _descriptor.Descriptor(
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='node_properties', full_name='build.bazel.remote.execution.v2.FileNode.node_properties', index=3,
- number=5, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
+ number=6, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
@@ -507,8 +553,8 @@ _FILENODE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1319,
- serialized_end=1501,
+ serialized_start=1537,
+ serialized_end=1727,
)
@@ -545,8 +591,8 @@ _DIRECTORYNODE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1503,
- serialized_end=1589,
+ serialized_start=1729,
+ serialized_end=1815,
)
@@ -573,8 +619,8 @@ _SYMLINKNODE = _descriptor.Descriptor(
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='node_properties', full_name='build.bazel.remote.execution.v2.SymlinkNode.node_properties', index=2,
- number=3, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
+ number=4, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
@@ -590,8 +636,8 @@ _SYMLINKNODE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1591,
- serialized_end=1706,
+ serialized_start=1817,
+ serialized_end=1940,
)
@@ -628,8 +674,8 @@ _DIGEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1708,
- serialized_end=1750,
+ serialized_start=1942,
+ serialized_end=1984,
)
@@ -722,8 +768,8 @@ _EXECUTEDACTIONMETADATA = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1753,
- serialized_end=2373,
+ serialized_start=1987,
+ serialized_end=2607,
)
@@ -823,8 +869,8 @@ _ACTIONRESULT = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=2376,
- serialized_end=3047,
+ serialized_start=2610,
+ serialized_end=3281,
)
@@ -865,8 +911,8 @@ _OUTPUTFILE = _descriptor.Descriptor(
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='node_properties', full_name='build.bazel.remote.execution.v2.OutputFile.node_properties', index=4,
- number=6, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
+ number=7, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
@@ -882,8 +928,8 @@ _OUTPUTFILE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3050,
- serialized_end=3252,
+ serialized_start=3284,
+ serialized_end=3494,
)
@@ -920,8 +966,8 @@ _TREE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3254,
- serialized_end=3380,
+ serialized_start=3496,
+ serialized_end=3622,
)
@@ -958,8 +1004,8 @@ _OUTPUTDIRECTORY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3382,
- serialized_end=3481,
+ serialized_start=3624,
+ serialized_end=3723,
)
@@ -986,8 +1032,8 @@ _OUTPUTSYMLINK = _descriptor.Descriptor(
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='node_properties', full_name='build.bazel.remote.execution.v2.OutputSymlink.node_properties', index=2,
- number=3, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
+ number=4, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
@@ -1003,8 +1049,8 @@ _OUTPUTSYMLINK = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3483,
- serialized_end=3600,
+ serialized_start=3725,
+ serialized_end=3850,
)
@@ -1034,8 +1080,8 @@ _EXECUTIONPOLICY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3602,
- serialized_end=3637,
+ serialized_start=3852,
+ serialized_end=3887,
)
@@ -1065,8 +1111,8 @@ _RESULTSCACHEPOLICY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3639,
- serialized_end=3677,
+ serialized_start=3889,
+ serialized_end=3927,
)
@@ -1124,8 +1170,8 @@ _EXECUTEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3680,
- serialized_end=3987,
+ serialized_start=3930,
+ serialized_end=4237,
)
@@ -1162,8 +1208,8 @@ _LOGFILE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=3989,
- serialized_end=4079,
+ serialized_start=4239,
+ serialized_end=4329,
)
@@ -1200,8 +1246,8 @@ _EXECUTERESPONSE_SERVERLOGSENTRY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=4327,
- serialized_end=4418,
+ serialized_start=4577,
+ serialized_end=4668,
)
_EXECUTERESPONSE = _descriptor.Descriptor(
@@ -1258,8 +1304,8 @@ _EXECUTERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=4082,
- serialized_end=4418,
+ serialized_start=4332,
+ serialized_end=4668,
)
@@ -1283,8 +1329,8 @@ _EXECUTIONSTAGE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=4420,
- serialized_end=4517,
+ serialized_start=4670,
+ serialized_end=4767,
)
@@ -1335,8 +1381,8 @@ _EXECUTEOPERATIONMETADATA = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=4520,
- serialized_end=4736,
+ serialized_start=4770,
+ serialized_end=4986,
)
@@ -1366,8 +1412,8 @@ _WAITEXECUTIONREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=4738,
- serialized_end=4774,
+ serialized_start=4988,
+ serialized_end=5024,
)
@@ -1425,8 +1471,8 @@ _GETACTIONRESULTREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=4777,
- serialized_end=4963,
+ serialized_start=5027,
+ serialized_end=5213,
)
@@ -1477,8 +1523,8 @@ _UPDATEACTIONRESULTREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=4966,
- serialized_end=5233,
+ serialized_start=5216,
+ serialized_end=5483,
)
@@ -1515,8 +1561,8 @@ _FINDMISSINGBLOBSREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5235,
- serialized_end=5346,
+ serialized_start=5485,
+ serialized_end=5596,
)
@@ -1546,8 +1592,8 @@ _FINDMISSINGBLOBSRESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5348,
- serialized_end=5445,
+ serialized_start=5598,
+ serialized_end=5695,
)
@@ -1584,8 +1630,8 @@ _BATCHUPDATEBLOBSREQUEST_REQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5582,
- serialized_end=5662,
+ serialized_start=5832,
+ serialized_end=5912,
)
_BATCHUPDATEBLOBSREQUEST = _descriptor.Descriptor(
@@ -1621,8 +1667,8 @@ _BATCHUPDATEBLOBSREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5448,
- serialized_end=5662,
+ serialized_start=5698,
+ serialized_end=5912,
)
@@ -1659,8 +1705,8 @@ _BATCHUPDATEBLOBSRESPONSE_RESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5780,
- serialized_end=5883,
+ serialized_start=6030,
+ serialized_end=6133,
)
_BATCHUPDATEBLOBSRESPONSE = _descriptor.Descriptor(
@@ -1689,8 +1735,8 @@ _BATCHUPDATEBLOBSRESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5665,
- serialized_end=5883,
+ serialized_start=5915,
+ serialized_end=6133,
)
@@ -1727,8 +1773,8 @@ _BATCHREADBLOBSREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5885,
- serialized_end=5989,
+ serialized_start=6135,
+ serialized_end=6239,
)
@@ -1772,8 +1818,8 @@ _BATCHREADBLOBSRESPONSE_RESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=6103,
- serialized_end=6220,
+ serialized_start=6353,
+ serialized_end=6470,
)
_BATCHREADBLOBSRESPONSE = _descriptor.Descriptor(
@@ -1802,8 +1848,8 @@ _BATCHREADBLOBSRESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=5992,
- serialized_end=6220,
+ serialized_start=6242,
+ serialized_end=6470,
)
@@ -1854,8 +1900,8 @@ _GETTREEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=6223,
- serialized_end=6363,
+ serialized_start=6473,
+ serialized_end=6613,
)
@@ -1892,8 +1938,8 @@ _GETTREERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=6365,
- serialized_end=6472,
+ serialized_start=6615,
+ serialized_end=6722,
)
@@ -1923,8 +1969,8 @@ _GETCAPABILITIESREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=6474,
- serialized_end=6521,
+ serialized_start=6724,
+ serialized_end=6771,
)
@@ -1982,8 +2028,8 @@ _SERVERCAPABILITIES = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=6524,
- serialized_end=6879,
+ serialized_start=6774,
+ serialized_end=7129,
)
@@ -2007,8 +2053,8 @@ _DIGESTFUNCTION = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=6881,
- serialized_end=6983,
+ serialized_start=7131,
+ serialized_end=7233,
)
@@ -2038,8 +2084,8 @@ _ACTIONCACHEUPDATECAPABILITIES = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=6985,
- serialized_end=7040,
+ serialized_start=7235,
+ serialized_end=7290,
)
@@ -2076,8 +2122,8 @@ _PRIORITYCAPABILITIES_PRIORITYRANGE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=7156,
- serialized_end=7215,
+ serialized_start=7406,
+ serialized_end=7465,
)
_PRIORITYCAPABILITIES = _descriptor.Descriptor(
@@ -2106,8 +2152,8 @@ _PRIORITYCAPABILITIES = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=7043,
- serialized_end=7215,
+ serialized_start=7293,
+ serialized_end=7465,
)
@@ -2131,8 +2177,8 @@ _SYMLINKABSOLUTEPATHSTRATEGY = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=7217,
- serialized_end=7297,
+ serialized_start=7467,
+ serialized_end=7547,
)
@@ -2190,8 +2236,8 @@ _CACHECAPABILITIES = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=7300,
- serialized_end=7741,
+ serialized_start=7550,
+ serialized_end=7991,
)
@@ -2242,8 +2288,8 @@ _EXECUTIONCAPABILITIES = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=7744,
- serialized_end=8000,
+ serialized_start=7994,
+ serialized_end=8250,
)
@@ -2280,8 +2326,8 @@ _TOOLDETAILS = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=8002,
- serialized_end=8056,
+ serialized_start=8252,
+ serialized_end=8306,
)
@@ -2332,8 +2378,8 @@ _REQUESTMETADATA = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=8059,
- serialized_end=8226,
+ serialized_start=8309,
+ serialized_end=8476,
)
_ACTION.fields_by_name['command_digest'].message_type = _DIGEST
@@ -2347,11 +2393,14 @@ _PLATFORM.fields_by_name['properties'].message_type = _PLATFORM_PROPERTY
_DIRECTORY.fields_by_name['files'].message_type = _FILENODE
_DIRECTORY.fields_by_name['directories'].message_type = _DIRECTORYNODE
_DIRECTORY.fields_by_name['symlinks'].message_type = _SYMLINKNODE
-_DIRECTORY.fields_by_name['node_properties'].message_type = _NODEPROPERTY
+_DIRECTORY.fields_by_name['node_properties'].message_type = _NODEPROPERTIES
+_NODEPROPERTIES.fields_by_name['properties'].message_type = _NODEPROPERTY
+_NODEPROPERTIES.fields_by_name['mtime'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_NODEPROPERTIES.fields_by_name['unix_mode'].message_type = google_dot_protobuf_dot_wrappers__pb2._UINT32VALUE
_FILENODE.fields_by_name['digest'].message_type = _DIGEST
-_FILENODE.fields_by_name['node_properties'].message_type = _NODEPROPERTY
+_FILENODE.fields_by_name['node_properties'].message_type = _NODEPROPERTIES
_DIRECTORYNODE.fields_by_name['digest'].message_type = _DIGEST
-_SYMLINKNODE.fields_by_name['node_properties'].message_type = _NODEPROPERTY
+_SYMLINKNODE.fields_by_name['node_properties'].message_type = _NODEPROPERTIES
_EXECUTEDACTIONMETADATA.fields_by_name['queued_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
_EXECUTEDACTIONMETADATA.fields_by_name['worker_start_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
_EXECUTEDACTIONMETADATA.fields_by_name['worker_completed_timestamp'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
@@ -2370,11 +2419,11 @@ _ACTIONRESULT.fields_by_name['stdout_digest'].message_type = _DIGEST
_ACTIONRESULT.fields_by_name['stderr_digest'].message_type = _DIGEST
_ACTIONRESULT.fields_by_name['execution_metadata'].message_type = _EXECUTEDACTIONMETADATA
_OUTPUTFILE.fields_by_name['digest'].message_type = _DIGEST
-_OUTPUTFILE.fields_by_name['node_properties'].message_type = _NODEPROPERTY
+_OUTPUTFILE.fields_by_name['node_properties'].message_type = _NODEPROPERTIES
_TREE.fields_by_name['root'].message_type = _DIRECTORY
_TREE.fields_by_name['children'].message_type = _DIRECTORY
_OUTPUTDIRECTORY.fields_by_name['tree_digest'].message_type = _DIGEST
-_OUTPUTSYMLINK.fields_by_name['node_properties'].message_type = _NODEPROPERTY
+_OUTPUTSYMLINK.fields_by_name['node_properties'].message_type = _NODEPROPERTIES
_EXECUTEREQUEST.fields_by_name['action_digest'].message_type = _DIGEST
_EXECUTEREQUEST.fields_by_name['execution_policy'].message_type = _EXECUTIONPOLICY
_EXECUTEREQUEST.fields_by_name['results_cache_policy'].message_type = _RESULTSCACHEPOLICY
@@ -2428,6 +2477,7 @@ DESCRIPTOR.message_types_by_name['Command'] = _COMMAND
DESCRIPTOR.message_types_by_name['Platform'] = _PLATFORM
DESCRIPTOR.message_types_by_name['Directory'] = _DIRECTORY
DESCRIPTOR.message_types_by_name['NodeProperty'] = _NODEPROPERTY
+DESCRIPTOR.message_types_by_name['NodeProperties'] = _NODEPROPERTIES
DESCRIPTOR.message_types_by_name['FileNode'] = _FILENODE
DESCRIPTOR.message_types_by_name['DirectoryNode'] = _DIRECTORYNODE
DESCRIPTOR.message_types_by_name['SymlinkNode'] = _SYMLINKNODE
@@ -2519,6 +2569,13 @@ NodeProperty = _reflection.GeneratedProtocolMessageType('NodeProperty', (_messag
})
_sym_db.RegisterMessage(NodeProperty)
+NodeProperties = _reflection.GeneratedProtocolMessageType('NodeProperties', (_message.Message,), {
+ 'DESCRIPTOR' : _NODEPROPERTIES,
+ '__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
+ # @@protoc_insertion_point(class_scope:build.bazel.remote.execution.v2.NodeProperties)
+ })
+_sym_db.RegisterMessage(NodeProperties)
+
FileNode = _reflection.GeneratedProtocolMessageType('FileNode', (_message.Message,), {
'DESCRIPTOR' : _FILENODE,
'__module__' : 'build.bazel.remote.execution.v2.remote_execution_pb2'
@@ -2835,8 +2892,8 @@ _EXECUTION = _descriptor.ServiceDescriptor(
file=DESCRIPTOR,
index=0,
serialized_options=None,
- serialized_start=8229,
- serialized_end=8542,
+ serialized_start=8479,
+ serialized_end=8792,
methods=[
_descriptor.MethodDescriptor(
name='Execute',
@@ -2868,8 +2925,8 @@ _ACTIONCACHE = _descriptor.ServiceDescriptor(
file=DESCRIPTOR,
index=1,
serialized_options=None,
- serialized_start=8545,
- serialized_end=9015,
+ serialized_start=8795,
+ serialized_end=9265,
methods=[
_descriptor.MethodDescriptor(
name='GetActionResult',
@@ -2901,8 +2958,8 @@ _CONTENTADDRESSABLESTORAGE = _descriptor.ServiceDescriptor(
file=DESCRIPTOR,
index=2,
serialized_options=None,
- serialized_start=9018,
- serialized_end=9813,
+ serialized_start=9268,
+ serialized_end=10063,
methods=[
_descriptor.MethodDescriptor(
name='FindMissingBlobs',
@@ -2952,8 +3009,8 @@ _CAPABILITIES = _descriptor.ServiceDescriptor(
file=DESCRIPTOR,
index=3,
serialized_options=None,
- serialized_start=9816,
- serialized_end=10005,
+ serialized_start=10066,
+ serialized_end=10255,
methods=[
_descriptor.MethodDescriptor(
name='GetCapabilities',
diff --git a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
index e0fd39a28..33ca1c6aa 100644
--- a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
+++ b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
@@ -325,6 +325,10 @@ class ContentAddressableStorageStub(object):
used in subsequent calls (e.g. to
[Execute][build.bazel.remote.execution.v2.Execution.Execute]).
+ Servers MUST behave as though empty blobs are always available, even if they
+ have not been uploaded. Clients MAY optimize away the uploading or
+ downloading of empty blobs.
+
As with other services in the Remote Execution API, any call may return an
error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
information about when the client should retry the request; clients SHOULD
@@ -424,6 +428,10 @@ class ContentAddressableStorageServicer(object):
used in subsequent calls (e.g. to
[Execute][build.bazel.remote.execution.v2.Execution.Execute]).
+ Servers MUST behave as though empty blobs are always available, even if they
+ have not been uploaded. Clients MAY optimize away the uploading or
+ downloading of empty blobs.
+
As with other services in the Remote Execution API, any call may return an
error with a [RetryInfo][google.rpc.RetryInfo] error detail providing
information about when the client should retry the request; clients SHOULD
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas.proto b/src/buildstream/_protos/build/buildgrid/local_cas.proto
index 722ac70d0..4aa9244ff 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas.proto
+++ b/src/buildstream/_protos/build/buildgrid/local_cas.proto
@@ -17,7 +17,6 @@ syntax = "proto3";
package build.buildgrid;
import "build/bazel/remote/execution/v2/remote_execution.proto";
-import "google/api/annotations.proto";
import "google/rpc/status.proto";
service LocalContentAddressableStorage {
@@ -346,7 +345,8 @@ message CaptureFilesResponse {
bool is_executable = 4;
// The node properties of the captured file.
- repeated build.bazel.remote.execution.v2.NodeProperty node_properties = 5;
+ reserved 5;
+ build.bazel.remote.execution.v2.NodeProperties node_properties = 6;
}
// The responses to the requests.
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
index f13cdb93d..e2b48159c 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
+++ b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
@@ -12,7 +12,6 @@ _sym_db = _symbol_database.Default()
from buildstream._protos.build.bazel.remote.execution.v2 import remote_execution_pb2 as build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2
-from buildstream._protos.google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
from buildstream._protos.google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
@@ -21,9 +20,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
package='build.buildgrid',
syntax='proto3',
serialized_options=None,
- serialized_pb=b'\n\x1f\x62uild/buildgrid/local_cas.proto\x12\x0f\x62uild.buildgrid\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/rpc/status.proto\"p\n\x18\x46\x65tchMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xcc\x01\n\x19\x46\x65tchMissingBlobsResponse\x12\x46\n\tresponses\x18\x01 \x03(\x0b\x32\x33.build.buildgrid.FetchMissingBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"q\n\x19UploadMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xce\x01\n\x1aUploadMissingBlobsResponse\x12G\n\tresponses\x18\x01 \x03(\x0b\x32\x34.build.buildgrid.UploadMissingBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"\x81\x01\n\x10\x46\x65tchTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x18\n\x10\x66\x65tch_file_blobs\x18\x03 \x01(\x08\"\x13\n\x11\x46\x65tchTreeResponse\"h\n\x11UploadTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x14\n\x12UploadTreeResponse\"u\n\x10StageTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04path\x18\x03 \x01(\t\"!\n\x11StageTreeResponse\x12\x0c\n\x04path\x18\x01 \x01(\t\"n\n\x12\x43\x61ptureTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x03(\t\x12\x1a\n\x12\x62ypass_local_cache\x18\x03 \x01(\x08\x12\x17\n\x0fnode_properties\x18\x04 \x03(\t\"\xd3\x01\n\x13\x43\x61ptureTreeResponse\x12@\n\tresponses\x18\x01 \x03(\x0b\x32-.build.buildgrid.CaptureTreeResponse.Response\x1az\n\x08Response\x12\x0c\n\x04path\x18\x01 \x01(\t\x12<\n\x0btree_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\"o\n\x13\x43\x61ptureFilesRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x03(\t\x12\x1a\n\x12\x62ypass_local_cache\x18\x03 \x01(\x08\x12\x17\n\x0fnode_properties\x18\x04 \x03(\t\"\xb0\x02\n\x14\x43\x61ptureFilesResponse\x12\x41\n\tresponses\x18\x01 \x03(\x0b\x32..build.buildgrid.CaptureFilesResponse.Response\x1a\xd4\x01\n\x08Response\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\x12\x15\n\ris_executable\x18\x04 \x01(\x08\x12\x46\n\x0fnode_properties\x18\x05 \x03(\x0b\x32-.build.bazel.remote.execution.v2.NodeProperty\"\x83\x01\n\x1fGetInstanceNameForRemoteRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rinstance_name\x18\x02 \x01(\t\x12\x13\n\x0bserver_cert\x18\x03 \x01(\x0c\x12\x12\n\nclient_key\x18\x04 \x01(\x0c\x12\x13\n\x0b\x63lient_cert\x18\x05 \x01(\x0c\"9\n GetInstanceNameForRemoteResponse\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\x1a\n\x18GetLocalDiskUsageRequest\"D\n\x19GetLocalDiskUsageResponse\x12\x12\n\nsize_bytes\x18\x01 \x01(\x03\x12\x13\n\x0bquota_bytes\x18\x02 \x01(\x03\x32\xb5\x07\n\x1eLocalContentAddressableStorage\x12l\n\x11\x46\x65tchMissingBlobs\x12).build.buildgrid.FetchMissingBlobsRequest\x1a*.build.buildgrid.FetchMissingBlobsResponse\"\x00\x12o\n\x12UploadMissingBlobs\x12*.build.buildgrid.UploadMissingBlobsRequest\x1a+.build.buildgrid.UploadMissingBlobsResponse\"\x00\x12T\n\tFetchTree\x12!.build.buildgrid.FetchTreeRequest\x1a\".build.buildgrid.FetchTreeResponse\"\x00\x12W\n\nUploadTree\x12\".build.buildgrid.UploadTreeRequest\x1a#.build.buildgrid.UploadTreeResponse\"\x00\x12X\n\tStageTree\x12!.build.buildgrid.StageTreeRequest\x1a\".build.buildgrid.StageTreeResponse\"\x00(\x01\x30\x01\x12Z\n\x0b\x43\x61ptureTree\x12#.build.buildgrid.CaptureTreeRequest\x1a$.build.buildgrid.CaptureTreeResponse\"\x00\x12]\n\x0c\x43\x61ptureFiles\x12$.build.buildgrid.CaptureFilesRequest\x1a%.build.buildgrid.CaptureFilesResponse\"\x00\x12\x81\x01\n\x18GetInstanceNameForRemote\x12\x30.build.buildgrid.GetInstanceNameForRemoteRequest\x1a\x31.build.buildgrid.GetInstanceNameForRemoteResponse\"\x00\x12l\n\x11GetLocalDiskUsage\x12).build.buildgrid.GetLocalDiskUsageRequest\x1a*.build.buildgrid.GetLocalDiskUsageResponse\"\x00\x62\x06proto3'
+ serialized_pb=b'\n\x1f\x62uild/buildgrid/local_cas.proto\x12\x0f\x62uild.buildgrid\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x17google/rpc/status.proto\"p\n\x18\x46\x65tchMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xcc\x01\n\x19\x46\x65tchMissingBlobsResponse\x12\x46\n\tresponses\x18\x01 \x03(\x0b\x32\x33.build.buildgrid.FetchMissingBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"q\n\x19UploadMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 \x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xce\x01\n\x1aUploadMissingBlobsResponse\x12G\n\tresponses\x18\x01 \x03(\x0b\x32\x34.build.buildgrid.UploadMissingBlobsResponse.Response\x1ag\n\x08Response\x12\x37\n\x06\x64igest\x18\x01 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x02 \x01(\x0b\x32\x12.google.rpc.Status\"\x81\x01\n\x10\x46\x65tchTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x18\n\x10\x66\x65tch_file_blobs\x18\x03 \x01(\x08\"\x13\n\x11\x46\x65tchTreeResponse\"h\n\x11UploadTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\x14\n\x12UploadTreeResponse\"u\n\x10StageTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12<\n\x0broot_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\x0c\n\x04path\x18\x03 \x01(\t\"!\n\x11StageTreeResponse\x12\x0c\n\x04path\x18\x01 \x01(\t\"n\n\x12\x43\x61ptureTreeRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x03(\t\x12\x1a\n\x12\x62ypass_local_cache\x18\x03 \x01(\x08\x12\x17\n\x0fnode_properties\x18\x04 \x03(\t\"\xd3\x01\n\x13\x43\x61ptureTreeResponse\x12@\n\tresponses\x18\x01 \x03(\x0b\x32-.build.buildgrid.CaptureTreeResponse.Response\x1az\n\x08Response\x12\x0c\n\x04path\x18\x01 \x01(\t\x12<\n\x0btree_digest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\"o\n\x13\x43\x61ptureFilesRequest\x12\x15\n\rinstance_name\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x03(\t\x12\x1a\n\x12\x62ypass_local_cache\x18\x03 \x01(\x08\x12\x17\n\x0fnode_properties\x18\x04 \x03(\t\"\xb8\x02\n\x14\x43\x61ptureFilesResponse\x12\x41\n\tresponses\x18\x01 \x03(\x0b\x32..build.buildgrid.CaptureFilesResponse.Response\x1a\xdc\x01\n\x08Response\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x37\n\x06\x64igest\x18\x02 \x01(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\x12\"\n\x06status\x18\x03 \x01(\x0b\x32\x12.google.rpc.Status\x12\x15\n\ris_executable\x18\x04 \x01(\x08\x12H\n\x0fnode_properties\x18\x06 \x01(\x0b\x32/.build.bazel.remote.execution.v2.NodePropertiesJ\x04\x08\x05\x10\x06\"\x83\x01\n\x1fGetInstanceNameForRemoteRequest\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x15\n\rinstance_name\x18\x02 \x01(\t\x12\x13\n\x0bserver_cert\x18\x03 \x01(\x0c\x12\x12\n\nclient_key\x18\x04 \x01(\x0c\x12\x13\n\x0b\x63lient_cert\x18\x05 \x01(\x0c\"9\n GetInstanceNameForRemoteResponse\x12\x15\n\rinstance_name\x18\x01 \x01(\t\"\x1a\n\x18GetLocalDiskUsageRequest\"D\n\x19GetLocalDiskUsageResponse\x12\x12\n\nsize_bytes\x18\x01 \x01(\x03\x12\x13\n\x0bquota_bytes\x18\x02 \x01(\x03\x32\xb5\x07\n\x1eLocalContentAddressableStorage\x12l\n\x11\x46\x65tchMissingBlobs\x12).build.buildgrid.FetchMissingBlobsRequest\x1a*.build.buildgrid.FetchMissingBlobsResponse\"\x00\x12o\n\x12UploadMissingBlobs\x12*.build.buildgrid.UploadMissingBlobsRequest\x1a+.build.buildgrid.UploadMissingBlobsResponse\"\x00\x12T\n\tFetchTree\x12!.build.buildgrid.FetchTreeRequest\x1a\".build.buildgrid.FetchTreeResponse\"\x00\x12W\n\nUploadTree\x12\".build.buildgrid.UploadTreeRequest\x1a#.build.buildgrid.UploadTreeResponse\"\x00\x12X\n\tStageTree\x12!.build.buildgrid.StageTreeRequest\x1a\".build.buildgrid.StageTreeResponse\"\x00(\x01\x30\x01\x12Z\n\x0b\x43\x61ptureTree\x12#.build.buildgrid.CaptureTreeRequest\x1a$.build.buildgrid.CaptureTreeResponse\"\x00\x12]\n\x0c\x43\x61ptureFiles\x12$.build.buildgrid.CaptureFilesRequest\x1a%.build.buildgrid.CaptureFilesResponse\"\x00\x12\x81\x01\n\x18GetInstanceNameForRemote\x12\x30.build.buildgrid.GetInstanceNameForRemoteRequest\x1a\x31.build.buildgrid.GetInstanceNameForRemoteResponse\"\x00\x12l\n\x11GetLocalDiskUsage\x12).build.buildgrid.GetLocalDiskUsageRequest\x1a*.build.buildgrid.GetLocalDiskUsageResponse\"\x00\x62\x06proto3'
,
- dependencies=[build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
+ dependencies=[build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2.DESCRIPTOR,google_dot_rpc_dot_status__pb2.DESCRIPTOR,])
@@ -61,8 +60,8 @@ _FETCHMISSINGBLOBSREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=163,
- serialized_end=275,
+ serialized_start=133,
+ serialized_end=245,
)
@@ -99,8 +98,8 @@ _FETCHMISSINGBLOBSRESPONSE_RESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=379,
- serialized_end=482,
+ serialized_start=349,
+ serialized_end=452,
)
_FETCHMISSINGBLOBSRESPONSE = _descriptor.Descriptor(
@@ -129,8 +128,8 @@ _FETCHMISSINGBLOBSRESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=278,
- serialized_end=482,
+ serialized_start=248,
+ serialized_end=452,
)
@@ -167,8 +166,8 @@ _UPLOADMISSINGBLOBSREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=484,
- serialized_end=597,
+ serialized_start=454,
+ serialized_end=567,
)
@@ -205,8 +204,8 @@ _UPLOADMISSINGBLOBSRESPONSE_RESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=379,
- serialized_end=482,
+ serialized_start=349,
+ serialized_end=452,
)
_UPLOADMISSINGBLOBSRESPONSE = _descriptor.Descriptor(
@@ -235,8 +234,8 @@ _UPLOADMISSINGBLOBSRESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=600,
- serialized_end=806,
+ serialized_start=570,
+ serialized_end=776,
)
@@ -280,8 +279,8 @@ _FETCHTREEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=809,
- serialized_end=938,
+ serialized_start=779,
+ serialized_end=908,
)
@@ -304,8 +303,8 @@ _FETCHTREERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=940,
- serialized_end=959,
+ serialized_start=910,
+ serialized_end=929,
)
@@ -342,8 +341,8 @@ _UPLOADTREEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=961,
- serialized_end=1065,
+ serialized_start=931,
+ serialized_end=1035,
)
@@ -366,8 +365,8 @@ _UPLOADTREERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1067,
- serialized_end=1087,
+ serialized_start=1037,
+ serialized_end=1057,
)
@@ -411,8 +410,8 @@ _STAGETREEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1089,
- serialized_end=1206,
+ serialized_start=1059,
+ serialized_end=1176,
)
@@ -442,8 +441,8 @@ _STAGETREERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1208,
- serialized_end=1241,
+ serialized_start=1178,
+ serialized_end=1211,
)
@@ -494,8 +493,8 @@ _CAPTURETREEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1243,
- serialized_end=1353,
+ serialized_start=1213,
+ serialized_end=1323,
)
@@ -539,8 +538,8 @@ _CAPTURETREERESPONSE_RESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1445,
- serialized_end=1567,
+ serialized_start=1415,
+ serialized_end=1537,
)
_CAPTURETREERESPONSE = _descriptor.Descriptor(
@@ -569,8 +568,8 @@ _CAPTURETREERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1356,
- serialized_end=1567,
+ serialized_start=1326,
+ serialized_end=1537,
)
@@ -621,8 +620,8 @@ _CAPTUREFILESREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1569,
- serialized_end=1680,
+ serialized_start=1539,
+ serialized_end=1650,
)
@@ -663,8 +662,8 @@ _CAPTUREFILESRESPONSE_RESPONSE = _descriptor.Descriptor(
serialized_options=None, file=DESCRIPTOR),
_descriptor.FieldDescriptor(
name='node_properties', full_name='build.buildgrid.CaptureFilesResponse.Response.node_properties', index=4,
- number=5, type=11, cpp_type=10, label=3,
- has_default_value=False, default_value=[],
+ number=6, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
serialized_options=None, file=DESCRIPTOR),
@@ -680,8 +679,8 @@ _CAPTUREFILESRESPONSE_RESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1775,
- serialized_end=1987,
+ serialized_start=1745,
+ serialized_end=1965,
)
_CAPTUREFILESRESPONSE = _descriptor.Descriptor(
@@ -710,8 +709,8 @@ _CAPTUREFILESRESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1683,
- serialized_end=1987,
+ serialized_start=1653,
+ serialized_end=1965,
)
@@ -769,8 +768,8 @@ _GETINSTANCENAMEFORREMOTEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=1990,
- serialized_end=2121,
+ serialized_start=1968,
+ serialized_end=2099,
)
@@ -800,8 +799,8 @@ _GETINSTANCENAMEFORREMOTERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=2123,
- serialized_end=2180,
+ serialized_start=2101,
+ serialized_end=2158,
)
@@ -824,8 +823,8 @@ _GETLOCALDISKUSAGEREQUEST = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=2182,
- serialized_end=2208,
+ serialized_start=2160,
+ serialized_end=2186,
)
@@ -862,8 +861,8 @@ _GETLOCALDISKUSAGERESPONSE = _descriptor.Descriptor(
extension_ranges=[],
oneofs=[
],
- serialized_start=2210,
- serialized_end=2278,
+ serialized_start=2188,
+ serialized_end=2256,
)
_FETCHMISSINGBLOBSREQUEST.fields_by_name['blob_digests'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
@@ -885,7 +884,7 @@ _CAPTURETREERESPONSE_RESPONSE.containing_type = _CAPTURETREERESPONSE
_CAPTURETREERESPONSE.fields_by_name['responses'].message_type = _CAPTURETREERESPONSE_RESPONSE
_CAPTUREFILESRESPONSE_RESPONSE.fields_by_name['digest'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._DIGEST
_CAPTUREFILESRESPONSE_RESPONSE.fields_by_name['status'].message_type = google_dot_rpc_dot_status__pb2._STATUS
-_CAPTUREFILESRESPONSE_RESPONSE.fields_by_name['node_properties'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._NODEPROPERTY
+_CAPTUREFILESRESPONSE_RESPONSE.fields_by_name['node_properties'].message_type = build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2._NODEPROPERTIES
_CAPTUREFILESRESPONSE_RESPONSE.containing_type = _CAPTUREFILESRESPONSE
_CAPTUREFILESRESPONSE.fields_by_name['responses'].message_type = _CAPTUREFILESRESPONSE_RESPONSE
DESCRIPTOR.message_types_by_name['FetchMissingBlobsRequest'] = _FETCHMISSINGBLOBSREQUEST
@@ -1074,8 +1073,8 @@ _LOCALCONTENTADDRESSABLESTORAGE = _descriptor.ServiceDescriptor(
file=DESCRIPTOR,
index=0,
serialized_options=None,
- serialized_start=2281,
- serialized_end=3230,
+ serialized_start=2259,
+ serialized_end=3208,
methods=[
_descriptor.MethodDescriptor(
name='FetchMissingBlobs',
diff --git a/src/buildstream/element.py b/src/buildstream/element.py
index 404cae5e7..e3d4ffc68 100644
--- a/src/buildstream/element.py
+++ b/src/buildstream/element.py
@@ -2454,7 +2454,7 @@ class Element(Plugin):
platform = context.platform
if self._get_workspace():
- output_node_properties = ["MTime"]
+ output_node_properties = ["mtime"]
else:
output_node_properties = None
diff --git a/src/buildstream/plugins/sources/workspace.py b/src/buildstream/plugins/sources/workspace.py
index f1d965fa0..44d0889b3 100644
--- a/src/buildstream/plugins/sources/workspace.py
+++ b/src/buildstream/plugins/sources/workspace.py
@@ -96,7 +96,7 @@ class WorkspaceSource(Source):
def stage(self, directory: Directory) -> None:
assert isinstance(directory, Directory)
with self.timed_activity("Staging local files"):
- result = directory.import_files(self.path, properties=["MTime"])
+ result = directory.import_files(self.path, properties=["mtime"])
if result.overwritten or result.ignored:
raise SourceError(
diff --git a/src/buildstream/storage/_casbaseddirectory.py b/src/buildstream/storage/_casbaseddirectory.py
index c83918e4d..72a6beeef 100644
--- a/src/buildstream/storage/_casbaseddirectory.py
+++ b/src/buildstream/storage/_casbaseddirectory.py
@@ -29,16 +29,16 @@ See also: :ref:`sandboxing`.
import os
import stat
-import copy
import tarfile as tarfilelib
from contextlib import contextmanager
from io import StringIO
+from google.protobuf import timestamp_pb2
from .. import utils
from .._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
from .directory import Directory, VirtualDirectoryError, _FileType
from ._filebaseddirectory import FileBasedDirectory
-from ..utils import FileListResult, BST_ARBITRARY_TIMESTAMP, _get_file_mtimestamp
+from ..utils import FileListResult, BST_ARBITRARY_TIMESTAMP
class IndexEntry:
@@ -54,7 +54,7 @@ class IndexEntry:
is_executable=False,
buildstream_object=None,
modified=False,
- node_properties=None
+ mtime=None
):
self.name = name
self.type = entrytype
@@ -63,7 +63,7 @@ class IndexEntry:
self.is_executable = is_executable
self.buildstream_object = buildstream_object
self.modified = modified
- self.node_properties = copy.deepcopy(node_properties)
+ self.mtime = mtime
def get_directory(self, parent):
if not self.buildstream_object:
@@ -99,7 +99,7 @@ class IndexEntry:
digest=self.get_digest(),
target=self.target,
is_executable=self.is_executable,
- node_properties=self.node_properties,
+ mtime=self.mtime,
)
def __eq__(self, other: object) -> bool:
@@ -107,7 +107,7 @@ class IndexEntry:
return NotImplemented
def get_equivalency_properties(e: IndexEntry):
- return (e.name, e.type, e.target, e.is_executable, e.node_properties, e.get_digest())
+ return (e.name, e.type, e.target, e.is_executable, e.mtime, e.get_digest())
return get_equivalency_properties(self) == get_equivalency_properties(other)
@@ -142,7 +142,7 @@ class CasBasedDirectory(Directory):
self.__digest = None
self.index = {}
self.parent = parent
- self.__node_properties = []
+ self.__subtree_read_only = None
self._reset(digest=digest)
def _reset(self, *, digest=None):
@@ -159,17 +159,24 @@ class CasBasedDirectory(Directory):
except FileNotFoundError as e:
raise VirtualDirectoryError("Directory not found in local cache: {}".format(e)) from e
- self.__node_properties = list(pb2_directory.node_properties)
+ for prop in pb2_directory.node_properties.properties:
+ if prop.name == "SubtreeReadOnly":
+ self.__subtree_read_only = prop.value == "true"
for entry in pb2_directory.directories:
self.index[entry.name] = IndexEntry(entry.name, _FileType.DIRECTORY, digest=entry.digest)
for entry in pb2_directory.files:
+ if entry.node_properties.HasField("mtime"):
+ mtime = entry.node_properties.mtime
+ else:
+ mtime = None
+
self.index[entry.name] = IndexEntry(
entry.name,
_FileType.REGULAR_FILE,
digest=entry.digest,
is_executable=entry.is_executable,
- node_properties=list(entry.node_properties),
+ mtime=mtime,
)
for entry in pb2_directory.symlinks:
self.index[entry.name] = IndexEntry(entry.name, _FileType.SYMLINK, target=entry.target)
@@ -196,14 +203,10 @@ class CasBasedDirectory(Directory):
def _add_file(self, name, path, modified=False, can_link=False, properties=None):
digest = self.cas_cache.add_object(path=path, link_directly=can_link)
is_executable = os.access(path, os.X_OK)
- node_properties = []
- # see https://github.com/bazelbuild/remote-apis/blob/master/build/bazel/remote/execution/v2/nodeproperties.md
- # for supported node property specifications
- if properties and "MTime" in properties:
- node_property = remote_execution_pb2.NodeProperty()
- node_property.name = "MTime"
- node_property.value = _get_file_mtimestamp(path)
- node_properties.append(node_property)
+ mtime = None
+ if properties and "mtime" in properties:
+ mtime = timestamp_pb2.Timestamp()
+ utils._get_file_protobuf_mtimestamp(mtime, path)
entry = IndexEntry(
name,
@@ -211,7 +214,7 @@ class CasBasedDirectory(Directory):
digest=digest,
is_executable=is_executable,
modified=modified or name in self.index,
- node_properties=node_properties,
+ mtime=mtime,
)
self.index[name] = entry
@@ -817,9 +820,10 @@ class CasBasedDirectory(Directory):
# Create updated Directory proto
pb2_directory = remote_execution_pb2.Directory()
- if self.__node_properties:
- node_properties = sorted(self.__node_properties, key=lambda prop: prop.name)
- pb2_directory.node_properties.extend(node_properties)
+ if self.__subtree_read_only is not None:
+ node_property = pb2_directory.node_properties.properties.add()
+ node_property.name = "SubtreeReadOnly"
+ node_property.value = "true" if self.__subtree_read_only else "false"
for name, entry in sorted(self.index.items()):
if entry.type == _FileType.DIRECTORY:
@@ -839,9 +843,8 @@ class CasBasedDirectory(Directory):
filenode.name = name
filenode.digest.CopyFrom(entry.digest)
filenode.is_executable = entry.is_executable
- if entry.node_properties:
- node_properties = sorted(entry.node_properties, key=lambda prop: prop.name)
- filenode.node_properties.extend(node_properties)
+ if entry.mtime is not None:
+ filenode.node_properties.mtime.CopyFrom(entry.mtime)
elif entry.type == _FileType.SYMLINK:
symlinknode = pb2_directory.symlinks.add()
symlinknode.name = name
@@ -896,10 +899,8 @@ class CasBasedDirectory(Directory):
if entry.type == _FileType.DIRECTORY or entry.is_executable:
st_mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
- if entry.node_properties:
- for prop in entry.node_properties:
- if prop.name == "MTime" and prop.value:
- st_mtime = utils._parse_timestamp(prop.value)
+ if entry.mtime is not None:
+ st_mtime = utils._parse_protobuf_timestamp(entry.mtime)
return os.stat_result((st_mode, 0, 0, st_nlink, 0, 0, st_size, st_mtime, st_mtime, st_mtime))
@@ -921,11 +922,7 @@ class CasBasedDirectory(Directory):
yield from self.index.keys()
def _set_subtree_read_only(self, read_only):
- self.__node_properties = list(filter(lambda prop: prop.name != "SubtreeReadOnly", self.__node_properties))
- node_property = remote_execution_pb2.NodeProperty()
- node_property.name = "SubtreeReadOnly"
- node_property.value = "true" if read_only else "false"
- self.__node_properties.append(node_property)
+ self.__subtree_read_only = read_only
self.__invalidate_digest()
diff --git a/src/buildstream/storage/_filebaseddirectory.py b/src/buildstream/storage/_filebaseddirectory.py
index 12312299d..3f1fc599a 100644
--- a/src/buildstream/storage/_filebaseddirectory.py
+++ b/src/buildstream/storage/_filebaseddirectory.py
@@ -36,7 +36,6 @@ from .. import utils
from ..utils import link_files, copy_files, list_relative_paths, _get_link_mtime, BST_ARBITRARY_TIMESTAMP
from ..utils import _set_deterministic_user, _set_deterministic_mtime
from ..utils import FileListResult
-from .._exceptions import ImplError
# FileBasedDirectory intentionally doesn't call its superclass constuctor,
# which is meant to be unimplemented.
@@ -418,18 +417,12 @@ class FileBasedDirectory(Directory):
src_path = source_directory.cas_cache.objpath(entry.digest)
# fallback to copying if we require mtime support on this file
- if update_mtime or entry.node_properties:
+ if update_mtime or entry.mtime is not None:
utils.safe_copy(src_path, dest_path, result=result)
mtime = update_mtime
# mtime property will override specified mtime
- # see https://github.com/bazelbuild/remote-apis/blob/master/build/bazel/remote/execution/v2/nodeproperties.md
- # for supported node property specifications
- if entry.node_properties:
- for prop in entry.node_properties:
- if prop.name == "MTime" and prop.value:
- mtime = utils._parse_timestamp(prop.value)
- else:
- raise ImplError("{} is not a supported node property.".format(prop.name))
+ if entry.mtime is not None:
+ mtime = utils._parse_protobuf_timestamp(entry.mtime)
if mtime:
utils._set_file_mtime(dest_path, mtime)
else:
diff --git a/src/buildstream/utils.py b/src/buildstream/utils.py
index 29b3bf484..99c22d169 100644
--- a/src/buildstream/utils.py
+++ b/src/buildstream/utils.py
@@ -24,6 +24,7 @@ Utilities
import calendar
import errno
import hashlib
+import math
import os
import re
import shutil
@@ -39,6 +40,7 @@ from contextlib import contextmanager
from pathlib import Path
from typing import Callable, IO, Iterable, Iterator, Optional, Tuple, Union
from dateutil import parser as dateutil_parser
+from google.protobuf import timestamp_pb2
import psutil
@@ -179,6 +181,41 @@ def _parse_timestamp(timestamp: str) -> float:
raise UtilError(errmsg)
+def _make_protobuf_timestamp(timestamp: timestamp_pb2.Timestamp, timepoint: float):
+ """Obtain the Protobuf Timestamp represented by the time given in seconds.
+
+ Args:
+ timestamp: the Protobuf Timestamp to set
+ timepoint: the time since the epoch in seconds
+
+ """
+ timestamp.seconds = int(timepoint)
+ timestamp.nanos = int(math.modf(timepoint)[0] * 1e9)
+
+
+def _get_file_protobuf_mtimestamp(timestamp: timestamp_pb2.Timestamp, fullpath: str):
+ """Obtain the Protobuf Timestamp represented by the mtime of the
+ file at the given path."""
+ assert isinstance(fullpath, str), "Path to file must be a string: {}".format(str(fullpath))
+ try:
+ mtime = os.path.getmtime(fullpath)
+ except OSError:
+ raise UtilError("Failed to get mtime of file at {}".format(fullpath))
+ _make_protobuf_timestamp(timestamp, mtime)
+
+
+def _parse_protobuf_timestamp(timestamp: timestamp_pb2.Timestamp) -> float:
+ """Convert Protobuf Timestamp to seconds since epoch.
+
+ Args:
+ timestamp: the Protobuf Timestamp
+
+ Returns:
+ The time in seconds since epoch represented by the timestamp.
+ """
+ return timestamp.seconds + timestamp.nanos / 1e9
+
+
def _set_file_mtime(fullpath: str, seconds: Union[int, float]) -> None:
"""Set the access and modification times of the file at the given path
to the given time. The time of the file will be set with nanosecond
diff --git a/tests/internals/storage.py b/tests/internals/storage.py
index ea3f59b50..e9932e0a4 100644
--- a/tests/internals/storage.py
+++ b/tests/internals/storage.py
@@ -148,7 +148,7 @@ def test_merge_casdir_properties(tmpdir, datafiles, modification):
elif modification == "time":
os.utime(os.path.join(after, "root-file"), (200, 200))
- _test_merge_dirs(before, after, buildtree, str(tmpdir), properties=["MTime"])
+ _test_merge_dirs(before, after, buildtree, str(tmpdir), properties=["mtime"])
def _test_merge_dirs(
diff --git a/tests/internals/storage_vdir_import.py b/tests/internals/storage_vdir_import.py
index b302c630e..ffd727ffe 100644
--- a/tests/internals/storage_vdir_import.py
+++ b/tests/internals/storage_vdir_import.py
@@ -131,7 +131,7 @@ def file_contents_are(path, contents):
def create_new_casdir(root_number, cas_cache, tmpdir):
d = CasBasedDirectory(cas_cache)
- d.import_files(os.path.join(tmpdir, "content", "root{}".format(root_number)), properties=["MTime"])
+ d.import_files(os.path.join(tmpdir, "content", "root{}".format(root_number)), properties=["mtime"])
digest = d._get_digest()
assert digest.hash != empty_hash_ref
return d
@@ -199,7 +199,7 @@ def _import_test(tmpdir, original, overlay, generator_function, verify_contents=
assert duplicate_cas._get_digest().hash == d._get_digest().hash
d2 = create_new_casdir(overlay, cas_cache, tmpdir)
- d.import_files(d2, properties=["MTime"])
+ d.import_files(d2, properties=["mtime"])
export_dir = os.path.join(tmpdir, "output-{}-{}".format(original, overlay))
roundtrip_dir = os.path.join(tmpdir, "roundtrip-{}-{}".format(original, overlay))
d2.export_files(roundtrip_dir)
@@ -238,7 +238,7 @@ def _import_test(tmpdir, original, overlay, generator_function, verify_contents=
# Now do the same thing with filebaseddirectories and check the contents match
- duplicate_cas.import_files(roundtrip_dir, properties=["MTime"])
+ duplicate_cas.import_files(roundtrip_dir, properties=["mtime"])
assert duplicate_cas._get_digest().hash == d._get_digest().hash
finally: