<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;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.
        },
        &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;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;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.
        },
      },
    ],
  }</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;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;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;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;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.
    &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;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;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;name&quot;: &quot;A String&quot;, # The property name.
                &quot;value&quot;: &quot;A String&quot;, # The property value.
              },
            ],
            &quot;isExecutable&quot;: True or False, # True if file is executable, false otherwise.
            &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;name&quot;: &quot;A String&quot;, # The name of the file.
          },
        ],
        &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;name&quot;: &quot;A String&quot;, # The property name.
            &quot;value&quot;: &quot;A String&quot;, # The property value.
          },
        ],
        &quot;symlinks&quot;: [ # The symlinks in the directory.
          { # A `SymlinkNode` represents a symbolic link.
            &quot;name&quot;: &quot;A String&quot;, # The name of the symlink.
            &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;name&quot;: &quot;A String&quot;, # The property name.
                &quot;value&quot;: &quot;A String&quot;, # The property value.
              },
            ],
            &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.
          },
        ],
      },
    ],
  }</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>