)]}'
{
  "commit": "9734b11bbd1ec2d04431bd0865b1a59778473397",
  "tree": "c8fbf279b72fb32860bf12a1bce7e67ef379cb37",
  "parents": [
    "097f6a15c186f170a0471a0551e47fc910889693"
  ],
  "author": {
    "name": "Richard Levasseur",
    "email": "richardlev@gmail.com",
    "time": "Mon Jun 29 18:05:41 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Jun 29 18:05:41 2026 -0700"
  },
  "message": "chore(release): add dry-run to release tool prepare command (#3869)\n\nTo enable safe testing of the release pipeline, this change introduces a\n--dry-run flag to the prepare command that simulates all repository and\nGitHub actions.\n\nThis also fixes a few issues with the prepare command not fully working\nend-to-end.\n\nAlong the way, factor out the code a bit. release.py was over 1000 lines\nand\nbecoming unwieldly.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "7d5e93aa6b54f861e660e6fa3684a9eb8ae97f54",
      "old_mode": 33188,
      "old_path": ".github/workflows/prepare_release.yml",
      "new_id": "b080f121eb8a25aeeff2ecf8ebb1ecd1abdbfa41",
      "new_mode": 33188,
      "new_path": ".github/workflows/prepare_release.yml"
    },
    {
      "type": "modify",
      "old_id": "4ec7de53ba575b600d8a4e58316638dc01e1afd7",
      "old_mode": 33188,
      "old_path": "tests/tools/private/release/release_test.py",
      "new_id": "534aa2a5fdb5037d0cbfad91b5abb89613da3419",
      "new_mode": 33188,
      "new_path": "tests/tools/private/release/release_test.py"
    },
    {
      "type": "modify",
      "old_id": "747cb74e10d2e03d4c3adb54c55c0a41368391e9",
      "old_mode": 33188,
      "old_path": "tools/private/release/BUILD.bazel",
      "new_id": "96f864141d3eb3db5fc2100076c0620c02db1141",
      "new_mode": 33188,
      "new_path": "tools/private/release/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "09a0d3ae47030f2587c4c388323e3b3e72cfce72",
      "old_mode": 33188,
      "old_path": "tools/private/release/gh.py",
      "new_id": "f37d87f3966eb0d3a5ed8808c2d50ddc4bb9a9f3",
      "new_mode": 33188,
      "new_path": "tools/private/release/gh.py"
    },
    {
      "type": "modify",
      "old_id": "4e623e2f7ae37b8e2f02f17168fd3808023b39d7",
      "old_mode": 33188,
      "old_path": "tools/private/release/git.py",
      "new_id": "9c2662d4e67d1c40805a6c5b0767b01ecb1c9bb6",
      "new_mode": 33188,
      "new_path": "tools/private/release/git.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1d946bda6c67acbe0cdb55e863f69fc1d9e7f76d",
      "new_mode": 33188,
      "new_path": "tools/private/release/prepare.py"
    },
    {
      "type": "modify",
      "old_id": "3c2eed82ff923ffd68191504ccc0bb9494267e80",
      "old_mode": 33188,
      "old_path": "tools/private/release/release.py",
      "new_id": "d9a225d5cf58b3a8ae2873da8482342a5533b5a2",
      "new_mode": 33188,
      "new_path": "tools/private/release/release.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "27bcf3d7746ffefe69e7f591d25be2d5d373608b",
      "new_mode": 33188,
      "new_path": "tools/private/release/release_issue.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cfff53f4e44904cf9ab27269cd79fabc14b247bf",
      "new_mode": 33188,
      "new_path": "tools/private/release/shell.py"
    },
    {
      "type": "modify",
      "old_id": "5eb7c43a718e7ff8c9691a0111ceb906a0a34a3a",
      "old_mode": 33188,
      "old_path": "tools/private/release/utils.py",
      "new_id": "83ecbb9c7a13987c232c0efb1ab47fc0ba4a6e5e",
      "new_mode": 33188,
      "new_path": "tools/private/release/utils.py"
    }
  ]
}
