)]}'
{
  "commit": "b9ed21948754001e31e209612b6ef8a5b2ad8e9f",
  "tree": "9aeb2556f4d51e0ef66dcdd0bb5dba1b9d674758",
  "parents": [
    "ce650b0ce8fa95fc13d4744a293f3e9b00266bee"
  ],
  "author": {
    "name": "Nate Bosch",
    "email": "nbosch@google.com",
    "time": "Tue May 02 09:20:15 2023 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue May 02 09:20:15 2023 -0700"
  },
  "message": "Synchronously forward chained cancellations (#239)\n\nAdd a test which chains through multiple `.then` calls and then cancels\r\nthe original operation. This test passes with the original code, but\r\nstarts failing after fixing a bug in `Completer.complete` in the SDK.\r\nhttps://dart-review.googlesource.com/c/sdk/+/258929\r\n\r\n- Add a list of extra completers to forward cancellation. In places\r\n  where the cancellation had been forwarded through a `whenComplete`,\r\n  add to the list of extra cancellations instead. This allows the Future\r\n  return by the outer cancellation to wait for the other callbacks to\r\n  complete before firing.\r\n- When setting up forwarding on an already canceled completer,\r\n  immediately forward the cancellation.\r\n- When forwarding cancellations, don\u0027t repeatedly call `_cancel()` on a\r\n  completer which has already been canceled.\r\n- In `race()`, disable cancellation propagation to prevent a cyclic\r\n  cancellation.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "573d87fb865ba6c16ede0b85ec669973dd8adabe",
      "old_mode": 33188,
      "old_path": "CHANGELOG.md",
      "new_id": "210c876eb93b341462da9aee1266daf826f2fa96",
      "new_mode": 33188,
      "new_path": "CHANGELOG.md"
    },
    {
      "type": "modify",
      "old_id": "09997e0f757ec2bccd8cf1c5f6cb61fff6703d45",
      "old_mode": 33188,
      "old_path": "lib/src/cancelable_operation.dart",
      "new_id": "8cc0c675834c16a340d840d38d9658ce722c2f24",
      "new_mode": 33188,
      "new_path": "lib/src/cancelable_operation.dart"
    },
    {
      "type": "modify",
      "old_id": "61dd362b87c3b80d3f4ddd843fd39a4535eaf50e",
      "old_mode": 33188,
      "old_path": "pubspec.yaml",
      "new_id": "9802f7875f924d0e469d21f542cedda2caa3affd",
      "new_mode": 33188,
      "new_path": "pubspec.yaml"
    },
    {
      "type": "modify",
      "old_id": "63ba2c3423a4fe6a32286d6957c7d7729c5bde04",
      "old_mode": 33188,
      "old_path": "test/cancelable_operation_test.dart",
      "new_id": "f72f7e99782696dbbba059bc2381d78c2b563568",
      "new_mode": 33188,
      "new_path": "test/cancelable_operation_test.dart"
    }
  ]
}
