)]}'
{
  "commit": "d0d6e3288fc1e6710669c90b54dfe38addafc415",
  "tree": "eb746b57f014ff2b3a2e7cdadb10bc23a4b51284",
  "parents": [
    "498fdca04a7cf88a8901236ce56c0e7089bad502"
  ],
  "author": {
    "name": "Ignas Anikevicius",
    "email": "240938+aignas@users.noreply.github.com",
    "time": "Sat Nov 07 05:58:37 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sat Nov 07 05:58:37 2026 +0000"
  },
  "message": "feat(pypi): support uv.lock in WORKSPACE pip_parse (#4416)\n\nfeat(pypi): support uv.lock in WORKSPACE pip_parse\n\nBefore this change `uv.lock` files could be generated with the `lock`\nrule\nunder `WORKSPACE`, but only `pip.parse` under bzlmod could consume them.\n\n`parse_requirements` already supports `uv.lock`, so this adds the\n`uv_lock`\nattribute to `pip_repository` (and thus `pip_parse`) and passes it\ntogether\nwith the TOML decoder to `parse_requirements`. The host platform now\ngets the\nwhl ABI and platform tags from the same default platforms that are used\nby\nbzlmod, which are moved out of `extension.bzl` into\n`default_platforms.bzl` so\nthat they can be loaded without bzlmod.\n\nThe generated `requirements.bzl` encodes the `urls`, `integrity` and\n`filename` of the distributions in a new `_package_srcs` dict that\n`install_deps` passes to `whl_library`, so that they are downloaded with\nthe\nBazel downloader. Because `requirements.bzl` may be vendored and used on\nany\nplatform, this is only done for distributions that are the same on all\nplatforms. For the other packages the requirement line includes the\nhashes of\nall of the locked distributions, so that `pip` selects the one for the\nhost\nplatform from the locked set.\n\n* Also switches `examples/pip_parse_vendored` to `uv.lock`.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "94215d15e07cde98967e75545db96bf8870c9d6f",
      "old_mode": 33188,
      "old_path": "docs/pypi/lock.md",
      "new_id": "c40e21f45b38865113965df0e8f51e9c44494f64",
      "new_mode": 33188,
      "new_path": "docs/pypi/lock.md"
    },
    {
      "type": "modify",
      "old_id": "b6e94b8a9a192fe2751863686b71685302300c45",
      "old_mode": 33188,
      "old_path": "examples/pip_parse_vendored/BUILD.bazel",
      "new_id": "63775d419146dddd7e3b4aa9cd9c722f064d8561",
      "new_mode": 33188,
      "new_path": "examples/pip_parse_vendored/BUILD.bazel"
    },
    {
      "type": "modify",
      "old_id": "695df9c0715a55d3d4955a444953a4f7d478f482",
      "old_mode": 33188,
      "old_path": "examples/pip_parse_vendored/README.md",
      "new_id": "e7ab4c87709812d293d10a1dc52af6cc932ec0eb",
      "new_mode": 33188,
      "new_path": "examples/pip_parse_vendored/README.md"
    },
    {
      "type": "modify",
      "old_id": "d65d5d610f0b7db5c75c144d014a9e8c42950d41",
      "old_mode": 33188,
      "old_path": "examples/pip_parse_vendored/WORKSPACE",
      "new_id": "559c88a6c9fca1bd3da63e151cbe3ee1056905ea",
      "new_mode": 33188,
      "new_path": "examples/pip_parse_vendored/WORKSPACE"
    },
    {
      "type": "modify",
      "old_id": "7696c00fdfc6c4055799440444558fa8751a21c2",
      "old_mode": 33188,
      "old_path": "examples/pip_parse_vendored/pyproject.toml",
      "new_id": "e2e84db57e09fe4d4081c6a99314d780736cb125",
      "new_mode": 33188,
      "new_path": "examples/pip_parse_vendored/pyproject.toml"
    },
    {
      "type": "modify",
      "old_id": "f870210024f9c4a793862b92787dd8a9cc896f1b",
      "old_mode": 33188,
      "old_path": "examples/pip_parse_vendored/requirements.bzl",
      "new_id": "82af35372dc182d437f3eea5a24d4dc02fa3e0b8",
      "new_mode": 33188,
      "new_path": "examples/pip_parse_vendored/requirements.bzl"
    },
    {
      "type": "delete",
      "old_id": "e4d00447ca4e6a2180c1a4d59401506ea95df3f7",
      "old_mode": 33188,
      "old_path": "examples/pip_parse_vendored/requirements.txt",
      "new_id": "0000000000000000000000000000000000000000",
      "new_mode": 0,
      "new_path": "/dev/null"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "68041308aa2d0f0327fb1bea9c8896eb2c28fd18",
      "new_mode": 33188,
      "new_path": "examples/pip_parse_vendored/uv.lock"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "70cd1e285e4ab48b0e32a42ffb3efca6f58be61d",
      "new_mode": 33188,
      "new_path": "news/workspace-uv-lock.added.md"
    },
    {
      "type": "modify",
      "old_id": "1cf0cad986305f24b133d0c92afd8552f2342542",
      "old_mode": 33188,
      "old_path": "python/private/pypi/BUILD.bazel",
      "new_id": "f94d24594f5596958f7b5880e64968557b8a167d",
      "new_mode": 33188,
      "new_path": "python/private/pypi/BUILD.bazel"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "578e7eb31eb68945197cef8b1b328d1f864fb900",
      "new_mode": 33188,
      "new_path": "python/private/pypi/default_platforms.bzl"
    },
    {
      "type": "modify",
      "old_id": "5f432221409c84fb5ec1c6c6785fe4ec1f776d63",
      "old_mode": 33188,
      "old_path": "python/private/pypi/extension.bzl",
      "new_id": "f7a1dadaf7e35dd115afda195033215f133e2bcd",
      "new_mode": 33188,
      "new_path": "python/private/pypi/extension.bzl"
    },
    {
      "type": "modify",
      "old_id": "436af73c8dc6e1d468c55a59a18d0b817310cd37",
      "old_mode": 33188,
      "old_path": "python/private/pypi/pip_repository.bzl",
      "new_id": "d02c62eae1d99685c7f493aa98324baa06b2fbbe",
      "new_mode": 33188,
      "new_path": "python/private/pypi/pip_repository.bzl"
    },
    {
      "type": "modify",
      "old_id": "f61a5271f6c256fa6f70b72f21a954888c71458c",
      "old_mode": 33188,
      "old_path": "python/private/pypi/requirements.bzl.tmpl.workspace",
      "new_id": "faf774e7ed8fe348f8848b3ceee8a1cf116dc483",
      "new_mode": 33188,
      "new_path": "python/private/pypi/requirements.bzl.tmpl.workspace"
    },
    {
      "type": "modify",
      "old_id": "11d4c31913b097936df999badad7f01826a19880",
      "old_mode": 33188,
      "old_path": "tests/pypi/extension/extension_tests.bzl",
      "new_id": "ee8e58dfe413cf65c24258c950f624730b53ec72",
      "new_mode": 33188,
      "new_path": "tests/pypi/extension/extension_tests.bzl"
    }
  ]
}
