From 0560f91eccb4cf1abe7e37f0a64284c309db6aff Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 3 Sep 2026 21:55:59 -0700 Subject: [PATCH 1/3] build(dev): move internal dev tools from //tools/private to //dev Consolidate developer tools under //dev. //tools/private is reserved for internal release management tooling. Move publish_deps.bzl, sync_downloader_configs.py, update_deps, gazelle, and debug to //dev. Update import paths, target visibility, generation markers, pre-commit hooks, and developer documentation. Work towards #4128 --- .pre-commit-config.yaml | 4 ++-- dev/BUILD.bazel | 8 ++++++++ .../private => dev}/debug/print_defined_toolchains.sh | 0 {tools/private => dev}/gazelle/BUILD.bazel | 0 {tools/private => dev}/publish_deps.bzl | 6 +++--- {tools/private => dev}/sync_downloader_configs.py | 2 +- {tools/private => dev}/update_deps/BUILD.bazel | 10 +++++----- {tools/private => dev}/update_deps/args.py | 3 +-- .../update_deps/update_coverage_deps.py | 8 ++++---- {tools/private => dev}/update_deps/update_file.py | 4 +--- {tools/private => dev}/update_deps/update_file_test.py | 2 +- {tools/private => dev}/update_deps/update_pip_deps.py | 8 ++++---- docs/devguide.md | 6 +++--- python/private/BUILD.bazel | 2 +- python/private/coverage_deps.bzl | 4 ++-- python/private/pypi/BUILD.bazel | 9 +++------ python/private/pypi/deps.bzl | 4 ++-- python/uv/private/BUILD.bazel | 3 +-- tools/private/BUILD.bazel | 8 -------- tools/publish/BUILD.bazel | 2 +- 20 files changed, 43 insertions(+), 50 deletions(-) rename {tools/private => dev}/debug/print_defined_toolchains.sh (100%) rename {tools/private => dev}/gazelle/BUILD.bazel (100%) rename {tools/private => dev}/publish_deps.bzl (91%) rename {tools/private => dev}/sync_downloader_configs.py (93%) rename {tools/private => dev}/update_deps/BUILD.bazel (93%) rename {tools/private => dev}/update_deps/args.py (94%) rename {tools/private => dev}/update_deps/update_coverage_deps.py (94%) rename {tools/private => dev}/update_deps/update_file.py (97%) rename {tools/private => dev}/update_deps/update_file_test.py (96%) rename {tools/private => dev}/update_deps/update_pip_deps.py (92%) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f4107880b2..c4165a5ea8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -62,12 +62,12 @@ repos: - id: sync-downloader-configs name: Sync downloader configs language: system - entry: ./tools/private/sync_downloader_configs.py + entry: ./dev/sync_downloader_configs.py files: downloader_config\.cfg$ pass_filenames: false - id: gazelle name: Run Gazelle language: system - entry: bazel run //tools/private/gazelle + entry: bazel run //dev/gazelle files: (\.bzl|\.bazel|BUILD|WORKSPACE(\.bzlmod)?)$ pass_filenames: false diff --git a/dev/BUILD.bazel b/dev/BUILD.bazel index 1aa5d60a1a..910bf39fce 100644 --- a/dev/BUILD.bazel +++ b/dev/BUILD.bazel @@ -1,8 +1,16 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("@rules_multirun//:defs.bzl", "multirun") load("//python/uv:lock.bzl", "lock") # buildifier: disable=bzl-visibility licenses(["notice"]) +bzl_library( + name = "publish_deps", + srcs = ["publish_deps.bzl"], + visibility = ["//:__subpackages__"], + deps = ["//python/uv:lock"], +) + # Run bazel run //dev:requirements.update lock( name = "requirements", diff --git a/tools/private/debug/print_defined_toolchains.sh b/dev/debug/print_defined_toolchains.sh similarity index 100% rename from tools/private/debug/print_defined_toolchains.sh rename to dev/debug/print_defined_toolchains.sh diff --git a/tools/private/gazelle/BUILD.bazel b/dev/gazelle/BUILD.bazel similarity index 100% rename from tools/private/gazelle/BUILD.bazel rename to dev/gazelle/BUILD.bazel diff --git a/tools/private/publish_deps.bzl b/dev/publish_deps.bzl similarity index 91% rename from tools/private/publish_deps.bzl rename to dev/publish_deps.bzl index a9b0dbc562..cd72733769 100644 --- a/tools/private/publish_deps.bzl +++ b/dev/publish_deps.bzl @@ -15,7 +15,7 @@ """A simple macro to lock the requirements for twine """ -load("//python/uv/private:lock.bzl", "lock") # buildifier: disable=bzl-visibility +load("//python/uv:lock.bzl", "lock") def publish_deps(*, name, args, outs, **kwargs): """Generate all of the requirements files for all platforms. @@ -27,9 +27,9 @@ def publish_deps(*, name, args, outs, **kwargs): for each requirement file to be generated. **kwargs: Extra args passed to the {rule}`lock` rule. """ - all_args = args + all_args = list(args or []) for out, platform in outs.items(): - args = [] + all_args + args = list(all_args) if platform: args.append("--python-platform=" + platform) else: diff --git a/tools/private/sync_downloader_configs.py b/dev/sync_downloader_configs.py similarity index 93% rename from tools/private/sync_downloader_configs.py rename to dev/sync_downloader_configs.py index 7e8527b989..e9551f0d8b 100755 --- a/tools/private/sync_downloader_configs.py +++ b/dev/sync_downloader_configs.py @@ -7,7 +7,7 @@ def main(): - repo_root = Path(__file__).resolve().parent.parent.parent + repo_root = Path(__file__).resolve().parent.parent canonical = repo_root / "downloader_config.cfg" subworkspaces = [ diff --git a/tools/private/update_deps/BUILD.bazel b/dev/update_deps/BUILD.bazel similarity index 93% rename from tools/private/update_deps/BUILD.bazel rename to dev/update_deps/BUILD.bazel index 5ebb8550c1..7c0fcb6abe 100644 --- a/tools/private/update_deps/BUILD.bazel +++ b/dev/update_deps/BUILD.bazel @@ -21,14 +21,14 @@ licenses(["notice"]) py_library( name = "args", srcs = ["args.py"], - imports = ["../../.."], + imports = ["../.."], deps = ["//python/runfiles"], ) py_library( name = "update_file", srcs = ["update_file.py"], - imports = ["../../.."], + imports = ["../.."], ) py_binary( @@ -40,7 +40,7 @@ py_binary( env = { "UPDATE_FILE": "$(rlocationpath //python/private:coverage_deps_filegroup)", }, - imports = ["../../.."], + imports = ["../.."], deps = [ ":args", ":update_file", @@ -58,7 +58,7 @@ py_binary( "DEPS_BZL": "$(rlocationpath //python/private/pypi:deps.bzl)", "REQUIREMENTS_TXT": "$(rlocationpath //python/private/pypi:requirements_txt)", }, - imports = ["../../.."], + imports = ["../.."], visibility = ["//:__subpackages__"], deps = [ ":args", @@ -69,7 +69,7 @@ py_binary( pytest_test( name = "update_file_test", srcs = ["update_file_test.py"], - imports = ["../../.."], + imports = ["../.."], target_compatible_with = SUPPORTS_BZLMOD, deps = [ ":update_file", diff --git a/tools/private/update_deps/args.py b/dev/update_deps/args.py similarity index 94% rename from tools/private/update_deps/args.py rename to dev/update_deps/args.py index 610b1abc72..5525c1653d 100644 --- a/tools/private/update_deps/args.py +++ b/dev/update_deps/args.py @@ -28,8 +28,7 @@ def path_from_runfiles(input: str) -> pathlib.Path: Returns: the pathlib.Path path to a file which is verified to exist. """ - rf = runfiles.Create() - assert rf is not None # type assert + rf = runfiles.CreateOrRaise() rlocation_path = rf.Rlocation(input) assert rlocation_path is not None # type assert path = pathlib.Path(rlocation_path) diff --git a/tools/private/update_deps/update_coverage_deps.py b/dev/update_deps/update_coverage_deps.py similarity index 94% rename from tools/private/update_deps/update_coverage_deps.py rename to dev/update_deps/update_coverage_deps.py index 74ac657bad..fde2f0b54c 100755 --- a/tools/private/update_deps/update_coverage_deps.py +++ b/dev/update_deps/update_coverage_deps.py @@ -28,8 +28,8 @@ from typing import Any from urllib import request -from tools.private.update_deps.args import path_from_runfiles -from tools.private.update_deps.update_file import update_file +from dev.update_deps.args import path_from_runfiles +from dev.update_deps.update_file import update_file # This should be kept in sync with //python:versions.bzl _supported_platforms = { @@ -208,8 +208,8 @@ def main(): "", ] ), - start_marker="# START: maintained by 'bazel run //tools/private/update_deps:update_coverage_deps '", - end_marker="# END: maintained by 'bazel run //tools/private/update_deps:update_coverage_deps '", + start_marker="# START: maintained by 'bazel run //dev/update_deps:update_coverage_deps '", + end_marker="# END: maintained by 'bazel run //dev/update_deps:update_coverage_deps '", dry_run=args.dry_run, ) diff --git a/tools/private/update_deps/update_file.py b/dev/update_deps/update_file.py similarity index 97% rename from tools/private/update_deps/update_file.py rename to dev/update_deps/update_file.py index cbf4c32bd1..d1b25b24f9 100644 --- a/tools/private/update_deps/update_file.py +++ b/dev/update_deps/update_file.py @@ -101,9 +101,7 @@ def update_file( _writelines(path, out) return - relative = path.relative_to( - pathlib.Path(__file__).resolve().parent.parent.parent.parent - ) + relative = path.relative_to(pathlib.Path(__file__).resolve().parent.parent.parent) name = f"{relative}" diff = unified_diff(name, current, out) if diff: diff --git a/tools/private/update_deps/update_file_test.py b/dev/update_deps/update_file_test.py similarity index 96% rename from tools/private/update_deps/update_file_test.py rename to dev/update_deps/update_file_test.py index b1d6545ead..6f63350640 100644 --- a/tools/private/update_deps/update_file_test.py +++ b/dev/update_deps/update_file_test.py @@ -14,7 +14,7 @@ import pytest -from tools.private.update_deps.update_file import replace_snippet, unified_diff +from dev.update_deps.update_file import replace_snippet, unified_diff def test_replace_simple(): diff --git a/tools/private/update_deps/update_pip_deps.py b/dev/update_deps/update_pip_deps.py similarity index 92% rename from tools/private/update_deps/update_pip_deps.py rename to dev/update_deps/update_pip_deps.py index 9951a7abbb..020064aadf 100755 --- a/tools/private/update_deps/update_pip_deps.py +++ b/dev/update_deps/update_pip_deps.py @@ -29,8 +29,8 @@ from pip._internal.cli.main import main as pip_main # pyrefly: ignore[missing-import] -from tools.private.update_deps.args import path_from_runfiles -from tools.private.update_deps.update_file import update_file +from dev.update_deps.args import path_from_runfiles +from dev.update_deps.update_file import update_file @dataclass @@ -111,13 +111,13 @@ def main(): parser.add_argument( "--start", type=str, - default="# START: maintained by 'bazel run //tools/private/update_deps:update_pip_deps'", + default="# START: maintained by 'bazel run //dev/update_deps:update_pip_deps'", help="The text to match in a file when updating them.", ) parser.add_argument( "--end", type=str, - default="# END: maintained by 'bazel run //tools/private/update_deps:update_pip_deps'", + default="# END: maintained by 'bazel run //dev/update_deps:update_pip_deps'", help="The text to match in a file when updating them.", ) parser.add_argument( diff --git a/docs/devguide.md b/docs/devguide.md index 80ce6d61f2..96cf5cda9b 100644 --- a/docs/devguide.md +++ b/docs/devguide.md @@ -95,7 +95,7 @@ integration test. 1. Modify the `./python/private/pypi/requirements.txt` file and run: ``` - bazel run //tools/private/update_deps:update_pip_deps + bazel run //dev/update_deps:update_pip_deps ``` 1. Run the following target to update `twine` dependencies: ``` @@ -103,9 +103,9 @@ integration test. ``` 1. Bump the coverage dependencies using the script using: ``` - bazel run //tools/private/update_deps:update_coverage_deps + bazel run //dev/update_deps:update_coverage_deps # for example: - # bazel run //tools/private/update_deps:update_coverage_deps 7.10.7 + # bazel run //dev/update_deps:update_coverage_deps 7.10.7 ``` ## Updating tool dependencies diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 72bf7138f8..9e4313d1f8 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -54,7 +54,7 @@ filegroup( filegroup( name = "coverage_deps_filegroup", srcs = ["coverage_deps.bzl"], - visibility = ["//tools/private/update_deps:__pkg__"], + visibility = ["//:__subpackages__"], ) # Filegroup of bzl files that can be used by downstream rules for documentation generation diff --git a/python/private/coverage_deps.bzl b/python/private/coverage_deps.bzl index 001146c3d4..8ee5935307 100644 --- a/python/private/coverage_deps.bzl +++ b/python/private/coverage_deps.bzl @@ -19,7 +19,7 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") load("//python/private:version_label.bzl", "version_label") -# START: maintained by 'bazel run //tools/private/update_deps:update_coverage_deps ' +# START: maintained by 'bazel run //dev/update_deps:update_coverage_deps ' _default = ( "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", "f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", @@ -166,7 +166,7 @@ _coverage_deps = { ), }, } -# END: maintained by 'bazel run //tools/private/update_deps:update_coverage_deps ' +# END: maintained by 'bazel run //dev/update_deps:update_coverage_deps ' _coverage_patch = Label("//python/private:coverage.patch") diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 35286c5deb..eb87c63717 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -67,7 +67,7 @@ alias( exports_files( srcs = ["deps.bzl"], - visibility = ["//tools/private/update_deps:__pkg__"], + visibility = ["//:__subpackages__"], ) filegroup( @@ -86,16 +86,13 @@ filegroup( filegroup( name = "bzl", srcs = glob(["**/*.bzl"]), - visibility = [ - "//python/private:__pkg__", - "//tools/private:__pkg__", - ], + visibility = ["//:__subpackages__"], ) filegroup( name = "requirements_txt", srcs = ["requirements.txt"], - visibility = ["//tools/private/update_deps:__pkg__"], + visibility = ["//:__subpackages__"], ) bzl_library( diff --git a/python/private/pypi/deps.bzl b/python/private/pypi/deps.bzl index 5d0507cb98..264446bece 100644 --- a/python/private/pypi/deps.bzl +++ b/python/private/pypi/deps.bzl @@ -18,7 +18,7 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") _RULE_DEPS = [ - # START: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' + # START: maintained by 'bazel run //dev/update_deps:update_pip_deps' ( "pypi__build", "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", @@ -94,7 +94,7 @@ _RULE_DEPS = [ "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", "071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", ), - # END: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' + # END: maintained by 'bazel run //dev/update_deps:update_pip_deps' ] _GENERIC_WHEEL = """\ diff --git a/python/uv/private/BUILD.bazel b/python/uv/private/BUILD.bazel index cb73482ad8..e1d520408e 100644 --- a/python/uv/private/BUILD.bazel +++ b/python/uv/private/BUILD.bazel @@ -63,8 +63,7 @@ bzl_library( name = "lock", srcs = ["lock.bzl"], visibility = [ - "//python/uv:__subpackages__", - "//tools/private:__subpackages__", + "//:__subpackages__", ], deps = [ ":toolchain_types", diff --git a/tools/private/BUILD.bazel b/tools/private/BUILD.bazel index b395b2c541..1d689656c2 100644 --- a/tools/private/BUILD.bazel +++ b/tools/private/BUILD.bazel @@ -1,5 +1,3 @@ -load("@bazel_skylib//:bzl_library.bzl", "bzl_library") - package( default_visibility = ["//:__subpackages__"], ) @@ -8,9 +6,3 @@ filegroup( name = "distribution", srcs = glob(["**"]), ) - -bzl_library( - name = "publish_deps", - srcs = ["publish_deps.bzl"], - deps = ["//python/uv/private:lock"], -) diff --git a/tools/publish/BUILD.bazel b/tools/publish/BUILD.bazel index 93b44b3766..91d6a858e3 100644 --- a/tools/publish/BUILD.bazel +++ b/tools/publish/BUILD.bazel @@ -1,5 +1,5 @@ +load("//dev:publish_deps.bzl", "publish_deps") load("//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary") -load("//tools/private:publish_deps.bzl", "publish_deps") py_console_script_binary( name = "twine", From 82da58a4fade2841b1259f2f95ba26cba200d7e9 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 3 Sep 2026 22:08:10 -0700 Subject: [PATCH 2/3] build(dev): include //dev in root distribution filegroup Downstream bazel-in-bazel integration tests use //:distribution to instantiate rules_python. Because //tools/publish loads //dev:publish_deps.bzl, //dev must be included in //:distribution so the dev package resolves in isolated workspaces. --- BUILD.bazel | 1 + dev/BUILD.bazel | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/BUILD.bazel b/BUILD.bazel index f978126da7..ab9f6d8d20 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -79,6 +79,7 @@ filegroup( "internal_dev_setup.bzl", "version.bzl", "//command_line_option:distribution", + "//dev:distribution", "//python:distribution", "//tools:distribution", ], diff --git a/dev/BUILD.bazel b/dev/BUILD.bazel index 910bf39fce..91c99005be 100644 --- a/dev/BUILD.bazel +++ b/dev/BUILD.bazel @@ -11,6 +11,12 @@ bzl_library( deps = ["//python/uv:lock"], ) +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//:__pkg__"], +) + # Run bazel run //dev:requirements.update lock( name = "requirements", From 5358ed75ab6d2f5c793bbb06922515f686e144bf Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 4 Sep 2026 00:25:31 -0700 Subject: [PATCH 3/3] build(dev): move publish_deps.bzl back to //tools/private Keep publish_deps.bzl under //tools/private. tools/publish/BUILD.bazel is part of //:distribution and loads publish_deps.bzl; keeping it under //tools/private avoids packaging internal //dev tools in distributions. --- BUILD.bazel | 1 - dev/BUILD.bazel | 14 -------------- tools/private/BUILD.bazel | 8 ++++++++ {dev => tools/private}/publish_deps.bzl | 0 tools/publish/BUILD.bazel | 2 +- 5 files changed, 9 insertions(+), 16 deletions(-) rename {dev => tools/private}/publish_deps.bzl (100%) diff --git a/BUILD.bazel b/BUILD.bazel index ab9f6d8d20..f978126da7 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -79,7 +79,6 @@ filegroup( "internal_dev_setup.bzl", "version.bzl", "//command_line_option:distribution", - "//dev:distribution", "//python:distribution", "//tools:distribution", ], diff --git a/dev/BUILD.bazel b/dev/BUILD.bazel index 91c99005be..1aa5d60a1a 100644 --- a/dev/BUILD.bazel +++ b/dev/BUILD.bazel @@ -1,22 +1,8 @@ -load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("@rules_multirun//:defs.bzl", "multirun") load("//python/uv:lock.bzl", "lock") # buildifier: disable=bzl-visibility licenses(["notice"]) -bzl_library( - name = "publish_deps", - srcs = ["publish_deps.bzl"], - visibility = ["//:__subpackages__"], - deps = ["//python/uv:lock"], -) - -filegroup( - name = "distribution", - srcs = glob(["**"]), - visibility = ["//:__pkg__"], -) - # Run bazel run //dev:requirements.update lock( name = "requirements", diff --git a/tools/private/BUILD.bazel b/tools/private/BUILD.bazel index 1d689656c2..b66eac3490 100644 --- a/tools/private/BUILD.bazel +++ b/tools/private/BUILD.bazel @@ -1,3 +1,5 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") + package( default_visibility = ["//:__subpackages__"], ) @@ -6,3 +8,9 @@ filegroup( name = "distribution", srcs = glob(["**"]), ) + +bzl_library( + name = "publish_deps", + srcs = ["publish_deps.bzl"], + deps = ["//python/uv:lock"], +) diff --git a/dev/publish_deps.bzl b/tools/private/publish_deps.bzl similarity index 100% rename from dev/publish_deps.bzl rename to tools/private/publish_deps.bzl diff --git a/tools/publish/BUILD.bazel b/tools/publish/BUILD.bazel index 91d6a858e3..93b44b3766 100644 --- a/tools/publish/BUILD.bazel +++ b/tools/publish/BUILD.bazel @@ -1,5 +1,5 @@ -load("//dev:publish_deps.bzl", "publish_deps") load("//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary") +load("//tools/private:publish_deps.bzl", "publish_deps") py_console_script_binary( name = "twine",