)]}'
{
  "commit": "8c380e9b5d8a18582305c91f528dea7c1475e72d",
  "tree": "a333f47037765de22c35b8790126667e580712ee",
  "parents": [
    "1fa62e99d7c90a496840d0f51bca3613aff26786"
  ],
  "author": {
    "name": "Steven Dee",
    "email": "262429907+stevendee-recon@users.noreply.github.com",
    "time": "Tue Oct 13 04:33:22 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Oct 13 04:33:22 2026 +0000"
  },
  "message": "fix(toolchains): exclude pycache symlinks from runtime files (#4233)\n\nThe runtime\u0027s `lib/**` glob matches the `__pycache__` symlinks added in\n#3661, so they end up in runfiles.\n\nWith `RULES_PYTHON_PYCACHE_DIR\u003d/dev/null` they are symlinks to a\ncharacter device, and packaging a binary into a tar layer fails (#4198).\nThe glob now excludes `__pycache__` and everything under it.\n\nThe pyc cache is now keyed on the runtime archive\u0027s sha256 rather than a\nhash of the workspace root. The sources in an archive all share one\nmtime, so Python\u0027s mtime-and-size check can\u0027t tell a patch release\u0027s\nsources from the previous one\u0027s. The workspace hash didn\u0027t keep\nworkspaces apart anyway: the repository contents cache shares one\nfetched runtime, symlinks included, across workspaces.\n\nThe default root stops trying locations that are likely to be shared and\ninstead tries a more reliably user-owned fallback: if `XDG_CACHE_HOME`\nis unset, then on non-Windows, `$HOME/.cache` is used (per [XDG][0]). On\nWindows, `%LOCALAPPDATA%` is used. (NB. [`platformdirs`][1] would choose\n`rules_python\\Cache` rather than `rules_python_pycache`; the current\nchange opts for one directory name everywhere.)\n\nFixes #4198\n\n[0]: https://specifications.freedesktop.org/basedir/latest/#variables\n[1]: https://platformdirs.readthedocs.io/en/latest/\n\n---------\n\nCo-authored-by: Richard Levasseur \u003crichardlev@gmail.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3eb62221c03c87130b65e51554da0f643d59ff8e",
      "old_mode": 33188,
      "old_path": "docs/environment-variables.md",
      "new_id": "9efa48c6069af92e94adacfa397ec387e2e8448c",
      "new_mode": 33188,
      "new_path": "docs/environment-variables.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "542d03f6ee5c99869474baec42a51a7b18732e87",
      "new_mode": 33188,
      "new_path": "news/4198.changed.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "bed52870bf81615e39a20997a56f7f1b0b479ae7",
      "new_mode": 33188,
      "new_path": "news/4198.fixed.md"
    },
    {
      "type": "modify",
      "old_id": "3fd0928a018e80f1fbda717b04f55e7d18fd4695",
      "old_mode": 33188,
      "old_path": "python/private/python_repository.bzl",
      "new_id": "8517a3fa5da7dbeffed7d22382935fc9901bd151",
      "new_mode": 33188,
      "new_path": "python/private/python_repository.bzl"
    },
    {
      "type": "modify",
      "old_id": "336937ece043dd00ec1371d3cbb449df305ec258",
      "old_mode": 33188,
      "old_path": "tests/integration/custom_commands_test.py",
      "new_id": "c186d57d5d31a572f24b30ec6727b47ebc3ba37e",
      "new_mode": 33188,
      "new_path": "tests/integration/custom_commands_test.py"
    }
  ]
}
