From c01501db88cc1fb691d21159c4c9d2f0617ea7ab Mon Sep 17 00:00:00 2001 From: Shiyuan Zheng Date: Wed, 11 Feb 2026 22:40:48 -0800 Subject: [PATCH] fix: filter editable packages and prune dangling dependency references Monorepo first-party packages with `source.editable` entries were not filtered by `_ignored_package`, causing downstream failures when trying to resolve wheels/sdists that don't exist. Also prune dependency references that point to removed (editable/virtual) packages to prevent resolution errors. Fixes #791 --- uv/private/extension.bzl | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/uv/private/extension.bzl b/uv/private/extension.bzl index 219a19a4..31c7c2d3 100644 --- a/uv/private/extension.bzl +++ b/uv/private/extension.bzl @@ -76,6 +76,10 @@ def _ignored_package(package): # These seem to be used by the package itself # - { source = { editable = "." } } # - { source = { virtual = "." } } + if "editable" in package["source"]: + return True + + # The root project itself uses a virtual source if "virtual" in package["source"] and package["source"]["virtual"] == ".": return True @@ -210,6 +214,22 @@ def _parse_locks(module_ctx, venv_specs): for d in group: d["name"] = normalize_name(d["name"]) + # After removing ignored packages (editable/virtual), prune + # dangling dependency references that point to removed packages. + remaining = {package["name"]: 1 for package in packages} + for package in packages: + if "dependencies" in package: + package["dependencies"] = [ + d for d in package["dependencies"] + if d["name"] in remaining + ] + if "optional-dependencies" in package: + for group_name in list(package["optional-dependencies"].keys()): + package["optional-dependencies"][group_name] = [ + d for d in package["optional-dependencies"][group_name] + if d["name"] in remaining + ] + problems = [] has_tools = "build" in req_whls and "setuptools" in req_whls for req, whls in req_whls.items():