)]}'
{
  "commit": "259ee664685eeb04250e8a637f861ff7e69b390d",
  "tree": "41c2e589b7049bce1deb820fb490483ba2a3bab1",
  "parents": [
    "865b4e42fd8022363f3e5fa147328557de7fbe78"
  ],
  "author": {
    "name": "Richard Levasseur",
    "email": "richardlev@gmail.com",
    "time": "Sun Aug 16 15:49:07 2026 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun Aug 16 15:49:07 2026 -0700"
  },
  "message": "build(release): add process-news command with PR and version marker support (#4062)\n\nDuring release preparation, maintainers currently have to manually\nlocate news fragments from merged PRs, assemble them into\nCHANGELOG.md, delete consumed news files, and update documentation\nversion markers ({versionadded}/{versionchanged}). Doing this manually\nacross many PRs is tedious and prone to human error.\n\nAdd the `process-news` subcommand to the release tool in\n`process_news.py` to automate merging specific news files and PR\nchanges into an existing release section in CHANGELOG.md, removing\nprocessed news files, and updating `VERSION_NEXT_*` markers to the\ntarget release version.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "d160dcf4d5498b133e63bf7bbf1f6724777da208",
      "old_mode": 33188,
      "old_path": "RELEASING.md",
      "new_id": "318434cc1a2297cdbbe1125e010250f667ee86c5",
      "new_mode": 33188,
      "new_path": "RELEASING.md"
    },
    {
      "type": "modify",
      "old_id": "c930d194c87c68e949f70db348dbeb7c9392dc0e",
      "old_mode": 33188,
      "old_path": "tests/tools/private/release/BUILD.bazel",
      "new_id": "e69e19050686736968400b4c364d23bac6469873",
      "new_mode": 33188,
      "new_path": "tests/tools/private/release/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "4027edd6bd1617ee55f8359368d0b10809db9165",
      "old_mode": 33188,
      "old_path": "tests/tools/private/release/gh_test.py",
      "new_id": "19f8658cff5d333f37cd4dc24aac5704d0d8c3f6",
      "new_mode": 33188,
      "new_path": "tests/tools/private/release/gh_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "db83d64e755f37a262b49b7b806fd04c4fb3fb33",
      "new_mode": 33188,
      "new_path": "tests/tools/private/release/process_news_test.py"
    },
    {
      "type": "modify",
      "old_id": "83faa7c00b89594e90315b42a90a6559883f26b7",
      "old_mode": 33188,
      "old_path": "tests/tools/private/release/utils_test.py",
      "new_id": "5eeac658205fd870095fb874a4eb64db5172807f",
      "new_mode": 33188,
      "new_path": "tests/tools/private/release/utils_test.py"
    },
    {
      "type": "modify",
      "old_id": "5f80d1130a72c4e2be44d05d628d74826816b49f",
      "old_mode": 33188,
      "old_path": "tools/private/release/BUILD.bazel",
      "new_id": "d484c015ae5ec50680177eb283824da635868ac4",
      "new_mode": 33188,
      "new_path": "tools/private/release/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "dbe644c29f844a8fda2229254cb2722627708390",
      "old_mode": 33188,
      "old_path": "tools/private/release/gh.py",
      "new_id": "bde969068b9b2077e0aa8035dce9199b1be8a13a",
      "new_mode": 33188,
      "new_path": "tools/private/release/gh.py"
    },
    {
      "type": "modify",
      "old_id": "0b5b672517b42d6dbb7206ed64a5798623c66c30",
      "old_mode": 33188,
      "old_path": "tools/private/release/mock_gh.py",
      "new_id": "f35d0db5e860929a64a84c0c1b7672364788039e",
      "new_mode": 33188,
      "new_path": "tools/private/release/mock_gh.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "80ca394e8d02884453afae69435983c152e6ad8f",
      "new_mode": 33188,
      "new_path": "tools/private/release/process_news.py"
    },
    {
      "type": "modify",
      "old_id": "416d9b54fd2a79bf853e83786e89330b9790f700",
      "old_mode": 33188,
      "old_path": "tools/private/release/release.py",
      "new_id": "9df5ba8606884eaa71c0200f9307933d9dbe793d",
      "new_mode": 33188,
      "new_path": "tools/private/release/release.py"
    },
    {
      "type": "modify",
      "old_id": "b0573d2af7201207fcc79831b47f582277a5a1bc",
      "old_mode": 33188,
      "old_path": "tools/private/release/utils.py",
      "new_id": "f6e266fe0157e6bc8a63668879c0a794f6f3d7eb",
      "new_mode": 33188,
      "new_path": "tools/private/release/utils.py"
    }
  ]
}
