)]}'
{
  "commit": "48d3a9aa5f300c6e730fe7b9f70cce89b68a0c8d",
  "tree": "c41824b6f742fbb979b795fc010123ea2e4b6503",
  "parents": [
    "fb5ad02bacb7b33e95e74e5b3ce60fdc69218bc2"
  ],
  "author": {
    "name": "Richard Levasseur",
    "email": "richardlev@gmail.com",
    "time": "Wed Nov 04 01:48:30 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Nov 04 01:48:30 2026 +0000"
  },
  "message": "refactor(toolchains): generalize exe_zip_maker into shrubbery toolchain (#4402)\n\nSeparate per-tool Rust binaries and toolchains duplicate the Rust\nstandard library across release artifacts and require distinct toolchain\ntypes and flags for every converted build tool.\n\nReplace the standalone `exe_zip_maker` binary and toolchain with the\nunified `shrubbery` (\"Shell replacements for Bazel build tools in Rust\")\nsubcommand binary and `shrubbery_toolchain`\n(`--//python/private/toolchains:need_shrubbery`), and route both\n`py_zipapp` and `py_binary` self-executable zip creation through\n`get_shrubbery_tool`.\n\nWork towards #4250",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "219a1e5b7bf240d1c04a5b311df2b7f4f761190a",
      "old_mode": 33188,
      "old_path": ".bazelci/presubmit.yml",
      "new_id": "c3ddb1ba9cc357a6de80ba2289592e58c7fd20f7",
      "new_mode": 33188,
      "new_path": ".bazelci/presubmit.yml"
    },
    {
      "type": "modify",
      "old_id": "d0c8d405e4f115481d3ef8b9ea1c57996743ebfa",
      "old_mode": 33188,
      "old_path": ".bazelrc.deleted_packages",
      "new_id": "4b8b5bfb47f198259412162903b93324dd3c25d7",
      "new_mode": 33188,
      "new_path": ".bazelrc.deleted_packages"
    },
    {
      "type": "modify",
      "old_id": "d6bf7252ee8ff1a69928807bc3db541cedadad33",
      "old_mode": 33188,
      "old_path": "crates/BUILD.bazel",
      "new_id": "2c4fb2b869ec2199c782c97158eea80083c079c2",
      "new_mode": 33188,
      "new_path": "crates/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "94c4783aa9a9d430d97ba31bab5ffa974dca630d",
      "old_mode": 33188,
      "old_path": "crates/exe_zip_maker/BUILD.bazel",
      "new_id": "bb7e7419ed64f178c883132e56552a3a9522b51f",
      "new_mode": 33188,
      "new_path": "crates/exe_zip_maker/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "a7b467eaef055ea00816260155da19eaad8ffe1a",
      "old_mode": 33188,
      "old_path": "crates/exe_zip_maker/src/lib.rs",
      "new_id": "9afa6d3078bb7757b7c3a1abeaf094a48a6f9e75",
      "new_mode": 33188,
      "new_path": "crates/exe_zip_maker/src/lib.rs"
    },
    {
      "type": "delete",
      "old_id": "d66fdb28e7ed1166197692da62314873fbc26e1e",
      "old_mode": 33188,
      "old_path": "crates/exe_zip_maker/src/main.rs",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "338dff3fac8f1bd16b2a3a2dd682a979095c7d14",
      "new_mode": 33188,
      "new_path": "crates/shrubbery/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "7b06fdad3901f4cb94d6f603b153198ba1194734",
      "new_mode": 33188,
      "new_path": "crates/shrubbery/src/lib.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "425eb4c6c670e586ce9b130ee3d8fd6af091ca21",
      "new_mode": 33188,
      "new_path": "crates/shrubbery/src/main.rs"
    },
    {
      "type": "modify",
      "old_id": "54d26f4b8359c4b83b3718bed02c6e5b00cfc7ff",
      "old_mode": 33188,
      "old_path": "dev/release_artifacts/BUILD.bazel",
      "new_id": "1c3674eaa56700a4b045245f08f6aacd3251f5ab",
      "new_mode": 33188,
      "new_path": "dev/release_artifacts/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "b91541df5b64dd2e55681af77c57e35b83289bcf",
      "old_mode": 33188,
      "old_path": "dev/release_artifacts/release_files.bzl",
      "new_id": "d4010b62e65039a0ed899e6002181e18b7ca9310",
      "new_mode": 33188,
      "new_path": "dev/release_artifacts/release_files.bzl"
    },
    {
      "type": "modify",
      "old_id": "bce09cf97a3a4e9acbfdf4111c657394044fa6f5",
      "old_mode": 33261,
      "old_path": "dev/release_artifacts/verify.sh",
      "new_id": "1033a58fd3163199483bc28942d1b817d29f9225",
      "new_mode": 33261,
      "new_path": "dev/release_artifacts/verify.sh"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391",
      "new_mode": 33188,
      "new_path": "examples/multi_python_versions/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "65d3537f543737c487def0e6d98fefb25892a445",
      "old_mode": 33188,
      "old_path": "python/private/BUILD.bazel",
      "new_id": "3fd205f5bcd329607437b7a72750143f66aef051",
      "new_mode": 33188,
      "new_path": "python/private/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "28f33edf90d987f91e5c3e3163c2786958381b56",
      "old_mode": 33188,
      "old_path": "python/private/common.bzl",
      "new_id": "cbea882d8a9f267e7403c0bb2f372d47f83ebb05",
      "new_mode": 33188,
      "new_path": "python/private/common.bzl"
    },
    {
      "type": "modify",
      "old_id": "3498c888f9f81ee4133d006d8c86d70d3a0dd3c2",
      "old_mode": 33188,
      "old_path": "python/private/py_executable.bzl",
      "new_id": "e57562b43b0a6fd05ef81c934f15a3f8c2daae64",
      "new_mode": 33188,
      "new_path": "python/private/py_executable.bzl"
    },
    {
      "type": "modify",
      "old_id": "a4e51248f1b965ef521f487991e450390f8eff89",
      "old_mode": 33188,
      "old_path": "python/private/toolchain_types.bzl",
      "new_id": "08c7bcd2defcd64f4ff820351be74a4347555d72",
      "new_mode": 33188,
      "new_path": "python/private/toolchain_types.bzl"
    },
    {
      "type": "modify",
      "old_id": "a3066bf954b86e899c677fb6a23ff189c952a615",
      "old_mode": 33188,
      "old_path": "python/private/toolchain_types/BUILD.bazel",
      "new_id": "e93043e7e7d2d11a44ffce6aadd281635acdc09c",
      "new_mode": 33188,
      "new_path": "python/private/toolchain_types/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "7ca7aaf8992b7d8a596828ba87620ecdff8f3102",
      "old_mode": 33188,
      "old_path": "python/private/toolchains/BUILD.bazel",
      "new_id": "a6dbabe0d3612cf57cb6308b94674279720cb1e2",
      "new_mode": 33188,
      "new_path": "python/private/toolchains/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "bbb52ec7a399f84f99f6e023182e50bf098a08e6",
      "old_mode": 33188,
      "old_path": "python/private/toolchains/from_source/BUILD.bazel",
      "new_id": "6e90e2888aa118d8de5674d1e9a4ef537c7413ba",
      "new_mode": 33188,
      "new_path": "python/private/toolchains/from_source/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "af2fac9d5e75d0ff06ad4cc3814bb52e0d023212",
      "old_mode": 33188,
      "old_path": "python/private/toolchains/repo.bzl",
      "new_id": "2ac0d152cd28cb4e21fc419d68f15bd01558af2a",
      "new_mode": 33188,
      "new_path": "python/private/toolchains/repo.bzl"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "757d44f8387c59919d1fe701e77f397742e7d927",
      "new_mode": 33188,
      "new_path": "python/private/toolchains/shrubbery_toolchain.bzl"
    },
    {
      "type": "modify",
      "old_id": "6da278a504be62c3c35f74c2664619f77eecdb7a",
      "old_mode": 33188,
      "old_path": "python/private/zipapp/BUILD.bazel",
      "new_id": "e603ffb6deb6a4d848b5dc279ae8d8763ae93e7d",
      "new_mode": 33188,
      "new_path": "python/private/zipapp/BUILD.bazel"
    },
    {
      "type": "delete",
      "old_id": "fb8efe9b90740be47b64fc1e8a8613ba34d3340b",
      "old_mode": 33188,
      "old_path": "python/private/zipapp/py_exe_zip_maker_toolchain.bzl",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "ebf083c06940b3c62cb2ba0ed9404022f9ce6a89",
      "old_mode": 33188,
      "old_path": "python/private/zipapp/py_zipapp_rule.bzl",
      "new_id": "06ed25a31b0932bcacf87fc6c88b753a9d8a20f6",
      "new_mode": 33188,
      "new_path": "python/private/zipapp/py_zipapp_rule.bzl"
    },
    {
      "type": "modify",
      "old_id": "dcd6f94f491e8a120c7e517d9c277e2eec7bc70e",
      "old_mode": 33188,
      "old_path": "tests/exe_zip_maker/exe_zip_maker_test.rs",
      "new_id": "d521a11ea23fb20d6174be083549300f8055bedc",
      "new_mode": 33188,
      "new_path": "tests/exe_zip_maker/exe_zip_maker_test.rs"
    },
    {
      "type": "delete",
      "old_id": "57f2b55b6f25db08d2f5e7d371f648b960711f0b",
      "old_mode": 33188,
      "old_path": "tests/exe_zip_maker_toolchain/BUILD.bazel",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "modify",
      "old_id": "79a8baceb44568630861f4c7475b27f13a6a57bd",
      "old_mode": 33188,
      "old_path": "tests/integration/BUILD.bazel",
      "new_id": "950de143683e6bdcf5eb613ac5a4079193104e4a",
      "new_mode": 33188,
      "new_path": "tests/integration/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "28f31db5c7d23fb91d646702dd8f52829199e604",
      "old_mode": 33188,
      "old_path": "tests/integration/prebuilt_toolchain_test.py",
      "new_id": "453ae5b0bcc67c6ab6950d1f7ffc76a05d93d2c6",
      "new_mode": 33188,
      "new_path": "tests/integration/prebuilt_toolchain_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "de800e5632b497a18fd9ad50324c39d8e4d752f5",
      "new_mode": 33188,
      "new_path": "tests/shrubbery/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e10de69edfa1c42de7184de042e8f14930749be7",
      "new_mode": 33188,
      "new_path": "tests/shrubbery/shrubbery_test.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9da7c31f4715b00216ce3dbc6c9e2f91110d8993",
      "new_mode": 33188,
      "new_path": "tests/shrubbery_toolchain/BUILD.bazel"
    },
    {
      "type": "rename",
      "old_id": "11b15b1a4584b08fa423a57964bdbf018b0da0d5",
      "old_mode": 33188,
      "old_path": "tests/exe_zip_maker_toolchain/main.py",
      "new_id": "11b15b1a4584b08fa423a57964bdbf018b0da0d5",
      "new_mode": 33188,
      "new_path": "tests/shrubbery_toolchain/main.py",
      "score": 100
    },
    {
      "type": "rename",
      "old_id": "1e7fd193e3e20d2a752a0f84bd0e1389f66a5683",
      "old_mode": 33188,
      "old_path": "tests/exe_zip_maker_toolchain/exe_zip_maker_toolchain_tests.bzl",
      "new_id": "6b336cefc4bc9191752fec90c0c9977cb7a876a3",
      "new_mode": 33188,
      "new_path": "tests/shrubbery_toolchain/shrubbery_toolchain_tests.bzl",
      "score": 64
    },
    {
      "type": "modify",
      "old_id": "95637c06566f2581e1997f6d6406b0468ddc8dc0",
      "old_mode": 33188,
      "old_path": "tests/workflows/release_artifacts_test.py",
      "new_id": "49a04007a5818a912893062863551f67cda23594",
      "new_mode": 33188,
      "new_path": "tests/workflows/release_artifacts_test.py"
    }
  ]
}
