)]}'
{
  "commit": "c50d64d903d1322733544eb86d730426af4a0812",
  "tree": "e47d0c2e943ac35971736a114ca4a906f24725b9",
  "parents": [
    "9067e269a9f2866e659ef33a69aad72b01cb6633"
  ],
  "author": {
    "name": "Sam Thursfield",
    "email": "sam@afuera.me.uk",
    "time": "Tue Jul 03 23:44:44 2018 +0200"
  },
  "committer": {
    "name": "Sam Thursfield",
    "email": "sam@afuera.me.uk",
    "time": "Tue Jul 03 23:44:44 2018 +0200"
  },
  "message": "_artifactcache/pushreceive.py: Avoid premature \u0027done\u0027 messages\n\nCode exists in OSTreePusher.needed_commits() to raise a\nPushExistsException() if the local commit (what we want to push) is not\na descendent of the remote commit (what the artifact cache has).\n\nCode also exists in OSTreePusher.run() to ignore this exception, unless\nthere are no refs that we can push. So situations occur where the push\ncontinues even though one of the refs can\u0027t be updated due to this\ninconsistency.\n\nThat would be fine except that before we raise the PushExistsException,\nwe call send_done() and hang up the connection. So the push goes on to\nfail with \"Expected reply, got none\" as the remote has already hung up.\n\nThis commit moves the send_done() call further down so that it only\nhappens once we know the PushExistsException is not going to be ignored.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "41dacf33f0027846a0179c551939f9e405eebade",
      "old_mode": 33188,
      "old_path": "buildstream/_artifactcache/pushreceive.py",
      "new_id": "5cd65b2e6233144e348c7a2a76b470e3342bee4d",
      "new_mode": 33188,
      "new_path": "buildstream/_artifactcache/pushreceive.py"
    }
  ]
}
