)]}'
{
  "commit": "27e88af6c4a78cb983e8e043ce6ee60356029c4f",
  "tree": "23f239398e95cb2195e9cc525060106765a430e6",
  "parents": [
    "e766d2522e8c0e7e3cf58685b70adda9027daa16"
  ],
  "author": {
    "name": "Kristian Hartikainen",
    "email": "kristian@ekarobotics.com",
    "time": "Mon Sep 28 07:25:34 2026 +0000"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Mon Sep 28 07:25:34 2026 +0000"
  },
  "message": "fix(uv): Preserve `uv` wrapper runfiles in lock targets (#4182)\n\n(Done with help from an agent.)\n\nThis PR lets `uv_toolchain` accept executable wrappers with multiple\noutputs and preserves their runfiles in lock actions and `.run` targets.\nThis supports wrappers that obtain credentials before invoking `uv`.\n\nLock actions receive the executable target\u0027s `FilesToRunProvider`.\nRunnable targets merge its default runfiles, preserving runtime data,\nordinary symlinks, and root symlinks. The downloaded `uv` binary has\npublic visibility so wrappers can declare it as a runtime dependency.\n\nThe regression test covers a wrapper with multiple outputs, runtime\ndata, and both kinds of runfiles symlinks.\n\nCloses #4181.\n\n---------\n\nCo-authored-by: Richard Levasseur \u003crichardlev@gmail.com\u003e",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "1323770842dfa396b05aa616b4bf83f55a7a17b3",
      "new_mode": 33188,
      "new_path": "news/4181.fixed.md"
    },
    {
      "type": "modify",
      "old_id": "3d39788d9d242f12abb009d959ca83aae95e9ba6",
      "old_mode": 33188,
      "old_path": "python/uv/private/lock.bzl",
      "new_id": "93742a23766575f390d725faf6ca22f9a2e16c68",
      "new_mode": 33188,
      "new_path": "python/uv/private/lock.bzl"
    },
    {
      "type": "modify",
      "old_id": "79a6495bdc6b45e7db27dfccf4688c688fc789c1",
      "old_mode": 33188,
      "old_path": "python/uv/private/uv_repository.bzl",
      "new_id": "839e582a0a4be213e558a7005ed00b678048a731",
      "new_mode": 33188,
      "new_path": "python/uv/private/uv_repository.bzl"
    },
    {
      "type": "modify",
      "old_id": "bd82e7452f1c56743700924f8f896c9c247629dd",
      "old_mode": 33188,
      "old_path": "python/uv/private/uv_toolchain.bzl",
      "new_id": "0e5a5dc5a1360049506eda707720039ebbc2d301",
      "new_mode": 33188,
      "new_path": "python/uv/private/uv_toolchain.bzl"
    },
    {
      "type": "modify",
      "old_id": "3e15ef2053e180577bb7561d6bd121533b87d9a9",
      "old_mode": 33188,
      "old_path": "tests/uv/lock/lock_tests.bzl",
      "new_id": "f14d784ebff22b403bc81c6bb56e64fb61abf769",
      "new_mode": 33188,
      "new_path": "tests/uv/lock/lock_tests.bzl"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9cfc5c31015aa9d6a4c471b0856eb51ce36cdda8",
      "new_mode": 33188,
      "new_path": "tests/uv/lock/testdata/toolchain_payload.txt"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "ae0ebda4f28c8bb41dbbc26c44cfdae31dc36447",
      "new_mode": 33188,
      "new_path": "tests/uv/lock/toolchain_runfiles_test.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "4e38f3fdbbb05ba600fc8e5014e9e5f9babe7989",
      "new_mode": 33188,
      "new_path": "tests/uv/lock/uv_with_runfiles.py"
    }
  ]
}
