)]}'
{
  "log": [
    {
      "commit": "a15001f75e6ad524a427f89d28a6bc77968d1f3b",
      "tree": "6727b344e639028fcd2268aaaa72e08e10af3fa4",
      "parents": [
        "3a73c5ed04199f3a013c53030290a54a414dc6e5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Mar 07 01:19:39 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 07 01:19:39 2023 -0500"
      },
      "message": "Bump golang.org/x/net from 0.4.0 to 0.7.0 (#433)\n\nBumps [golang.org/x/net](https://github.com/golang/net) from 0.4.0 to 0.7.0.\r\n- [Release notes](https://github.com/golang/net/releases)\r\n- [Commits](https://github.com/golang/net/compare/v0.4.0...v0.7.0)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: golang.org/x/net\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "3a73c5ed04199f3a013c53030290a54a414dc6e5",
      "tree": "5d64344c2bfa3bdfc18b2fb31964114aaf87ee78",
      "parents": [
        "66c350bf1ae62ed6b232e00987bd0e6b83999845"
      ],
      "author": {
        "name": "Oliver Newman",
        "email": "15459200+orn688@users.noreply.github.com",
        "time": "Fri Mar 03 09:55:37 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 03 09:55:37 2023 -0500"
      },
      "message": "[reader] Fix compressed reader retries (#432)\n\nNote: this introduces a behavior change in addition to the bug fix described below. After `compressedSeeker.Read()` returns an error, subsequent calls continue to drain the internal buffer until it announces EOF, whereas before the method short-circuited and reported the last error on subsequent calls. Since this is an internal package, it\u0027s unlikely that there have been any external dependencies on this behavior.\r\n\r\nThere was a subtle bug in the `compressedSeeker` class that caused retried upload requests to occasionally fail under a very specific set of conditions:\r\n\r\n1. The file being uploaded must be greater than the client\u0027s `MaxBatchSize` so it\u0027s not batched together with other files (compression is always disabled for files that are batched together).\r\n2. Upload compression must be enabled for the file, e.g. by setting `client.CompressedBytestreamThreshold(x)` where x is less than the file size. This will cause the upload to enter the `compressedSeeker` code path.\r\n\r\nHere\u0027s the process by which the bug happens (the relevant code is mostly in `go/pkg/client/bytestream.go` in the `writeChunked()` function):\r\n1. All chunks of the file upload normally up until the final chunk.\r\n2. `ch.Next()` is called and retrieves the final chunk of the file.\r\n3. The `reader.compressedSeeker` underlying the `chunker.Chunker` that was passed into `writeChunked()` gets an `io.EOF` error when reading from its underlying reader. This is completely normal and expected since the end of the file has been reached.\r\n4. `reader.compressedSeeker.Read()` correctly propagates the `io.EOF` error but also caches it to its `cfs.err` field, so all subsequent calls to `Read()` will return `io.EOF`.\r\n5. The `WriteRequest` to upload the final chunk of the file fails transiently, e.g. due to an internal server error.\r\n6. The entire upload gets retried to do the `c.Retrier.Do()` call within `writeChunked()`.\r\n7. `ch.Reset()` gets called to reset the chunker to the beginning of the file, calling `compressedSeeker.SeekOffset(0)` under the hood. This correctly seeks to the beginning of the file but *does not* unset the cached `err`.\r\n7. The first call to `ch.Next()` tries to call `reader.compressedSeeker.Read()`, expecting to read from the beginning of the file again, but it immediately returns the cached `io.EOF` and a length of zero bytes, suggesting that the file is now empty.\r\n8. `writeChunked()` dutifully tries to upload the apparently empty file, but under the digest of the file\u0027s actual contents.\r\n9. This results in a server-side error when the server tries to validate that the uploaded file matches the digest under which it is being stored, something like: `Uploaded blob had calculated digest 19f3/0 but was being stored to 34ba/\u003csize\u003e`, where `\u003csize\u003e` is the actual size of the file in bytes. This is the same error that happens if the file is changed by another process between the first and the second upload attempt, but in this case it happens even though the file is not modified on disk. This error is not considered transient, so is not retried, and bubbles up to an error.\r\n\r\nI could find no indication as to why errors needed to be cached on the `compressedSeeker`, and since the error caching was the underlying cause of the bug (I reproduce this in a test case), it was simplest to just remove the error caching logic."
    },
    {
      "commit": "66c350bf1ae62ed6b232e00987bd0e6b83999845",
      "tree": "6390b1e38b801a92488a4245f464c58b6ccac23c",
      "parents": [
        "d47b66997d2e4df7ff57da1b59c3d375fb104887"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Tue Feb 14 01:44:04 2023 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 13 08:44:04 2023 -0800"
      },
      "message": "git squash commit for update_libraries. (#427)\n\nb0a774c4b5e4e3cd2782ef246efe9e08612dceb7\r\ngit squash commit for update_libraries.\r\n\r\n217d3222febaaccaa11ace912f9566e9513dbc5a\r\nupdate grpc\r\n\r\n071e63cba4946f03e9f846876bb307a4aa3f08e9\r\ndeps\r\n\r\nbc523d453a513c95d0a592d96f876e7614043839\r\ntest\r\n\r\n316e50ac55aad8fa44113a35decf176f72d5a937\r\nsub"
    },
    {
      "commit": "d47b66997d2e4df7ff57da1b59c3d375fb104887",
      "tree": "7506d1993397a10c1cb73ebb111a8a00071f653b",
      "parents": [
        "0203d45f560a957783f84e7bf527472f1eadf995"
      ],
      "author": {
        "name": "YukaS",
        "email": "55724992+YukaSadaoka@users.noreply.github.com",
        "time": "Thu Feb 09 07:20:41 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 09 07:20:41 2023 -0500"
      },
      "message": "Initial commit. (#431)\n\n- Fix lint warnings from the PR #425.\r\n- Remove an unused struct added in the PR #425."
    },
    {
      "commit": "0203d45f560a957783f84e7bf527472f1eadf995",
      "tree": "d8922ff7043f0040e9dfecaeb97312587e117fff",
      "parents": [
        "0d5329ba459c790925698831c00c968a41694dcb"
      ],
      "author": {
        "name": "YukaS",
        "email": "55724992+YukaSadaoka@users.noreply.github.com",
        "time": "Wed Feb 08 15:01:59 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 08 15:01:59 2023 -0500"
      },
      "message": "Update writeChunked method in bytestream.go to allow resumable upload with ByteStream Write API. (#425)\n\n"
    },
    {
      "commit": "0d5329ba459c790925698831c00c968a41694dcb",
      "tree": "9dff8fac51435c38ed35f3a961146fd76cd89200",
      "parents": [
        "f172074d840c2093b349c7ab25624385a9c2380f"
      ],
      "author": {
        "name": "Benjamin Segall",
        "email": "bentekkie@google.com",
        "time": "Wed Feb 08 10:24:35 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 08 10:24:35 2023 -0500"
      },
      "message": "Upgrade to go 1.19.5 (#428)\n\n* Upgrade to go 1.19.5\r\n\r\n* Update go version in presubmit check\r\n\r\n* Run gofmt at go version 1.19.5"
    },
    {
      "commit": "f172074d840c2093b349c7ab25624385a9c2380f",
      "tree": "2d797ccc69fb6f3be1aedff84f3a6b0b4940eb40",
      "parents": [
        "3533698631ddf06237390fea13df9a5df397aaec"
      ],
      "author": {
        "name": "Anas H. Sulaiman",
        "email": "anas@sulaiman.pro",
        "time": "Tue Feb 07 12:51:10 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 07 12:51:10 2023 -0500"
      },
      "message": "Refactor public methods to delegate to impls (#426)\n\nMoved internal implementations to separate methods to allow public\r\nmethods to select implementations based on feature flags.\r\n\r\nNo functional changes made.\r\n\r\nThis is a stop-gap change to merge cas/upload.go into client pkg."
    },
    {
      "commit": "3533698631ddf06237390fea13df9a5df397aaec",
      "tree": "34bb7492ec31501c459357baaa1bc837af3c84f6",
      "parents": [
        "110c75cad3718424b5bffc37b8bb4a64048e28d6"
      ],
      "author": {
        "name": "Oliver Newman",
        "email": "15459200+orn688@users.noreply.github.com",
        "time": "Mon Jan 23 11:43:55 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 23 11:43:55 2023 -0500"
      },
      "message": "Optionally process symlinks pointing outside exec root (#422)\n\nPreviously if `TreeSymlinkOpts.Preserved` was set to `true`, symlinks\r\npointing outside of the exec root would always be rejected. However, it\r\ncan be useful to preserve symlinks by default while replacing them with\r\nthe targeted file if the targeted file is outside of the exec root.\r\n\r\nSo add a new `TreeSymlinkOpts.MaterializeOutsideExecRoot` option that\r\nenables this behavior if set to true.\r\n\r\nSee https://crbug.com/1216363 for context on why this is useful."
    },
    {
      "commit": "110c75cad3718424b5bffc37b8bb4a64048e28d6",
      "tree": "b157e2a9cd3aac6ad1081e753bd53b43d2be96e6",
      "parents": [
        "82c4ae2346923e77760da941d8225e8beeb7c3ca"
      ],
      "author": {
        "name": "Anas H. Sulaiman",
        "email": "anas@sulaiman.pro",
        "time": "Fri Jan 20 13:17:17 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 20 13:17:17 2023 -0500"
      },
      "message": "Organize the code in client/cas.go (#424)\n\n[`go/pkg/client/cas.go`](https://github.com/bazelbuild/remote-apis-sdks/blob/e62cf9b8696a2316c50ffe69bafe0a7972bcddff/go/pkg/client/cas.go)\r\nwas approaching the 2k lines mark with 95 symbols. Split the file into two, one\r\nfor upload behaviour and one for download behaviour.\r\n\r\nThis PR has no functional changes.\r\n\r\nTested by successfully running `bazel build //...`.\r\n\r\nThis is a pre-work for merging in\r\n[`go/pkg/cas/`](https://github.com/bazelbuild/remote-apis-sdks/tree/e62cf9b8696a2316c50ffe69bafe0a7972bcddff/go/pkg/cas)."
    },
    {
      "commit": "82c4ae2346923e77760da941d8225e8beeb7c3ca",
      "tree": "ea77691527332ca067a63be3591413eec84bfd40",
      "parents": [
        "e62cf9b8696a2316c50ffe69bafe0a7972bcddff"
      ],
      "author": {
        "name": "Anas H. Sulaiman",
        "email": "anas@sulaiman.pro",
        "time": "Thu Jan 19 15:29:35 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 19 15:29:35 2023 -0500"
      },
      "message": "Fix conflicting deps for golang/x/sys (#423)\n\n`golang/x/sys` rule had to be removed because it was conflicting with\r\nanother transitive dependency that requires a more recent version which\r\nincludes `execabs`."
    },
    {
      "commit": "e62cf9b8696a2316c50ffe69bafe0a7972bcddff",
      "tree": "b45cfc2f44e8f0655b7fa2bc9a5550178966e1c9",
      "parents": [
        "ad91cd07c72e60cc008bfbcec8dc7fa6f0459b80"
      ],
      "author": {
        "name": "Bani Singh",
        "email": "47721811+banikharbanda@users.noreply.github.com",
        "time": "Mon Nov 14 13:01:57 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 14 13:01:57 2022 -0500"
      },
      "message": "Download Specified Outputs (#421)\n\nAdds functions to retrieve outputs and download specified outputs instead of the ones in working dir. Also adds a new command option for preserving mtimes of unchanged outputs."
    },
    {
      "commit": "ad91cd07c72e60cc008bfbcec8dc7fa6f0459b80",
      "tree": "452c059d7cdf06ae5be87062f68412d4237d1551",
      "parents": [
        "4b34b65cbf9123c634dcfd3935838750332cae1f"
      ],
      "author": {
        "name": "Noah Dietz",
        "email": "noahdietz@users.noreply.github.com",
        "time": "Mon Oct 31 12:02:59 2022 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 31 15:02:59 2022 -0400"
      },
      "message": "Added com_google_cloud_go_compute_metadata dependency (#420)\n\n"
    },
    {
      "commit": "4b34b65cbf9123c634dcfd3935838750332cae1f",
      "tree": "096f85c589c0be0f6125736fc67cdc92d14a041e",
      "parents": [
        "6c8489803a6f6d9b0f99ad056142d3721f126fa5"
      ],
      "author": {
        "name": "Benjamin Segall",
        "email": "bentekkie@gmail.com",
        "time": "Wed May 18 10:59:48 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 18 10:59:48 2022 -0400"
      },
      "message": "Ensure xattr global variables are restored after tests (#419)\n\n"
    },
    {
      "commit": "6c8489803a6f6d9b0f99ad056142d3721f126fa5",
      "tree": "7991dd0fc88386356b754054a629382d11604c5f",
      "parents": [
        "8780f11b1bb2aaef546cd2c7f601402f698123be"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Fri Apr 29 11:42:01 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 29 11:42:01 2022 -0400"
      },
      "message": "Remove deprecated grpc.WithBalancerName (#418)\n\n"
    },
    {
      "commit": "8780f11b1bb2aaef546cd2c7f601402f698123be",
      "tree": "09445ba19fe0919cbf88f736a8486463430e7307",
      "parents": [
        "07afe884a5e509340f5a0d9d7e7d4257df439b5e"
      ],
      "author": {
        "name": "Kousik Kumar",
        "email": "48490842+gkousik@users.noreply.github.com",
        "time": "Fri Apr 22 10:47:33 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 22 10:47:33 2022 -0400"
      },
      "message": "Fix what path gets updated in cache (#417)\n\nWe always lookup the absolute path, so when we update the cache, we\r\nshould also update it to be the absolute path.\r\n\r\nTest: Ran the repro in bug b/228312861"
    },
    {
      "commit": "07afe884a5e509340f5a0d9d7e7d4257df439b5e",
      "tree": "9f5bb687d37b805679501f43fbd2d9a86b34658a",
      "parents": [
        "adacacf7b98daae17e3240d7049e4e1581c540ca"
      ],
      "author": {
        "name": "Kousik Kumar",
        "email": "48490842+gkousik@users.noreply.github.com",
        "time": "Tue Apr 19 09:27:15 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 19 09:27:15 2022 -0400"
      },
      "message": "Fix all lint errors and enable golint (#416)\n\nThis is so that we catch lint issues here before we import the SDK to\r\ngoogle3. Also added the lint check to presubmit hooks just like how we\r\ndo for gofmt."
    },
    {
      "commit": "adacacf7b98daae17e3240d7049e4e1581c540ca",
      "tree": "e1c72f881c3652ace964eeb7cad2309c2a960284",
      "parents": [
        "b5d98ad5e673d50ffffe296e97f86e78aae109b6"
      ],
      "author": {
        "name": "Kousik Kumar",
        "email": "48490842+gkousik@users.noreply.github.com",
        "time": "Mon Mar 28 14:27:47 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 28 14:27:47 2022 -0400"
      },
      "message": "Returned a customized error when initializing a new client (#415)\n\nThis is to also indicate the type of authenticated used by the SDK to\r\nconnect to the RBE so that clients of the SDK can report better error\r\nmessages to indicate how the authentication failure can be fixed.\r\n\r\nTest: Applied this change in re-client and confirmed that the returned\r\nobject has the proper auth type set."
    },
    {
      "commit": "b5d98ad5e673d50ffffe296e97f86e78aae109b6",
      "tree": "918c12fe8e2a4ecbb24b13c7b24b17c5da77822a",
      "parents": [
        "ed923fee5a60fcf01f4532de3fb45c52f02c4ba9"
      ],
      "author": {
        "name": "Kousik Kumar",
        "email": "48490842+gkousik@users.noreply.github.com",
        "time": "Wed Mar 23 16:14:36 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 23 16:14:36 2022 -0400"
      },
      "message": "Always set file modified time after writing to a file (#414)\n\nTwo problems:\r\n1. We are incorrectly writing to a file if the destination file has more\r\n   content than the source file during copying.\r\n2. We aren\u0027t updating the timestamp of the file when the destiination\r\n   file has zero bytes.\r\n\r\nBoth these would be fixed by just setting the file open mode to\r\nos.O_TRUNC which would truncate the file if it already exists.\r\n\r\nTest:\r\n1. Unit tests\r\n2. Tested in Android build with:\r\n```\r\nrm -f out/reproxy* \u0026\u0026 touch frameworks/opt/net/voip/src/java/com/android/server/sip/SipWakeupTimer.java \u0026\u0026 RBE_v\u003d3 RBE_instance\u003d\"projects/foundry-x-experiments/instances/default-instance\" RBE_use_unified_cas_ops\u003dfalse RBE_use_batches\u003dfalse RBE_METALAVA\u003dtrue m out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/check_last_released_api.timestamp\r\n```\r\n\r\nand confirmed that `restat` warnings were no longer popping up during\r\nrebuilds."
    },
    {
      "commit": "ed923fee5a60fcf01f4532de3fb45c52f02c4ba9",
      "tree": "328e5d17ee6429b2d65b79304235d027ca90801e",
      "parents": [
        "edee8d7fd52ee1267b408aa8f45f4f756c0e270e"
      ],
      "author": {
        "name": "David Goldsmith",
        "email": "davidgoldsmith@google.com",
        "time": "Mon Mar 21 14:18:38 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 21 14:18:38 2022 -0400"
      },
      "message": "xattr digest fallback (#413)\n\n"
    },
    {
      "commit": "edee8d7fd52ee1267b408aa8f45f4f756c0e270e",
      "tree": "d8565d36e21f23cb465676877c08165da24dfbdc",
      "parents": [
        "1a3a6829825d60acaf2709442aa54218e5b26d8e"
      ],
      "author": {
        "name": "Andus Yu",
        "email": "andusyu@google.com",
        "time": "Thu Mar 10 17:06:30 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 10 17:06:30 2022 -0500"
      },
      "message": "Fix ComputeOutputsToUpload to build directory tree consistently (#411)\n\nChanges ComputeOutputsToUpload to build the directory trees based on the lexical order of the directories according to path so that the directory digests will be consistent."
    },
    {
      "commit": "1a3a6829825d60acaf2709442aa54218e5b26d8e",
      "tree": "1ccb31111060c6f68e1d6210ba34c11281769f24",
      "parents": [
        "163176105794bcf6ab2de54175620d5efc7161b0"
      ],
      "author": {
        "name": "Kousik Kumar",
        "email": "48490842+gkousik@users.noreply.github.com",
        "time": "Wed Mar 02 15:33:27 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 02 15:33:27 2022 -0500"
      },
      "message": "Respect per RPC creds even during Dial() (#410)\n\nAlso added an option \"use_external_auth_token\" that when set to true, would mandate the usae of per RPC creds option starting with the initial Dial to setup the connection\r\n\r\nTest: Also implemented the corresponding re-client side of things and ensured that reproxy starts up"
    },
    {
      "commit": "163176105794bcf6ab2de54175620d5efc7161b0",
      "tree": "d16529d53aa5e066ab6871848acea81812b32a50",
      "parents": [
        "36f659de32ef1740549252ab6e1f6073346f4bfa"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Tue Mar 01 12:04:08 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 01 12:04:08 2022 -0500"
      },
      "message": "Revert \"Remove execution retries based on operation errors. (#392)\" (#409)\n\nThis reverts commit 052cf871811d0f5f1c4eb813cd1a23c87018ee91."
    },
    {
      "commit": "36f659de32ef1740549252ab6e1f6073346f4bfa",
      "tree": "9de19df9517b4aa529ae02d9a6de7f5076adce35",
      "parents": [
        "f30e94e3b6a38961c28471f100e24ba37addef75"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Mon Feb 28 20:30:06 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 28 20:30:06 2022 -0500"
      },
      "message": "Improve error message when symlink target is out of tree. (#408)\n\nCo-authored-by: Takuto Ikuta \u003catetubou@gmail.com\u003e"
    },
    {
      "commit": "f30e94e3b6a38961c28471f100e24ba37addef75",
      "tree": "1bc30b6dcf1bbf9877c6883ff0f212d13abf833d",
      "parents": [
        "60a8d78de370ced9462ffd3dea2e2376da2e2851"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Mon Feb 28 16:54:21 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 28 16:54:21 2022 -0500"
      },
      "message": "Expose errors in closing the Writer. (#407)\n\n* Expose errors in closing the Writer.\r\n\r\nIn case the machine runs out of disk space, the write error will be\r\ncaptured in the done channel, but is suppressed if no other errors\r\nwere encountered. This PR exposes the error in the done channel."
    },
    {
      "commit": "60a8d78de370ced9462ffd3dea2e2376da2e2851",
      "tree": "f9d9509de5466032cf728dd3621356ce917eb835",
      "parents": [
        "0a5630b7051c18782de468c996908b65acd35bae"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Tue Feb 22 14:08:01 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 22 14:08:01 2022 -0500"
      },
      "message": "Add zstd compression check in SDK capabilities. (#406)\n\n"
    },
    {
      "commit": "0a5630b7051c18782de468c996908b65acd35bae",
      "tree": "dd9828b85e962cdfff31711f309a140b083d9973",
      "parents": [
        "912d78baf6768a984c922ed549ecf97527147314"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Wed Feb 16 22:40:55 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 16 22:40:55 2022 -0500"
      },
      "message": "Wrap CloseSend to ensure it is not called on a nil ClientStream (#405)\n\n"
    },
    {
      "commit": "912d78baf6768a984c922ed549ecf97527147314",
      "tree": "b57bdc068094ebfc3f5fad688d2d8207ea4c08a7",
      "parents": [
        "9b604c44cd4c83538a8b14e3ab996cb8d2c739c6"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Thu Feb 17 09:16:15 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 17 09:16:15 2022 +0900"
      },
      "message": "show correct digest in error (#404)\n\n"
    },
    {
      "commit": "9b604c44cd4c83538a8b14e3ab996cb8d2c739c6",
      "tree": "04cd3ff891c91d9a82422e2c9c8fe312a6b197cf",
      "parents": [
        "93c6b902c8c7cdfd2144457f11a8b47aa0dcfbf6"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Tue Feb 15 12:42:08 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 15 12:42:08 2022 +0900"
      },
      "message": "replace CloseSend with CloseAndRecv (#403)\n\n"
    },
    {
      "commit": "93c6b902c8c7cdfd2144457f11a8b47aa0dcfbf6",
      "tree": "4530730fbf837dd9defc485290113e6c2f5baedd",
      "parents": [
        "bef35f91d32f51a73e5b14fad491aa4001bcb53a"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Mon Feb 14 18:17:05 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 14 18:17:05 2022 -0500"
      },
      "message": "Update go to 1.17 \u0026 remove deprecated ioutil (#402)\n\n"
    },
    {
      "commit": "bef35f91d32f51a73e5b14fad491aa4001bcb53a",
      "tree": "cc60e3ac9e44480a1d792850f210e78a66728859",
      "parents": [
        "d2300322a7caff141f35c8318d83de2b175c8786"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Fri Feb 11 18:19:07 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 11 18:19:07 2022 -0500"
      },
      "message": "Update protobuf to new API (#401)\n\nThis should have no functionality change, as they\r\nshould be backed by the same implementations, as per\r\nhttps://go.dev/blog/protobuf-apiv2"
    },
    {
      "commit": "d2300322a7caff141f35c8318d83de2b175c8786",
      "tree": "6514128e154371d0b7378424db87103279905d54",
      "parents": [
        "1452af66ff432ae133d7157560784ddcaab1ce67"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Tue Feb 08 10:19:45 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 08 10:19:45 2022 -0500"
      },
      "message": "Fix typos and lints. (#400)\n\n"
    },
    {
      "commit": "1452af66ff432ae133d7157560784ddcaab1ce67",
      "tree": "203ac7726dfb55012d42e0b50055ff5e3e4e8243",
      "parents": [
        "052cf871811d0f5f1c4eb813cd1a23c87018ee91"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Mon Feb 07 15:52:15 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 07 15:52:15 2022 -0500"
      },
      "message": "Ignore empty directory virtual inputs if inputs exist under them. (#399)\n\n* Ignore empty directory virtual inputs if inputs exist under them.\r\n\r\n* Address comments and add one more test."
    },
    {
      "commit": "052cf871811d0f5f1c4eb813cd1a23c87018ee91",
      "tree": "e36a0ca7aa8dfceb9303bbcc185685a74e11f948",
      "parents": [
        "88f5ece268bbe0bde958c76bcce0062a7af635e5"
      ],
      "author": {
        "name": "Steven Bergsieker",
        "email": "bergsieker@users.noreply.github.com",
        "time": "Wed Jan 19 14:49:11 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 19 14:49:11 2022 -0500"
      },
      "message": "Remove execution retries based on operation errors. (#392)\n\n* Remove execution retries based on operation errors.\r\n\r\nRetrying based on an operation error is always incorrect, although\r\nmostly harmless. Once an operation has an error, it is marked as Done\r\nand should never be unmarked, so retries will simply fetch the same\r\noperation (with the same error) again.\r\n\r\n* Run go fmt"
    },
    {
      "commit": "88f5ece268bbe0bde958c76bcce0062a7af635e5",
      "tree": "dd37a1ede5d0ce3e381dce1cd9a5c731ad5cb715",
      "parents": [
        "97bc9f19117f761ab6da98e76e1bd55da9ecc462"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Mon Jan 17 09:31:16 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 17 09:31:16 2022 -0500"
      },
      "message": "Add DownloadAction and ExecuteAction operations to remotetool. (#398)\n\nDownloadAction downloads the action proto, the command proto and the\r\ninputs into a directory. This allows inspection of the full action data\r\nas well as modification and execution via the ExecuteAction operation.\r\n\r\nThe action is downloaded to a directory with the following structure:\r\n- ac.textproto (the action proto in text format)\r\n- cmd.textproto (the command proto in text format)\r\n- input/ (the root of the input tree)\r\n\r\nThe above can be modified locally and then executed on the remote server\r\nusing the ExecuteAction command. For instance, you can add args to the\r\ncommand, change environment variables, or change the input tree."
    },
    {
      "commit": "97bc9f19117f761ab6da98e76e1bd55da9ecc462",
      "tree": "68c2dad8496a9625ce5aa135a4d7d3481bab52ae",
      "parents": [
        "a696b49c6630901e996152da9638356853193219"
      ],
      "author": {
        "name": "Andus Yu",
        "email": "andusyu@google.com",
        "time": "Thu Jan 13 17:11:29 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 13 17:11:29 2022 -0500"
      },
      "message": "Add support for output directories in fake server. (#397)\n\n"
    },
    {
      "commit": "a696b49c6630901e996152da9638356853193219",
      "tree": "68df7dd48f82517bc9a15f574d0f7375fb82af5c",
      "parents": [
        "0d299108e59eb1b212bbf96b79a250389aa67691"
      ],
      "author": {
        "name": "Bozydar Szadkowski",
        "email": "bozydar@google.com",
        "time": "Mon Jan 10 12:28:44 2022 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 10 12:28:44 2022 -0800"
      },
      "message": "Added RemoteWorkingDir (#395)\n\nRemoteWorkingDir allows to configure RE server to execute the command\r\nin a working directory that\u0027s different than local one.\r\nIf not provided, the command is executed in WorkingDir"
    },
    {
      "commit": "0d299108e59eb1b212bbf96b79a250389aa67691",
      "tree": "1aa1adc3cc8441a93f0b6004ad137cec00160421",
      "parents": [
        "db7d098b4a235833fbc57a7ad5162ea0921dee57"
      ],
      "author": {
        "name": "Bozydar Szadkowski",
        "email": "bozydar.sz@gmail.com",
        "time": "Fri Jan 07 12:06:44 2022 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 07 12:06:44 2022 -0800"
      },
      "message": "Added com_google_cloud_go_compute dependency (#396)\n\n* Added com_google_cloud_go_compute dependency\r\n\r\nThe change is required to address recent build failures\r\nthat are caused by compute module being carved out of\r\ncloud/google.com/go:\r\nhttps://github.com/googleapis/google-cloud-go/pull/5273"
    },
    {
      "commit": "db7d098b4a235833fbc57a7ad5162ea0921dee57",
      "tree": "b6309dae73a294397ebe011f63f6a0012c68f435",
      "parents": [
        "621016c64cfc884d5689239f860cf8448bd69c36"
      ],
      "author": {
        "name": "Andus Yu",
        "email": "andusyu@google.com",
        "time": "Thu Dec 09 13:02:44 2021 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 09 13:02:44 2021 -0500"
      },
      "message": "Remove GetOutputDigests and add OutputDirectoryDigests to Metadata (#391)\n\n- Remove Remove GetOutputDigests function\r\n- Rename OutputDigests in Metadata to OutputFileDigests\r\n- Add new OutputDirectoryDigests field to Metadata\r\n- Set OutputDirectoryDigests in setOutputMetadata"
    },
    {
      "commit": "621016c64cfc884d5689239f860cf8448bd69c36",
      "tree": "6125a1093b7069d09ed1db2d577197bff86d90d0",
      "parents": [
        "74039f5783e9b00b9f37273f1b2855973e215a88"
      ],
      "author": {
        "name": "Andus Yu",
        "email": "andusyu@google.com",
        "time": "Fri Dec 03 13:49:58 2021 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Dec 03 13:49:58 2021 -0500"
      },
      "message": "Add GetOutputDigests function (#390)\n\nAdd GetOutputDigests function that computes and exposes the output file digests and output directory digests."
    },
    {
      "commit": "74039f5783e9b00b9f37273f1b2855973e215a88",
      "tree": "5ddbb8b67a9ffa66b37f62715f06986efe1ad8f9",
      "parents": [
        "1cffce26c0631db50673379056ef5fc9e9cd68aa"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Tue Nov 16 17:15:43 2021 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 16 17:15:43 2021 -0500"
      },
      "message": "Update rules_go and gazelle (#389)\n\nThe new gazelle version includes an old grpc dependency which\r\nis backwards incompatible. Bazel won\u0027t override it, so we\r\nhave to move our own dependencies up in the chain."
    },
    {
      "commit": "1cffce26c0631db50673379056ef5fc9e9cd68aa",
      "tree": "51e6f9f2caa84cc5bee4b8898abe5873b0c0ebc9",
      "parents": [
        "24688eb2fe7327d0a1e9a9428f26e2209733b23b"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Mon Nov 15 21:14:07 2021 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 15 21:14:07 2021 -0500"
      },
      "message": "Fix SDK to use working-directory relative output paths. (#292)\n\n* Fix SDK to use working-directory relative output paths.\r\n\r\nThis is the correct implementation according to the remote api.\r\n\r\nSee\r\nhttps://github.com/bazelbuild/remote-apis/blob/0943dc4e70e1414735a85a3167557392c177ff45/build/bazel/remote/execution/v2/remote_execution.proto#L609\r\nand\r\nhttps://github.com/bazelbuild/remote-apis/blob/0943dc4e70e1414735a85a3167557392c177ff45/build/bazel/remote/execution/v2/remote_execution.proto#L574"
    },
    {
      "commit": "24688eb2fe7327d0a1e9a9428f26e2209733b23b",
      "tree": "d4677ac6fa83fd66df35687adf5df4c3789c8ff7",
      "parents": [
        "af570c2721ed02629c1483c660416ca29626c926"
      ],
      "author": {
        "name": "David Goldsmith",
        "email": "davidgoldsmith@google.com",
        "time": "Mon Nov 15 17:35:38 2021 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 15 17:35:38 2021 -0500"
      },
      "message": "Add optional extended file attribute use to hash compute function (#387)\n\n* Add optional extended file attribute use to hash compute function\r\n\r\nInstructs the cache hash compute function to use the provided file\r\nattribute as the hash value, instead of loading the file into memory\r\nand hashing its contents.\r\nReturns an error if extended attributes are not supported or found."
    },
    {
      "commit": "af570c2721ed02629c1483c660416ca29626c926",
      "tree": "4c3896f9e77b5003646aac3098c34e32b5f59123",
      "parents": [
        "7ce4ddf652156c2cb3c38215191fdaa1a6d717a4"
      ],
      "author": {
        "name": "Junji Watanabe",
        "email": "jwata@google.com",
        "time": "Thu Nov 11 22:02:57 2021 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 12 15:02:57 2021 +0900"
      },
      "message": "Fix ComputeMerkleTree to handle empty root (#388)\n\n* Fix ComputeMerkleTree to handle empty root\r\n\r\n* Update go/pkg/client/tree_test.go\r\n\r\nCo-authored-by: Takuto Ikuta \u003ctikuta@google.com\u003e\r\n\r\n* t.TempDir\r\n\r\n* fix test\r\n\r\nCo-authored-by: Takuto Ikuta \u003ctikuta@google.com\u003e"
    },
    {
      "commit": "7ce4ddf652156c2cb3c38215191fdaa1a6d717a4",
      "tree": "b516bb2ca91d14bb3e089854b78bb35a5a1657e1",
      "parents": [
        "5d17687d9236f4fd5c2e8dd202c3b52b3b607d7a"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Wed Nov 10 13:24:47 2021 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 10 13:24:47 2021 -0500"
      },
      "message": "Throw errors for incorrectly tagged as empty paths (#386)\n\n"
    },
    {
      "commit": "5d17687d9236f4fd5c2e8dd202c3b52b3b607d7a",
      "tree": "5b23304ccd2d8a3eeea2038f99e6cd05f55e6338",
      "parents": [
        "eddee6820c53fb8bdd580e9d4f6a9f354beb3fb8"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Mon Nov 01 21:38:06 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 01 21:38:06 2021 +0900"
      },
      "message": "update protobuf version (#385)\n\n"
    },
    {
      "commit": "eddee6820c53fb8bdd580e9d4f6a9f354beb3fb8",
      "tree": "bda97e4c0132c3b360fb8006f37fe467f14cadab",
      "parents": [
        "5982a8ee418904498e21f47d95c5a000fd4a899f"
      ],
      "author": {
        "name": "Andus Yu",
        "email": "andus401@gmail.com",
        "time": "Wed Oct 27 14:17:15 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 27 14:17:15 2021 -0400"
      },
      "message": "Use res.Err for RemoteErrorResultStatus and TimeoutResultStatus (#384)\n\nWhen mocking tests, res.Err doesn\u0027t get read. This change sets the error \r\nmessage to be res.Err if it exists so that the error message can be\r\nforwarded to stderr for RemoteErrorResultStatus and TimeoutResultStatus."
    },
    {
      "commit": "5982a8ee418904498e21f47d95c5a000fd4a899f",
      "tree": "cc544f8a24b3ad58e0293a48e88b33eebf61cfc3",
      "parents": [
        "af1232ee0d79920ab8390fb855f95dca18a69cf0"
      ],
      "author": {
        "name": "David Goldsmith",
        "email": "wizard@houseoffire.ca",
        "time": "Fri Oct 15 14:09:36 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 15 14:09:36 2021 -0400"
      },
      "message": "Make numExecCalls increment atomic (#383)\n\nWhen execute() is called from multiple threads,\r\nthe standard increment of numExecCalls can result\r\nin a race condition leading to incorrect counts.\r\nUsing atomic eliminates the issue."
    },
    {
      "commit": "af1232ee0d79920ab8390fb855f95dca18a69cf0",
      "tree": "7f9ab12aaa121ec9cf9acf0fd97f9ff35f2398de",
      "parents": [
        "ddba20599b6eafae1669d4da1aa4772fb8c80efd"
      ],
      "author": {
        "name": "Mostyn Bramley-Moore",
        "email": "mostyn@unity3d.com",
        "time": "Thu Sep 09 20:21:19 2021 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 09 14:21:19 2021 -0400"
      },
      "message": "Add NoAuth mode to allow TLS without client authentication (#382)\n\n* Add NoAuth mode to allow TLS without client authentication\r\n\r\n* Fix lint warning ST1005"
    },
    {
      "commit": "ddba20599b6eafae1669d4da1aa4772fb8c80efd",
      "tree": "4b78b985143cf5c1f2c11160ec9de2b32d073c75",
      "parents": [
        "e00a422fe9ef8284c27fd79379894c8ea019efd3"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Fri Aug 20 18:22:24 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 20 18:22:24 2021 +0900"
      },
      "message": "tool: wrap err (#381)\n\nThis is for\r\nhttps://github.com/bazelbuild/remote-apis-sdks/pull/380#pullrequestreview-734706352"
    },
    {
      "commit": "e00a422fe9ef8284c27fd79379894c8ea019efd3",
      "tree": "942c6f9d33e2f321a579527cd1b89b16bfd842a5",
      "parents": [
        "d52cee3e4fe035f211574e735efc43c36388ae11"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Fri Aug 20 15:20:42 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 20 15:20:42 2021 +0900"
      },
      "message": "tool: add UploadBlobV2 (#380)\n\nThis is for http://b/184322586#comment34"
    },
    {
      "commit": "d52cee3e4fe035f211574e735efc43c36388ae11",
      "tree": "99150a7ccf9785a48bf2ba677253c8d6de874ede",
      "parents": [
        "4ee719b19f58b2deb29b3c225d80bb9b6178e4ce"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Thu Aug 12 11:05:39 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 12 11:05:39 2021 +0900"
      },
      "message": "cas: elaborate error from os.Lstat in visitSymlink (#377)\n\n* git squash commit for symlink_error.\r\n\r\nca800ed7f1937437cc1028667476f1575baf70c6\r\ncas: elaborate error from os.Lstat in visitSymlink\r\n\r\neae227f644cc591347f04c7201d2657b0e6dc7ac\r\nlog\r\n\r\n* WithStack\r\n\r\n* remove log"
    },
    {
      "commit": "4ee719b19f58b2deb29b3c225d80bb9b6178e4ce",
      "tree": "5e8f2ba62ea76714a42b72e90ee0497f8ca91c36",
      "parents": [
        "29944c168d496bf13fda987fd335f6347495485a"
      ],
      "author": {
        "name": "Philipp Wollermann",
        "email": "philwo@google.com",
        "time": "Wed Aug 11 17:00:40 2021 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 11 11:00:40 2021 -0400"
      },
      "message": "Download Golang during CI job (#379)\n\n"
    },
    {
      "commit": "29944c168d496bf13fda987fd335f6347495485a",
      "tree": "cf2c19573c30203110e0892a9577dc0368e14de9",
      "parents": [
        "499be560b0f1f03186cb8f0a3b350236907078a2"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Wed Aug 11 17:38:01 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 11 17:38:01 2021 +0900"
      },
      "message": "do not follow symlink if it is preserved (#378)\n\n* do not follow symlink if it is preserved\r\n\r\n* remove ErrFilteredSymlinkTarget\r\n\r\n* handle AllowDnaglingSymlinks\r\n\r\n* todo\r\n\r\n* comment"
    },
    {
      "commit": "499be560b0f1f03186cb8f0a3b350236907078a2",
      "tree": "40b3b42ccecaa2e870616a49bbbae38e53deb73e",
      "parents": [
        "7ce38e08f10da691c49b35a82df9fa471c65a7d2"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Tue Aug 03 13:57:19 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 03 13:57:19 2021 +0900"
      },
      "message": "cas: add trace logs (#376)\n\n"
    },
    {
      "commit": "7ce38e08f10da691c49b35a82df9fa471c65a7d2",
      "tree": "77f1b68c1e3619f266441e7a52f390e124aeda75",
      "parents": [
        "3db822c86088434a4d2d53ec2d3b889b9f8cf331"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Thu Jul 29 19:22:20 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 29 19:22:20 2021 +0900"
      },
      "message": "cas: check file existence for large file (#375)\n\n* git squash commit for find_missing_blobs.\r\n\r\nf54e66960caec36dd0de0eb7277e9f758c98818f\r\ncas: check file existence for large file\r\n\r\nZstd encoder seems reading some amount of file content before uploader\r\ngot response about existing file from byte stream client.\r\nThis avoids such unnecessary file read.\r\n\r\nfd89f19850e2d62317eb8e9c95bd467ec53d9a14\r\nwithstack\r\n\r\n* log"
    },
    {
      "commit": "3db822c86088434a4d2d53ec2d3b889b9f8cf331",
      "tree": "5fdb651b94b4e112c8befa6662e1e7de027d7f9c",
      "parents": [
        "3f34e744d83161ddcb602121b45b0b33185a36c5"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Tue Jul 27 10:37:16 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 27 10:37:16 2021 -0400"
      },
      "message": "Remove typos (#374)\n\n"
    },
    {
      "commit": "3f34e744d83161ddcb602121b45b0b33185a36c5",
      "tree": "63ee75529fffcdfb83c0c125a3f563a84f161bc7",
      "parents": [
        "e96eb06339fb616167ee02535ab54d9c3a382232"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Tue Jul 27 01:22:28 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 27 01:22:28 2021 -0400"
      },
      "message": "Make glog import consistent. (#373)\n\n"
    },
    {
      "commit": "e96eb06339fb616167ee02535ab54d9c3a382232",
      "tree": "b57e6069fb5e193b27e89041ad38746e98040337",
      "parents": [
        "1cec173a5bf76c02f435050d6fc9a02e1ccea637"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Mon Jul 26 20:56:42 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 26 20:56:42 2021 +0900"
      },
      "message": "add more log around upload (#372)\n\n"
    },
    {
      "commit": "1cec173a5bf76c02f435050d6fc9a02e1ccea637",
      "tree": "b2773dec2362bc11133d00e3951e9f56eb4756d0",
      "parents": [
        "21d6adc44e550f7aa5c4e9b3fedab838920a9632"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Mon Jul 19 12:20:03 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 19 12:20:03 2021 +0900"
      },
      "message": "update remote-apis (#371)\n\n"
    },
    {
      "commit": "21d6adc44e550f7aa5c4e9b3fedab838920a9632",
      "tree": "9f480b4a2ed6fcc0b4cad053a6ceb92473e42b4a",
      "parents": [
        "3c4ce9170b6c5a5d64bcc4feecc5bcdf5dd1f101"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Mon Jul 19 11:25:58 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 19 11:25:58 2021 +0900"
      },
      "message": "use semaphore for large file upload (#370)\n\n* git squash commit for sema_large.\r\n\r\n5e77bf08a4f055928291f09bb9f90f3037b8d96a\r\nuse semaphore for large file upload\r\n\r\nc277aca08e5d3df77108e1b3bdb8f5fec35ea8cc\r\ntodo\r\n\r\n246cacab570c8717861ee1e372dc03d6f781e558\r\nsem\r\n\r\n* with stack"
    },
    {
      "commit": "3c4ce9170b6c5a5d64bcc4feecc5bcdf5dd1f101",
      "tree": "5397c30a605391be5e5a9e4df3077c9abeaec563",
      "parents": [
        "d965bf95d0af9d88d90e9723aee6b332dc3ef93e"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Fri Jul 16 14:33:32 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 16 14:33:32 2021 +0900"
      },
      "message": "allow to use streamBufSize larger than 32KiB (#369)\n\n"
    },
    {
      "commit": "d965bf95d0af9d88d90e9723aee6b332dc3ef93e",
      "tree": "843cee266e6d087c53a30ee72e57340675cd8186",
      "parents": [
        "3ddc89f3e2b39308101060b3eeaa10a919cae13e"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Wed Jul 07 10:53:16 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 07 10:53:16 2021 +0900"
      },
      "message": "cas: fix deadlock (#368)\n\n"
    },
    {
      "commit": "3ddc89f3e2b39308101060b3eeaa10a919cae13e",
      "tree": "85649de8e20c680c79d9ef5489783c6a4fed073b",
      "parents": [
        "3d0cf1be08dd52d77204ad1be7e70fdd1e48c206"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Tue Jul 06 10:51:07 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 06 10:51:07 2021 -0400"
      },
      "message": "\"Wrap\" gRPC error codes. (#367)\n\nWhile gRPC error codes aren\u0027t wrapper-friendly (see\r\nhttps://github.com/grpc/grpc-go/issues/3616), we still\r\nwant to be able to get more context from errors.\r\n\r\nAdding stack traces on their messages was the easiest way\r\nI thought of that\u0027d maintain backwards compatibility."
    },
    {
      "commit": "3d0cf1be08dd52d77204ad1be7e70fdd1e48c206",
      "tree": "58bfb5805a169160dc62de4d039c7602f30a50a0",
      "parents": [
        "f9e6595d5634ac4d4221ba6dca9f5c2e64114b3f"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Tue Jul 06 10:46:04 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 06 10:46:04 2021 -0400"
      },
      "message": "Revert \"Add useful error message for uploading files. (#339)\" (#366)\n\nThis reverts commit e155d015bcc4c9eb9978572422e3404f26220700.\r\n\r\ngRPC errors are... hard. And the gRPC team isn\u0027t willing to support\r\nwrapping, which leads to complicated handling. See\r\nhttps://github.com/grpc/grpc-go/issues/3616.\r\n\r\nI\u0027ll send a different PR to add stack traces to these grpc errors."
    },
    {
      "commit": "f9e6595d5634ac4d4221ba6dca9f5c2e64114b3f",
      "tree": "fcf9b583fb245c82f9a1ae305eab3228ed9aa387",
      "parents": [
        "c672e5baca9280d181c7e2e87b3d9afd01650893"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Fri Jul 02 13:09:49 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 02 13:09:49 2021 +0900"
      },
      "message": "add size check (#365)\n\n"
    },
    {
      "commit": "c672e5baca9280d181c7e2e87b3d9afd01650893",
      "tree": "0770ec9acd936cb336099f544035a19fe2c1cb00",
      "parents": [
        "b2689fabc306d2cd20356f30b7f99eec445d9212"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Wed Jun 23 10:28:56 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 23 10:28:56 2021 -0700"
      },
      "message": "[cas] Add PathSpec.Allowlist (#360)\n\nIn the Isolate use case, we need to upload a directory partially.\r\nCurrently cas package does not let doing it efficiently.\r\n\r\nIt is possible to upload individual files/directories, but then the\r\ncaller has to construct the partial merkle tree themselves. For example,\r\nto upload \"/foo\" with only \"/foo/bar\" and \"/foo/baz\", but not\r\n\"/foo/qux\", the client has to upload bar and baz, and then calculate the\r\ndigest of /foo manually.\r\n\r\nIt is possible to exclude some paths using UploadOptions.Prelude,\r\nbut this filtering is at the UploadOptions level, while we need it at\r\nthe UploadInput level. Placing a callback in the UploadInput level makes\r\ncaching of intermediate directories difficult. In Go, it is not possible\r\nto tell if two function pointers represent the same function with same\r\ncaptured input.\r\n\r\nIntroduce UploadInput.Allowlist which is a list of paths, relative to\r\nUploadInput.Path, that must be uploaded. The client uploads them the usual\r\nway, and then constructs a partial Merkle tree to upload the root, as\r\nwell as the intermediate directories between the root and the\r\nallowlisted paths."
    },
    {
      "commit": "b2689fabc306d2cd20356f30b7f99eec445d9212",
      "tree": "f47c59027beb8430502b115ccb662a76247ebcaf",
      "parents": [
        "05222e7e8939959878a5798e51cf52e911feafaf"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Wed Jun 16 11:48:35 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 16 11:48:35 2021 -0700"
      },
      "message": "[cas] Refactor Digest() (#363)\n\n* [cas] Refactor Digest()\r\n\r\nUploadResult.Digest(PathSpec) semantics turned out to be complicated.\r\nRemove it, rename PathSpec back to UploadInput and add\r\nUploadInput.Digest(relPath string). The latter is easy to use, e.g.\r\nthe digest for UploadInput.Path is just UploadInput.Digest(\".\").\r\n\r\nSince UploadInputs are sent to the client over the channel, the caller\r\nmight want to produce them in different goroutines, where each goroutine\r\nmight want to read the computed digest back. Since those goroutines\r\ndon\u0027t necessarily know when Upload() call returns, add\r\nUploadInput.DigestComputed() function that returns a channel which is\r\nclosed when the digest for the UploadInput is computed.\r\nThis means Upload() call can be long-lived and multiple goroutines can\r\nupload files independently.\r\n\r\nAdd more tests."
    },
    {
      "commit": "05222e7e8939959878a5798e51cf52e911feafaf",
      "tree": "3511748d38714657954ea6da7d364b2757ad2727",
      "parents": [
        "dd6c290b2ce791f3a3e56583a9632f7b538e8a05"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Mon Jun 14 16:56:20 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 14 16:56:20 2021 -0700"
      },
      "message": "Fix lint (#357)\n\nFix lint left in\r\nhttps://github.com/bazelbuild/remote-apis-sdks/pull/340"
    },
    {
      "commit": "dd6c290b2ce791f3a3e56583a9632f7b538e8a05",
      "tree": "8ca9ea4897870a764b4c4779050501363347b239",
      "parents": [
        "5a8daf747858747b2bf6bdd59e7b07dedc17a244"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Mon Jun 14 14:53:39 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 14 14:53:39 2021 -0700"
      },
      "message": "[cas] Simplify UploadResult.Digest() signature (#362)\n\n* [cas] Simplify UploadResult.Digest() signature\r\n\r\nInstead of returning a possibly nil digest, introduce a new error\r\nErrNoDigest and return that instead. It simplifies most callsites: now\r\nthey check only 2 cases instead of 3.\r\n"
    },
    {
      "commit": "5a8daf747858747b2bf6bdd59e7b07dedc17a244",
      "tree": "92bbd7b70ce781dc77cbd775a7848e4426c4d839",
      "parents": [
        "e7ea26b93b496d4d30e98390682faf6f69f84cb7"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Thu Jun 10 22:47:52 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 10 22:47:52 2021 -0700"
      },
      "message": "[cas] Refactor code (#359)\n\n* [cas] Refactor code\r\n\r\nThis change is a pure refactoring, in preparation for the commit\r\nthat adds support for Allowlist.\r\n\r\nCo-authored-by: Rubens Farias \u003crubensf@google.com\u003e"
    },
    {
      "commit": "e7ea26b93b496d4d30e98390682faf6f69f84cb7",
      "tree": "2549cf47061b4933b2afcd70bbe6cea584221263",
      "parents": [
        "54f1f912015b39e71459bfbddb1f2956b1ef2f01"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Wed Jun 09 12:59:04 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 09 12:59:04 2021 -0700"
      },
      "message": "[cas] Fix joinFilePathsFast (#361)\n\nFix joinFilePathsFast where the first path is the root.\r\nWe don\u0027t expect it in production, but it happens in tests."
    },
    {
      "commit": "54f1f912015b39e71459bfbddb1f2956b1ef2f01",
      "tree": "28b93bc09f12f049bae0bf93c6025ef8aed70dfe",
      "parents": [
        "a5af2d4316599a3fea87a459290e5f88a022a43c"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Tue Jun 08 21:51:35 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 08 21:51:35 2021 +0900"
      },
      "message": "ignore WithStack (#358)\n\n"
    },
    {
      "commit": "a5af2d4316599a3fea87a459290e5f88a022a43c",
      "tree": "278838d0256c619235749db0d325c143adc2aac3",
      "parents": [
        "5d4d813411299a285f113cb541f2c5750746cdfa"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Wed Jun 02 09:00:56 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 02 09:00:56 2021 -0700"
      },
      "message": "Add return value names in singleflightcache (#356)\n\nSome functions in singleflightcache.go name their return values and some\r\ndon\u0027t. Name them in all functions for consistency."
    },
    {
      "commit": "5d4d813411299a285f113cb541f2c5750746cdfa",
      "tree": "a5c9b69d8af755670b46c830831985cb1f11fe63",
      "parents": [
        "882e3342509eb038dc04bf44581e5085c0320d16"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Wed Jun 02 09:30:31 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 02 09:30:31 2021 +0900"
      },
      "message": "chunker: remove unused field from Chunker (#355)\n\n"
    },
    {
      "commit": "882e3342509eb038dc04bf44581e5085c0320d16",
      "tree": "ed4286dff7f8690fcdfb5a1d8a4e4b44ad12ff93",
      "parents": [
        "8544bdc0f3112900675a72decdb7a978cece0be7"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Tue Jun 01 17:24:02 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 01 17:24:02 2021 -0700"
      },
      "message": "[cas] Add UploadResult.Digest() (#340)\n\nThe callers of Client.Upload need the digest back in order to\r\npass it to another system which would fetch the uploaded files.\r\nAdd a new type, UploadResult, returned by Client.Upload and having\r\nfunction Digest(PathSpec) which returns the digest.\r\n"
    },
    {
      "commit": "8544bdc0f3112900675a72decdb7a978cece0be7",
      "tree": "05c7638accc19afab2531a5181662f1c96102526",
      "parents": [
        "dd2d3976ed7c6482f361de7d24e24d5a8683c56c"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Tue Jun 01 14:36:19 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 01 14:36:19 2021 -0700"
      },
      "message": "[cas] Clean PathSpec.Path (#352)\n\n* [cas] Clean PathSpec.Path\r\n\r\nhttps://github.com/bazelbuild/remote-apis-sdks/pull/345\r\nremoved filepath.Abs call, but it has a side effect that we no longer\r\nclean the path. Clean it explicitly."
    },
    {
      "commit": "dd2d3976ed7c6482f361de7d24e24d5a8683c56c",
      "tree": "7a6297066d5a153d4d30e8c8424fbd4ce88d3505",
      "parents": [
        "95e5a027e4a7c863a581716d0c08419cf7c4111a"
      ],
      "author": {
        "name": "Mostyn Bramley-Moore",
        "email": "mostyn@antipode.se",
        "time": "Tue Jun 01 19:26:35 2021 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 01 13:26:35 2021 -0400"
      },
      "message": "Upgrade zstdpool-syncpool for DecoderWrapper.Close bugfix (#354)\n\n* Upgrade github.com/mostynb/zstdpool-syncpool\r\n\r\nThis includes a bugfix for DecoderWrapper.Close, where it was only\r\nreturning Decoders to the pool if Decoder.Reset(nil) failed, and\r\nupgrades github.com/klauspost/compress which has had a few zstd\r\nimprovements.\r\n\r\n* WORKSPACE cleanup: go_repository is no longer used\r\n\r\n* Don\u0027t diff a nil slice with an empty slice\r\n\r\nTestCompressedReader was failing (the first time around the loop?) because\r\nthe bytes.Buffer was created with a nil slice, then this was being compared\r\nto an empty slice:\r\n\r\nFAIL: TestCompressedReader/empty_blob (0.00s)\r\nreader_test.go:190: Read() \u003d incorrect result, diff(-want, +got):   []uint8(\r\n    - \tnil,\r\n    + \t{},\r\n      )"
    },
    {
      "commit": "95e5a027e4a7c863a581716d0c08419cf7c4111a",
      "tree": "3dec9ef622786137fbd874dfd9c33e50f86b78a0",
      "parents": [
        "1a7d2a4198fa0eb8515593b5259f495cdacf75ab"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Thu May 27 17:54:51 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 27 17:54:51 2021 +0900"
      },
      "message": "golangci-lint.yml: enable only-new-issues (#351)\n\nThis is to ignore existing warnings."
    },
    {
      "commit": "1a7d2a4198fa0eb8515593b5259f495cdacf75ab",
      "tree": "156fea3f913874849ddb726cae6dc11a6ec23ee8",
      "parents": [
        "f831c118b9c9e1dd3e857fbe43da7c992c91b20f"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Wed May 26 10:55:31 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 26 10:55:31 2021 -0700"
      },
      "message": "[cas] Require PathSpec.Path to be absolute (#345)\n\nA future CL with all PathSpec.Allowlist which is a list of\r\nPathSpec.Path\u0027s descendants. It makes more sense for such paths to\r\nbe relative to PathSpec.Path than to CWD, but it would be confusing to\r\nhave/allow one struct (PathSpec) to contais paths relative to different\r\ndirs."
    },
    {
      "commit": "f831c118b9c9e1dd3e857fbe43da7c992c91b20f",
      "tree": "eda49c2ed55dd50c156568521faec6041f6f2193",
      "parents": [
        "ead1458eda2b7c756138429121a3e22bd5c9aa5a"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Tue May 25 22:24:51 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 25 22:24:51 2021 +0900"
      },
      "message": "make (*Chunker).Reset returns error (#348)\n\nThis is to confirm Reset doesn\u0027t return error in\r\nhttps://crbug.com/1189349#c33"
    },
    {
      "commit": "ead1458eda2b7c756138429121a3e22bd5c9aa5a",
      "tree": "45d75eb7a6c0361f9d0664331ad454a5336f1ffc",
      "parents": [
        "f9d52cdef1c3aa8612d9c3ed7a0b65f96e55d870"
      ],
      "author": {
        "name": "Yoshisato Yanagisawa",
        "email": "yoshisato.yanagisawa@gmail.com",
        "time": "Tue May 25 21:27:34 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 25 08:27:34 2021 -0400"
      },
      "message": "Preserving symlink or not can be configured from Command. (#343)\n\nFor some toolchains, a user need to run a wrapper to run a compiler.\r\nSuch a wrapper sometimes use readlink inside and resolving symlink\r\nbreaks such a script.  To make it work, we need to preserve symlinks.\r\nfails to run.  The behavior is only needed for certain toolchains,\r\nlet me make it configurable via Command.InputSpec message.\r\n"
    },
    {
      "commit": "f9d52cdef1c3aa8612d9c3ed7a0b65f96e55d870",
      "tree": "6331c04d7e29ae49538ece2c92fff90699f2da7b",
      "parents": [
        "d94f8a8ba888d384686a7cd74d8a9d0795ba4b6d"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Fri May 21 11:21:07 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 21 11:21:07 2021 -0400"
      },
      "message": "Catch another pool check (#347)\n\n"
    },
    {
      "commit": "d94f8a8ba888d384686a7cd74d8a9d0795ba4b6d",
      "tree": "a095a424dd23fa0d5c311f5993bd3eb2daa09a00",
      "parents": [
        "752e4efb2631b45f5c27120f83d517cc2b2846d2"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Fri May 21 10:52:17 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 21 10:52:17 2021 -0400"
      },
      "message": "Small tweaks to appease internal import checks. (#346)\n\n"
    },
    {
      "commit": "752e4efb2631b45f5c27120f83d517cc2b2846d2",
      "tree": "5283da94201c4859fac3600da5ecbca24ce6835e",
      "parents": [
        "3dfb518d390280a2ffef5a85ab1852a2a526a983"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Fri May 21 07:44:02 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 21 07:44:02 2021 -0400"
      },
      "message": "google/uuid -\u003e pborman/uuid (#344)\n\nI don\u0027t know why we use this one, but we should retain consistency."
    },
    {
      "commit": "3dfb518d390280a2ffef5a85ab1852a2a526a983",
      "tree": "911aa2781ca248cb1900f6db569917f7b369974a",
      "parents": [
        "e155d015bcc4c9eb9978572422e3404f26220700"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Thu May 20 21:19:37 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 20 21:19:37 2021 -0700"
      },
      "message": "[cas] Rename UploadInput to PathSpec (#342)\n\n* [cas] Rename UploadInput to PathSpec\r\n\r\nRename UploadInput to PathSpec, which specifies a subset\r\nof the file system. Also remove UploadInput.Content as it is not\r\ncritical for most use cases and complicates more important things.\r\n\r\nRename PathSpec.PathExclude to just PathSpec.Exclude for simplicity.\r\n"
    },
    {
      "commit": "e155d015bcc4c9eb9978572422e3404f26220700",
      "tree": "0c5c2d2fdda1789e04f22ef1b00802dcaa9de9b8",
      "parents": [
        "0e577525a2dce2d0e7bddd80927c8901d28bf0fb"
      ],
      "author": {
        "name": "bansalvinayak",
        "email": "vinayakbansal@google.com",
        "time": "Thu May 20 15:12:10 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 20 15:12:10 2021 -0400"
      },
      "message": "Add useful error message for uploading files. (#339)\n\n"
    },
    {
      "commit": "0e577525a2dce2d0e7bddd80927c8901d28bf0fb",
      "tree": "1581e784ded62405584f855bf74515a96ce4972b",
      "parents": [
        "80ea864b211ee3d87e14f4be0ca8d17e5917062c"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Wed May 19 18:58:17 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 19 18:58:17 2021 -0700"
      },
      "message": "[cas] PathExclude: use forward-slash-separated paths (#341)\n\nDo not force users to make PathExclude conditional on the OS,\r\nby normalizing paths to use forward-slashes before checking PathExclude."
    },
    {
      "commit": "80ea864b211ee3d87e14f4be0ca8d17e5917062c",
      "tree": "0ce49491cfbc1aecd1d68a0747bbcfa3068a2d4b",
      "parents": [
        "2a9b29928abe867026e37833fa480ed16238df7a"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Tue May 18 17:56:42 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 18 17:56:42 2021 -0700"
      },
      "message": "[cas] Read files once (#335)\n\n* [cas] Read files once\r\n\r\nCurrently PathExclude regexp is incorporated into the cache key\r\nunconditionally. However, it is really needed only for directories.\r\nThere is no need to do this for regular files and symlinks,\r\notherwise the same regular file may be read more than once.\r\n\r\nDo not incorporate the PathExclude into cache key for regular files.\r\n\r\nCo-authored-by: Rubens Farias \u003crubensf@google.com\u003e"
    },
    {
      "commit": "2a9b29928abe867026e37833fa480ed16238df7a",
      "tree": "8c727cdc06e52ebb5b8027342ed0f7b091855683",
      "parents": [
        "45f49a9529f755fb586fe2f8bf3e78b1eae39e81"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Tue May 18 09:48:27 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 18 09:48:27 2021 -0700"
      },
      "message": "[cas] Rename UploadOptions.Callback to Prelude (#334)\n\n* [cas] Rename UploadOptions.Callback to Prelight\r\n\r\nCallback may mean many things. The name does not entail *when* it is\r\ncalled. The next CL will introduce another callback which is called\r\n*after* a blob is uploaded. Rename \"Callback\" to \"Prelude\" to reduce the\r\nambiguity."
    },
    {
      "commit": "45f49a9529f755fb586fe2f8bf3e78b1eae39e81",
      "tree": "63d71306e963e34b698d13489e7b589a5f2c9cf8",
      "parents": [
        "395c674af7a9cd696dfd1f2b4a950f6899ccb3a0"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Tue May 18 09:16:13 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 18 09:16:13 2021 -0700"
      },
      "message": "[cas] Unembed cas.Client.ClientConfig. (#333)\n\nCurrently cas.Client struct embeds ClientConfig struct.\r\nAs a result, IDE autocompletion for cas.Client suggests lots\r\nof low-level not-that-interesting fields, so Upload() is buried\r\namong them.\r\n\r\nUnembed the ClientConfig struct."
    },
    {
      "commit": "395c674af7a9cd696dfd1f2b4a950f6899ccb3a0",
      "tree": "9060777fd47a50a1316257a0eb1ca4b752e0179d",
      "parents": [
        "799af6dbccb19f904197d117a4b827fa4aed90db"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Tue May 18 11:32:39 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 18 11:32:39 2021 +0900"
      },
      "message": "remove unused variables (#332)\n\n* remove unused variable\r\n"
    },
    {
      "commit": "799af6dbccb19f904197d117a4b827fa4aed90db",
      "tree": "1734431916d203530dddebb24e88aab81575f14c",
      "parents": [
        "0e4d293d7e020e892f4eeb3c7173be8969ba6a00"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Mon May 17 22:56:11 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 17 22:56:11 2021 +0900"
      },
      "message": "add .golangci.yml (#331)\n\n* add .golangci.yml\r\n\r\n* set --issues-exit-code\u003d0"
    },
    {
      "commit": "0e4d293d7e020e892f4eeb3c7173be8969ba6a00",
      "tree": "c2a0daa6cfba63ede8ee9ed3ea5235185f1b2379",
      "parents": [
        "7d771a4d76bbebb4deb0f0239f96e0abdeb4fdcb"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "atetubou@gmail.com",
        "time": "Mon May 17 22:45:13 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 17 22:45:13 2021 +0900"
      },
      "message": "Create golangci-lint.yml (#330)\n\n"
    },
    {
      "commit": "7d771a4d76bbebb4deb0f0239f96e0abdeb4fdcb",
      "tree": "2b63c4561f208c0869307d805b1f62baf3d38708",
      "parents": [
        "3b602dd48f7f63a76cb1087a10355b3c668d583f"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Thu May 13 13:41:33 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 13 13:41:33 2021 +0900"
      },
      "message": "apply `bazel run //:gazelle` (#329)\n\n"
    },
    {
      "commit": "3b602dd48f7f63a76cb1087a10355b3c668d583f",
      "tree": "0f3929f82c4d370200c90ea7093c2804c5389aa0",
      "parents": [
        "476a158f5413fb9bba6df63148f699e26bf5835c"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Wed May 12 11:49:22 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 12 11:49:22 2021 -0700"
      },
      "message": "[cas] Implement per-request timeouts in a stream (#325)\n\n* [cas] Implement per-request timeouts in a stream\r\n\r\ngrpc package does not have native support for per-request timeouts for\r\nstreaming RPC. Add a helper function to accommodate that.\r\n\r\nThe func is not specific to CAS, but it wasn\u0027t obvious which package\r\nis a better place for it, so place it in `cas/client.go` for now."
    },
    {
      "commit": "476a158f5413fb9bba6df63148f699e26bf5835c",
      "tree": "aa531a45d6abd474ff11a3b0eccf752a3a34f71f",
      "parents": [
        "b0605647bbe2ff7d046a286c3023e7714376fb83"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Wed May 12 11:14:20 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 12 11:14:20 2021 -0400"
      },
      "message": "Update golang, rules_go and gazelle. (#328)\n\nThis uses the newer (nicer) gazelle naming scheme."
    },
    {
      "commit": "b0605647bbe2ff7d046a286c3023e7714376fb83",
      "tree": "ab4cabc515e9cadaddbef56df106eed3abe8f3d5",
      "parents": [
        "7182b476eb6260fae9ba2bd8995b97a7096e340c"
      ],
      "author": {
        "name": "Takuto Ikuta",
        "email": "tikuta@google.com",
        "time": "Wed May 12 22:10:45 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 12 22:10:45 2021 +0900"
      },
      "message": "include file path in upload error (#327)\n\n"
    },
    {
      "commit": "7182b476eb6260fae9ba2bd8995b97a7096e340c",
      "tree": "7cf12c176209e4eb4eb8deba8319fed42a47c0d6",
      "parents": [
        "7447b28dd69e22848ee850936a1cdd28e2d0e20b"
      ],
      "author": {
        "name": "nodirg",
        "email": "56001730+nodirg@users.noreply.github.com",
        "time": "Tue May 11 21:52:41 2021 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 11 21:52:41 2021 -0700"
      },
      "message": "[cas] Implement streaming (#320)\n\n* [cas] Implement streaming\r\n\r\nThis CL implements streaming of files/blobs using ByteStream service\r\nwith compression. This is the last major part of the uploader\r\nimplementation.\r\n"
    },
    {
      "commit": "7447b28dd69e22848ee850936a1cdd28e2d0e20b",
      "tree": "7705cb3c814daeb0961bb5c47d0726c7015b12a4",
      "parents": [
        "5121020d2a436fe8ced44ab65be31d5f0c4a1276"
      ],
      "author": {
        "name": "ramymedhat",
        "email": "abdelaal@google.com",
        "time": "Tue May 11 11:48:43 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 11 11:48:43 2021 -0400"
      },
      "message": "Add Mtime to the file metadata cache. (#326)\n\n* Add Mtime to the file metadata cache.\r\n\r\n* Address comments."
    },
    {
      "commit": "5121020d2a436fe8ced44ab65be31d5f0c4a1276",
      "tree": "ba837a00b2f2760258f49045245670bc0f43a929",
      "parents": [
        "abb14633e09633368f06d8e4fd28bd1553509061"
      ],
      "author": {
        "name": "Rubens Farias",
        "email": "rubensf@google.com",
        "time": "Fri Apr 30 12:41:06 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 30 12:41:06 2021 -0400"
      },
      "message": "Update RE dependency to get latest go bindings. (#324)\n\nWe have to figure out the bazel-foolness to recompile these protos,\r\ninstead of using the pb.go available. On the meanwhile, this updates\r\nit to the latest version where the .go is in sync with the .pb."
    }
  ],
  "next": "abb14633e09633368f06d8e4fd28bd1553509061"
}
