<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="remotebuildexecution_v2.html">Remote Build Execution API</a> . <a href="remotebuildexecution_v2.blobs.html">blobs</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#batchRead">batchRead(instanceName, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Download many blobs at once.</p>
<p class="toc_element">
  <code><a href="#batchUpdate">batchUpdate(instanceName, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Upload many blobs at once.</p>
<p class="toc_element">
  <code><a href="#findMissing">findMissing(instanceName, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Determine if blobs are present in the CAS.</p>
<p class="toc_element">
  <code><a href="#getTree">getTree(instanceName, hash, sizeBytes, pageToken=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Fetch the entire directory tree rooted at a node.</p>
<p class="toc_element">
  <code><a href="#getTree_next">getTree_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="batchRead">batchRead(instanceName, body=None, x__xgafv=None)</code>
  <pre>Download many blobs at once.

The server may enforce a limit of the combined total size of blobs
to be downloaded using this API. This limit may be obtained using the
Capabilities API.
Requests exceeding the limit should either be split into smaller
chunks or downloaded using the
ByteStream API, as appropriate.

This request is equivalent to calling a Bytestream `Read` request
on each individual blob, in parallel. The requests may succeed or fail
independently.

Errors:

* `INVALID_ARGUMENT`: The client attempted to read more than the
  server supported limit.

Every error on individual read will be returned in the corresponding digest
status.

Args:
  instanceName: string, The instance of the execution system to operate against. A server may
support multiple instances of the execution system (with their own workers,
storage, caches, etc.). The server MAY require use of this field to select
between them in an implementation-defined fashion, otherwise it can be
omitted. (required)
  body: object, The request body.
    The object takes the form of:

{ # A request message for
      # ContentAddressableStorage.BatchReadBlobs.
    &quot;digests&quot;: [ # The individual blob digests.
      { # A content digest. A digest for a given blob consists of the size of the blob
          # and its hash. The hash algorithm to use is defined by the server.
          #
          # The size is considered to be an integral part of the digest and cannot be
          # separated. That is, even if the `hash` field is correctly specified but
          # `size_bytes` is not, the server MUST reject the request.
          #
          # The reason for including the size in the digest is as follows: in a great
          # many cases, the server needs to know the size of the blob it is about to work
          # with prior to starting an operation with it, such as flattening Merkle tree
          # structures or streaming it to a worker. Technically, the server could
          # implement a separate metadata store, but this results in a significantly more
          # complicated implementation as opposed to having the client specify the size
          # up-front (or storing the size along with the digest in every message where
          # digests are embedded). This does mean that the API leaks some implementation
          # details of (what we consider to be) a reasonable server implementation, but
          # we consider this to be a worthwhile tradeoff.
          #
          # When a `Digest` is used to refer to a proto message, it always refers to the
          # message in binary encoded form. To ensure consistent hashing, clients and
          # servers MUST ensure that they serialize messages according to the following
          # rules, even if there are alternate valid encodings for the same message:
          #
          # * Fields are serialized in tag order.
          # * There are no unknown fields.
          # * There are no duplicate fields.
          # * Fields are serialized according to the default semantics for their type.
          #
          # Most protocol buffer implementations will always follow these rules when
          # serializing, but care should be taken to avoid shortcuts. For instance,
          # concatenating two messages to merge them may produce duplicate fields.
        &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
        &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
            # exactly 64 characters long.
      },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A response message for
      # ContentAddressableStorage.BatchReadBlobs.
    &quot;responses&quot;: [ # The responses to the requests.
      { # A response corresponding to a single blob that the client tried to download.
        &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # The result of attempting to download that blob.
            # different programming environments, including REST APIs and RPC APIs. It is
            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
            # three pieces of data: error code, error message, and error details.
            #
            # You can find out more about this error model and how to work with it in the
            # [API Design Guide](https://cloud.google.com/apis/design/errors).
          &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
              # message types for APIs to use.
            {
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
            },
          ],
          &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
          &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
              # user-facing error message should be localized and sent in the
              # google.rpc.Status.details field, or localized by the client.
        },
        &quot;data&quot;: &quot;A String&quot;, # The raw binary data.
        &quot;digest&quot;: { # A content digest. A digest for a given blob consists of the size of the blob # The digest to which this response corresponds.
            # and its hash. The hash algorithm to use is defined by the server.
            #
            # The size is considered to be an integral part of the digest and cannot be
            # separated. That is, even if the `hash` field is correctly specified but
            # `size_bytes` is not, the server MUST reject the request.
            #
            # The reason for including the size in the digest is as follows: in a great
            # many cases, the server needs to know the size of the blob it is about to work
            # with prior to starting an operation with it, such as flattening Merkle tree
            # structures or streaming it to a worker. Technically, the server could
            # implement a separate metadata store, but this results in a significantly more
            # complicated implementation as opposed to having the client specify the size
            # up-front (or storing the size along with the digest in every message where
            # digests are embedded). This does mean that the API leaks some implementation
            # details of (what we consider to be) a reasonable server implementation, but
            # we consider this to be a worthwhile tradeoff.
            #
            # When a `Digest` is used to refer to a proto message, it always refers to the
            # message in binary encoded form. To ensure consistent hashing, clients and
            # servers MUST ensure that they serialize messages according to the following
            # rules, even if there are alternate valid encodings for the same message:
            #
            # * Fields are serialized in tag order.
            # * There are no unknown fields.
            # * There are no duplicate fields.
            # * Fields are serialized according to the default semantics for their type.
            #
            # Most protocol buffer implementations will always follow these rules when
            # serializing, but care should be taken to avoid shortcuts. For instance,
            # concatenating two messages to merge them may produce duplicate fields.
          &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
          &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
              # exactly 64 characters long.
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="batchUpdate">batchUpdate(instanceName, body=None, x__xgafv=None)</code>
  <pre>Upload many blobs at once.

The server may enforce a limit of the combined total size of blobs
to be uploaded using this API. This limit may be obtained using the
Capabilities API.
Requests exceeding the limit should either be split into smaller
chunks or uploaded using the
ByteStream API, as appropriate.

This request is equivalent to calling a Bytestream `Write` request
on each individual blob, in parallel. The requests may succeed or fail
independently.

Errors:

* `INVALID_ARGUMENT`: The client attempted to upload more than the
  server supported limit.

Individual requests may return the following errors, additionally:

* `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob.
* `INVALID_ARGUMENT`: The
Digest does not match the
provided data.

Args:
  instanceName: string, The instance of the execution system to operate against. A server may
support multiple instances of the execution system (with their own workers,
storage, caches, etc.). The server MAY require use of this field to select
between them in an implementation-defined fashion, otherwise it can be
omitted. (required)
  body: object, The request body.
    The object takes the form of:

{ # A request message for
      # ContentAddressableStorage.BatchUpdateBlobs.
    &quot;requests&quot;: [ # The individual upload requests.
      { # A request corresponding to a single blob that the client wants to upload.
        &quot;data&quot;: &quot;A String&quot;, # The raw binary data.
        &quot;digest&quot;: { # A content digest. A digest for a given blob consists of the size of the blob # The digest of the blob. This MUST be the digest of `data`.
            # and its hash. The hash algorithm to use is defined by the server.
            #
            # The size is considered to be an integral part of the digest and cannot be
            # separated. That is, even if the `hash` field is correctly specified but
            # `size_bytes` is not, the server MUST reject the request.
            #
            # The reason for including the size in the digest is as follows: in a great
            # many cases, the server needs to know the size of the blob it is about to work
            # with prior to starting an operation with it, such as flattening Merkle tree
            # structures or streaming it to a worker. Technically, the server could
            # implement a separate metadata store, but this results in a significantly more
            # complicated implementation as opposed to having the client specify the size
            # up-front (or storing the size along with the digest in every message where
            # digests are embedded). This does mean that the API leaks some implementation
            # details of (what we consider to be) a reasonable server implementation, but
            # we consider this to be a worthwhile tradeoff.
            #
            # When a `Digest` is used to refer to a proto message, it always refers to the
            # message in binary encoded form. To ensure consistent hashing, clients and
            # servers MUST ensure that they serialize messages according to the following
            # rules, even if there are alternate valid encodings for the same message:
            #
            # * Fields are serialized in tag order.
            # * There are no unknown fields.
            # * There are no duplicate fields.
            # * Fields are serialized according to the default semantics for their type.
            #
            # Most protocol buffer implementations will always follow these rules when
            # serializing, but care should be taken to avoid shortcuts. For instance,
            # concatenating two messages to merge them may produce duplicate fields.
          &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
          &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
              # exactly 64 characters long.
        },
      },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A response message for
      # ContentAddressableStorage.BatchUpdateBlobs.
    &quot;responses&quot;: [ # The responses to the requests.
      { # A response corresponding to a single blob that the client tried to upload.
        &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # The result of attempting to upload that blob.
            # different programming environments, including REST APIs and RPC APIs. It is
            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
            # three pieces of data: error code, error message, and error details.
            #
            # You can find out more about this error model and how to work with it in the
            # [API Design Guide](https://cloud.google.com/apis/design/errors).
          &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
              # message types for APIs to use.
            {
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
            },
          ],
          &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
          &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
              # user-facing error message should be localized and sent in the
              # google.rpc.Status.details field, or localized by the client.
        },
        &quot;digest&quot;: { # A content digest. A digest for a given blob consists of the size of the blob # The blob digest to which this response corresponds.
            # and its hash. The hash algorithm to use is defined by the server.
            #
            # The size is considered to be an integral part of the digest and cannot be
            # separated. That is, even if the `hash` field is correctly specified but
            # `size_bytes` is not, the server MUST reject the request.
            #
            # The reason for including the size in the digest is as follows: in a great
            # many cases, the server needs to know the size of the blob it is about to work
            # with prior to starting an operation with it, such as flattening Merkle tree
            # structures or streaming it to a worker. Technically, the server could
            # implement a separate metadata store, but this results in a significantly more
            # complicated implementation as opposed to having the client specify the size
            # up-front (or storing the size along with the digest in every message where
            # digests are embedded). This does mean that the API leaks some implementation
            # details of (what we consider to be) a reasonable server implementation, but
            # we consider this to be a worthwhile tradeoff.
            #
            # When a `Digest` is used to refer to a proto message, it always refers to the
            # message in binary encoded form. To ensure consistent hashing, clients and
            # servers MUST ensure that they serialize messages according to the following
            # rules, even if there are alternate valid encodings for the same message:
            #
            # * Fields are serialized in tag order.
            # * There are no unknown fields.
            # * There are no duplicate fields.
            # * Fields are serialized according to the default semantics for their type.
            #
            # Most protocol buffer implementations will always follow these rules when
            # serializing, but care should be taken to avoid shortcuts. For instance,
            # concatenating two messages to merge them may produce duplicate fields.
          &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
          &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
              # exactly 64 characters long.
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="findMissing">findMissing(instanceName, body=None, x__xgafv=None)</code>
  <pre>Determine if blobs are present in the CAS.

Clients can use this API before uploading blobs to determine which ones are
already present in the CAS and do not need to be uploaded again.

Servers SHOULD increase the TTLs of the referenced blobs if necessary and
applicable.

There are no method-specific errors.

Args:
  instanceName: string, The instance of the execution system to operate against. A server may
support multiple instances of the execution system (with their own workers,
storage, caches, etc.). The server MAY require use of this field to select
between them in an implementation-defined fashion, otherwise it can be
omitted. (required)
  body: object, The request body.
    The object takes the form of:

{ # A request message for
      # ContentAddressableStorage.FindMissingBlobs.
    &quot;blobDigests&quot;: [ # A list of the blobs to check.
      { # A content digest. A digest for a given blob consists of the size of the blob
          # and its hash. The hash algorithm to use is defined by the server.
          #
          # The size is considered to be an integral part of the digest and cannot be
          # separated. That is, even if the `hash` field is correctly specified but
          # `size_bytes` is not, the server MUST reject the request.
          #
          # The reason for including the size in the digest is as follows: in a great
          # many cases, the server needs to know the size of the blob it is about to work
          # with prior to starting an operation with it, such as flattening Merkle tree
          # structures or streaming it to a worker. Technically, the server could
          # implement a separate metadata store, but this results in a significantly more
          # complicated implementation as opposed to having the client specify the size
          # up-front (or storing the size along with the digest in every message where
          # digests are embedded). This does mean that the API leaks some implementation
          # details of (what we consider to be) a reasonable server implementation, but
          # we consider this to be a worthwhile tradeoff.
          #
          # When a `Digest` is used to refer to a proto message, it always refers to the
          # message in binary encoded form. To ensure consistent hashing, clients and
          # servers MUST ensure that they serialize messages according to the following
          # rules, even if there are alternate valid encodings for the same message:
          #
          # * Fields are serialized in tag order.
          # * There are no unknown fields.
          # * There are no duplicate fields.
          # * Fields are serialized according to the default semantics for their type.
          #
          # Most protocol buffer implementations will always follow these rules when
          # serializing, but care should be taken to avoid shortcuts. For instance,
          # concatenating two messages to merge them may produce duplicate fields.
        &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
        &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
            # exactly 64 characters long.
      },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A response message for
      # ContentAddressableStorage.FindMissingBlobs.
    &quot;missingBlobDigests&quot;: [ # A list of the blobs requested *not* present in the storage.
      { # A content digest. A digest for a given blob consists of the size of the blob
          # and its hash. The hash algorithm to use is defined by the server.
          #
          # The size is considered to be an integral part of the digest and cannot be
          # separated. That is, even if the `hash` field is correctly specified but
          # `size_bytes` is not, the server MUST reject the request.
          #
          # The reason for including the size in the digest is as follows: in a great
          # many cases, the server needs to know the size of the blob it is about to work
          # with prior to starting an operation with it, such as flattening Merkle tree
          # structures or streaming it to a worker. Technically, the server could
          # implement a separate metadata store, but this results in a significantly more
          # complicated implementation as opposed to having the client specify the size
          # up-front (or storing the size along with the digest in every message where
          # digests are embedded). This does mean that the API leaks some implementation
          # details of (what we consider to be) a reasonable server implementation, but
          # we consider this to be a worthwhile tradeoff.
          #
          # When a `Digest` is used to refer to a proto message, it always refers to the
          # message in binary encoded form. To ensure consistent hashing, clients and
          # servers MUST ensure that they serialize messages according to the following
          # rules, even if there are alternate valid encodings for the same message:
          #
          # * Fields are serialized in tag order.
          # * There are no unknown fields.
          # * There are no duplicate fields.
          # * Fields are serialized according to the default semantics for their type.
          #
          # Most protocol buffer implementations will always follow these rules when
          # serializing, but care should be taken to avoid shortcuts. For instance,
          # concatenating two messages to merge them may produce duplicate fields.
        &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
        &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
            # exactly 64 characters long.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="getTree">getTree(instanceName, hash, sizeBytes, pageToken=None, pageSize=None, x__xgafv=None)</code>
  <pre>Fetch the entire directory tree rooted at a node.

This request must be targeted at a
Directory stored in the
ContentAddressableStorage
(CAS). The server will enumerate the `Directory` tree recursively and
return every node descended from the root.

The GetTreeRequest.page_token parameter can be used to skip ahead in
the stream (e.g. when retrying a partially completed and aborted request),
by setting it to a value taken from GetTreeResponse.next_page_token of the
last successfully processed GetTreeResponse).

The exact traversal order is unspecified and, unless retrieving subsequent
pages from an earlier request, is not guaranteed to be stable across
multiple invocations of `GetTree`.

If part of the tree is missing from the CAS, the server will return the
portion present and omit the rest.

Errors:

* `NOT_FOUND`: The requested tree root is not present in the CAS.

Args:
  instanceName: string, The instance of the execution system to operate against. A server may
support multiple instances of the execution system (with their own workers,
storage, caches, etc.). The server MAY require use of this field to select
between them in an implementation-defined fashion, otherwise it can be
omitted. (required)
  hash: string, The hash. In the case of SHA-256, it will always be a lowercase hex string
exactly 64 characters long. (required)
  sizeBytes: string, The size of the blob, in bytes. (required)
  pageToken: string, A page token, which must be a value received in a previous
GetTreeResponse.
If present, the server will use that token as an offset, returning only
that page and the ones that succeed it.
  pageSize: integer, A maximum page size to request. If present, the server will request no more
than this many items. Regardless of whether a page size is specified, the
server may place its own limit on the number of items to be returned and
require the client to retrieve more items using a subsequent request.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A response message for
      # ContentAddressableStorage.GetTree.
    &quot;directories&quot;: [ # The directories descended from the requested root.
      { # A `Directory` represents a directory node in a file tree, containing zero or
          # more children FileNodes,
          # DirectoryNodes and
          # SymlinkNodes.
          # Each `Node` contains its name in the directory, either the digest of its
          # content (either a file blob or a `Directory` proto) or a symlink target, as
          # well as possibly some metadata about the file or directory.
          #
          # In order to ensure that two equivalent directory trees hash to the same
          # value, the following restrictions MUST be obeyed when constructing a
          # a `Directory`:
          #
          # * Every child in the directory must have a path of exactly one segment.
          #   Multiple levels of directory hierarchy may not be collapsed.
          # * Each child in the directory must have a unique path segment (file name).
          #   Note that while the API itself is case-sensitive, the environment where
          #   the Action is executed may or may not be case-sensitive. That is, it is
          #   legal to call the API with a Directory that has both &quot;Foo&quot; and &quot;foo&quot; as
          #   children, but the Action may be rejected by the remote system upon
          #   execution.
          # * The files, directories and symlinks in the directory must each be sorted
          #   in lexicographical order by path. The path strings must be sorted by code
          #   point, equivalently, by UTF-8 bytes.
          # * The NodeProperties of files,
          #   directories, and symlinks must be sorted in lexicographical order by
          #   property name.
          #
          # A `Directory` that obeys the restrictions is said to be in canonical form.
          #
          # As an example, the following could be used for a file named `bar` and a
          # directory named `foo` with an executable file named `baz` (hashes shortened
          # for readability):
          #
          # ```json
          # // (Directory proto)
          # {
          #   files: [
          #     {
          #       name: &quot;bar&quot;,
          #       digest: {
          #         hash: &quot;4a73bc9d03...&quot;,
          #         size: 65534
          #       },
          #       node_properties: [
          #         {
          #           &quot;name&quot;: &quot;MTime&quot;,
          #           &quot;value&quot;: &quot;2017-01-15T01:30:15.01Z&quot;
          #         }
          #       ]
          #     }
          #   ],
          #   directories: [
          #     {
          #       name: &quot;foo&quot;,
          #       digest: {
          #         hash: &quot;4cf2eda940...&quot;,
          #         size: 43
          #       }
          #     }
          #   ]
          # }
          #
          # // (Directory proto with hash &quot;4cf2eda940...&quot; and size 43)
          # {
          #   files: [
          #     {
          #       name: &quot;baz&quot;,
          #       digest: {
          #         hash: &quot;b2c941073e...&quot;,
          #         size: 1294,
          #       },
          #       is_executable: true
          #     }
          #   ]
          # }
          # ```
        &quot;symlinks&quot;: [ # The symlinks in the directory.
          { # A `SymlinkNode` represents a symbolic link.
            &quot;nodeProperties&quot;: [ # The node properties of the SymlinkNode.
              { # A single property for FileNodes,
                  # DirectoryNodes, and
                  # SymlinkNodes. The server is
                  # responsible for specifying the property `name`s that it accepts. If
                  # permitted by the server, the same `name` may occur multiple times.
                &quot;value&quot;: &quot;A String&quot;, # The property value.
                &quot;name&quot;: &quot;A String&quot;, # The property name.
              },
            ],
            &quot;name&quot;: &quot;A String&quot;, # The name of the symlink.
            &quot;target&quot;: &quot;A String&quot;, # The target path of the symlink. The path separator is a forward slash `/`.
                # The target path can be relative to the parent directory of the symlink or
                # it can be an absolute path starting with `/`. Support for absolute paths
                # can be checked using the Capabilities
                # API. The canonical form forbids the substrings `/./` and `//` in the target
                # path. `..` components are allowed anywhere in the target path.
          },
        ],
        &quot;files&quot;: [ # The files in the directory.
          { # A `FileNode` represents a single file and associated metadata.
            &quot;nodeProperties&quot;: [ # The node properties of the FileNode.
              { # A single property for FileNodes,
                  # DirectoryNodes, and
                  # SymlinkNodes. The server is
                  # responsible for specifying the property `name`s that it accepts. If
                  # permitted by the server, the same `name` may occur multiple times.
                &quot;value&quot;: &quot;A String&quot;, # The property value.
                &quot;name&quot;: &quot;A String&quot;, # The property name.
              },
            ],
            &quot;name&quot;: &quot;A String&quot;, # The name of the file.
            &quot;digest&quot;: { # A content digest. A digest for a given blob consists of the size of the blob # The digest of the file&#x27;s content.
                # and its hash. The hash algorithm to use is defined by the server.
                #
                # The size is considered to be an integral part of the digest and cannot be
                # separated. That is, even if the `hash` field is correctly specified but
                # `size_bytes` is not, the server MUST reject the request.
                #
                # The reason for including the size in the digest is as follows: in a great
                # many cases, the server needs to know the size of the blob it is about to work
                # with prior to starting an operation with it, such as flattening Merkle tree
                # structures or streaming it to a worker. Technically, the server could
                # implement a separate metadata store, but this results in a significantly more
                # complicated implementation as opposed to having the client specify the size
                # up-front (or storing the size along with the digest in every message where
                # digests are embedded). This does mean that the API leaks some implementation
                # details of (what we consider to be) a reasonable server implementation, but
                # we consider this to be a worthwhile tradeoff.
                #
                # When a `Digest` is used to refer to a proto message, it always refers to the
                # message in binary encoded form. To ensure consistent hashing, clients and
                # servers MUST ensure that they serialize messages according to the following
                # rules, even if there are alternate valid encodings for the same message:
                #
                # * Fields are serialized in tag order.
                # * There are no unknown fields.
                # * There are no duplicate fields.
                # * Fields are serialized according to the default semantics for their type.
                #
                # Most protocol buffer implementations will always follow these rules when
                # serializing, but care should be taken to avoid shortcuts. For instance,
                # concatenating two messages to merge them may produce duplicate fields.
              &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
              &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
                  # exactly 64 characters long.
            },
            &quot;isExecutable&quot;: True or False, # True if file is executable, false otherwise.
          },
        ],
        &quot;directories&quot;: [ # The subdirectories in the directory.
          { # A `DirectoryNode` represents a child of a
              # Directory which is itself
              # a `Directory` and its associated metadata.
            &quot;name&quot;: &quot;A String&quot;, # The name of the directory.
            &quot;digest&quot;: { # A content digest. A digest for a given blob consists of the size of the blob # The digest of the
                # Directory object
                # represented. See Digest
                # for information about how to take the digest of a proto message.
                # and its hash. The hash algorithm to use is defined by the server.
                #
                # The size is considered to be an integral part of the digest and cannot be
                # separated. That is, even if the `hash` field is correctly specified but
                # `size_bytes` is not, the server MUST reject the request.
                #
                # The reason for including the size in the digest is as follows: in a great
                # many cases, the server needs to know the size of the blob it is about to work
                # with prior to starting an operation with it, such as flattening Merkle tree
                # structures or streaming it to a worker. Technically, the server could
                # implement a separate metadata store, but this results in a significantly more
                # complicated implementation as opposed to having the client specify the size
                # up-front (or storing the size along with the digest in every message where
                # digests are embedded). This does mean that the API leaks some implementation
                # details of (what we consider to be) a reasonable server implementation, but
                # we consider this to be a worthwhile tradeoff.
                #
                # When a `Digest` is used to refer to a proto message, it always refers to the
                # message in binary encoded form. To ensure consistent hashing, clients and
                # servers MUST ensure that they serialize messages according to the following
                # rules, even if there are alternate valid encodings for the same message:
                #
                # * Fields are serialized in tag order.
                # * There are no unknown fields.
                # * There are no duplicate fields.
                # * Fields are serialized according to the default semantics for their type.
                #
                # Most protocol buffer implementations will always follow these rules when
                # serializing, but care should be taken to avoid shortcuts. For instance,
                # concatenating two messages to merge them may produce duplicate fields.
              &quot;sizeBytes&quot;: &quot;A String&quot;, # The size of the blob, in bytes.
              &quot;hash&quot;: &quot;A String&quot;, # The hash. In the case of SHA-256, it will always be a lowercase hex string
                  # exactly 64 characters long.
            },
          },
        ],
        &quot;nodeProperties&quot;: [ # The node properties of the Directory.
          { # A single property for FileNodes,
              # DirectoryNodes, and
              # SymlinkNodes. The server is
              # responsible for specifying the property `name`s that it accepts. If
              # permitted by the server, the same `name` may occur multiple times.
            &quot;value&quot;: &quot;A String&quot;, # The property value.
            &quot;name&quot;: &quot;A String&quot;, # The property name.
          },
        ],
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # If present, signifies that there are more results which the client can
        # retrieve by passing this as the page_token in a subsequent
        # request.
        # If empty, signifies that this is the last page of results.
  }</pre>
</div>

<div class="method">
    <code class="details" id="getTree_next">getTree_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

</body></html>