)]}'
{
  "commit": "2e54c4a8ea6cd860d4930b4c783f812104de4995",
  "tree": "e13b97ae49b4fe9a4d30255f3ef4433b15453489",
  "parents": [
    "8b973f01c47d13ccd4e4fcab44bdcc9f8b02130a"
  ],
  "author": {
    "name": "Jonah Williams",
    "email": "jonahwilliams@google.com",
    "time": "Mon Oct 26 15:49:07 2020 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Oct 26 15:49:07 2020 -0700"
  },
  "message": "[flutter_tools] implement safe file copy with multiple fallbacks (#69000)\n\nThe tool observes a large number of unhandled exceptions during the file copy portion of flutter create. it is difficult to tell whether the permission issue is caused by the source/destination, or whether it is due to a bug in dart:io.\r\n\r\nTo work around this, implement a permission check for both the source and dest files. If either fails, the tool can exit with a more specific message.\r\n\r\nIf these checks pass, then perform the actual copy. If the copy fails, fallback to manually copying the bytes",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f6816b65c42778fe6f2bbee2fb6c924394f5f0d3",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/base/error_handling_io.dart",
      "new_id": "bbb8ceba92c4bd444acd67276e491c7e26e0cd32",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/base/error_handling_io.dart"
    },
    {
      "type": "modify",
      "old_id": "362aea923ba47b4c8a8f1d314ac15cd81c4c0c00",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/commands/create.dart",
      "new_id": "be0d6855ed394db8d35c41ce0ba73404b97a8e96",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/commands/create.dart"
    },
    {
      "type": "modify",
      "old_id": "f2dd9acddaa03e99b7ce33b5fed46ad3634ae907",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/project.dart",
      "new_id": "136fdd298ac6216f08375ef93a956abd12f176c1",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/project.dart"
    },
    {
      "type": "modify",
      "old_id": "5ee19d343290ee33cf2f3a7e01a0f7747718695d",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/reporting/events.dart",
      "new_id": "ac4fab2ef2c5f713b823de4237ebfd22cff68bef",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/reporting/events.dart"
    },
    {
      "type": "modify",
      "old_id": "4d0244d56041c5d07114c2f8665942a642aa8446",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/lib/src/template.dart",
      "new_id": "cb3e98036cd0c5c1b40eae081976a16f71377bc7",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/lib/src/template.dart"
    },
    {
      "type": "modify",
      "old_id": "00df1a4b766fe4de7b217fc83bf71f397448c893",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/test/general.shard/base/error_handling_io_test.dart",
      "new_id": "af3e16631cd1f0c2a40bff54e66c360119b7adc6",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/test/general.shard/base/error_handling_io_test.dart"
    },
    {
      "type": "modify",
      "old_id": "03aad6e31f1bccc5a93d63d5dba4ebe5beb4f260",
      "old_mode": 33188,
      "old_path": "packages/flutter_tools/test/template_test.dart",
      "new_id": "fb7bde14c7ca3f0849c43711fd2c6fbd70dcde4f",
      "new_mode": 33188,
      "new_path": "packages/flutter_tools/test/template_test.dart"
    }
  ]
}
