From 67260287fef0793e30aeb2241c7abc60da39beec Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 9 Oct 2025 13:01:26 -0700 Subject: [PATCH 1/2] fix(venv): group venv prefixes by path component, not raw path When files overlap between packages, and dist-info directories are present, it results in a prefix list like `foo foo-bar foo/bar`. When sorted as raw strings, hyphen sorts before slash, so the continuity of path prefixes is violated and they are grouped separately. An error then occurs because both `foo/` and `foo/bar` are created, but the latter is a sub-path of the former. To fix, change the sort key to a tuple of path components. This makes `foo foo-bar foo/bar` sort as `(foo,) (foo, bar), (foo-bar, )`, resulting in the correct order. Fixes https://github.com/bazel-contrib/rules_python/issues/3204 --- python/private/venv_runfiles.bzl | 4 +++- .../app_files_building/app_files_building_tests.bzl | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/python/private/venv_runfiles.bzl b/python/private/venv_runfiles.bzl index 291920b848..9fbe97a52e 100644 --- a/python/private/venv_runfiles.bzl +++ b/python/private/venv_runfiles.bzl @@ -138,7 +138,9 @@ def _group_venv_path_entries(entries): """ # Sort so order is top-down, ensuring grouping by short common prefix - entries = sorted(entries, key = lambda e: e.venv_path) + # Split it into path components so `foo foo-bar foo/bar` sorts as + # `foo foo/bar foo-bar` + entries = sorted(entries, key = lambda e: tuple(e.venv_path.split("/"))) groups = [] current_group = None diff --git a/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl b/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl index 0a0265eb8c..c5b0b07467 100644 --- a/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl +++ b/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl @@ -61,6 +61,7 @@ _tests.append(_test_conflict_merging) def _test_conflict_merging_impl(env, _): entries = [ _entry("a", "+pypi_a/site-packages/a", ["a.txt"]), + _entry("a-1.0.dist-info", "+pypi_a/site-packages/a-1.0.dist-info", ["METADATA"]), _entry("a/b", "+pypi_a_b/site-packages/a/b", ["b.txt"]), _entry("x", "_main/src/x", ["x.txt"]), _entry("x/p", "_main/src-dev/x/p", ["p.txt"]), @@ -74,6 +75,7 @@ def _test_conflict_merging_impl(env, _): expected_libs = { "a/a.txt": _file("../+pypi_a/site-packages/a/a.txt"), "a/b/b.txt": _file("../+pypi_a_b/site-packages/a/b/b.txt"), + "a-1.0.dist-info": "+pypi_a/site-packages/a-1.0.dist-info", "duplicate/d.py": _file("../+dupe_a/site-packages/duplicate/d.py"), "x/p/p.txt": _file("src-dev/x/p/p.txt"), "x/x.txt": _file("src/x/x.txt"), From 7bd918a35070b2790447df9eb0835b0c73a6223a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 9 Oct 2025 13:12:35 -0700 Subject: [PATCH 2/2] format --- .../app_files_building/app_files_building_tests.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl b/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl index c5b0b07467..68e17160e7 100644 --- a/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl +++ b/tests/venv_site_packages_libs/app_files_building/app_files_building_tests.bzl @@ -73,9 +73,9 @@ def _test_conflict_merging_impl(env, _): actual = build_link_map(_ctx(), entries) expected_libs = { + "a-1.0.dist-info": "+pypi_a/site-packages/a-1.0.dist-info", "a/a.txt": _file("../+pypi_a/site-packages/a/a.txt"), "a/b/b.txt": _file("../+pypi_a_b/site-packages/a/b/b.txt"), - "a-1.0.dist-info": "+pypi_a/site-packages/a-1.0.dist-info", "duplicate/d.py": _file("../+dupe_a/site-packages/duplicate/d.py"), "x/p/p.txt": _file("src-dev/x/p/p.txt"), "x/x.txt": _file("src/x/x.txt"),