)]}'
{
  "commit": "fc00d4f2f6e89c7066e141eb507969daf22c3b5a",
  "tree": "cfda12b9c1a95e72ff6d85c99272672cc4c89e45",
  "parents": [
    "afede1badd98cc03c9a65bca286e3e28b10ad5c2"
  ],
  "author": {
    "name": "吴晟 Wu Sheng",
    "email": "wu.sheng@foxmail.com",
    "time": "Fri Aug 14 13:05:10 2026 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Aug 14 13:05:10 2026 +0800"
  },
  "message": "Name the vote-passed versions explicitly; never take them positionally (#822)\n\n`vote-passed \u003cold_version\u003e` published the version resolved from the tag and\ndeleted the version passed as the argument. Two versions that do opposite things,\nand only one of them positional - the deleted one. Reading `vote-passed 9.7.0` as\n\"release 9.7.0\" is the natural interpretation, and it would have promoted 9.7.0\ninto dist/release and then immediately svn rm\u0027d it.\n\nTake them by name, or ask for them:\n\n    vote-passed --release 9.7.0 --old_version 9.6.0\n    vote-passed --release 9.7.0 --no-cleanup\n    vote-passed                              # asks for both\n\nAnything not named is prompted for, each prompt saying what will happen to that\nversion. Positional arguments are now an error pointing at the named form, so\nexisting muscle memory fails loudly rather than quietly meaning something else.\nEqual versions are refused and the release version must already be tagged.\nRELEASE_VERSION and OLD_VERSION still work, with the flags winning over them.\n\nVersions are validated by one anchored regex, shared with cleanup. A glob such as\n[0-9]*.[0-9]*.[0-9]* accepts \"9.7.0/\", which is textually different from \"9.7.0\"\nand so slips past the equality guard, yet SVN canonicalises the trailing slash -\ncleanup would have deleted the release promote had just published. Anchoring also\nrejects whitespace, v-prefixes, traversal and command characters before any of it\nreaches an svn path.\n\nThe defaults behind the prompts were wrong too. The release version came from the\nhighest version tag, but releases are not monotonic: a 9.6.1 patch cut from the\n9.6.0 line after 9.7.0 has shipped is newer in time but lower in version, so the\nsuggestion would have been the already-released 9.7.0. Order by tag creation date\ninstead - maven-release-plugin writes annotated tags, so that timestamp belongs to\nthe tag and survives fetches. The old version now comes from dist/release, the\nonly place that knows what this release actually replaces, with the version being\nreleased filtered out so re-running after a partial failure cannot offer to delete\nit.\n\nBoth detectors are genuinely best effort. Under `set -euo pipefail` a failed\nsvn ls, or a grep matching nothing - which is exactly the state after a partial\nfailure, when only the new release remains - aborted the release instead of\nyielding no suggestion, leaving the \"could not read dist/release\" branch\nunreachable. They now return success with empty output.\n\nTesting the flags uncovered a bug that predates them and reached every command.\nerror() wrote to stdout, and resolve_version is always called as\n`version\u003d$(resolve_version ...)`, so its message was captured into the variable\ninstead of shown: releasing an untagged version aborted, correctly, but printed\nnothing about why. info/warn/error now write to stderr. The email templates use\nplain echo, so they stay on stdout and remain pipeable.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3107827cff78c095099c4eacf1429aeebdb4dcb0",
      "old_mode": 33188,
      "old_path": "docs/en/contribution/release-java-agent.md",
      "new_id": "71b8c500b483aac6c3e9fccd9114d776db9138d0",
      "new_mode": 33188,
      "new_path": "docs/en/contribution/release-java-agent.md"
    },
    {
      "type": "modify",
      "old_id": "7848138489a5d30a6e2e3f1ca5799adc6ec60f5c",
      "old_mode": 33261,
      "old_path": "tools/releasing/release.sh",
      "new_id": "210bd56a12ba347d628d2be8151f9fa930be5553",
      "new_mode": 33261,
      "new_path": "tools/releasing/release.sh"
    }
  ]
}
