chore: prepare 2.1 release (#3829)

Update changelog and version markers

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 05daf8c..5b9ef27 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -47,19 +47,19 @@
 END_UNRELEASED_TEMPLATE
 -->
 
-{#v0-0-0}
-## Unreleased
+{#v2-1-0}
+## [2.1.0] - 2026-06-17
 
-[0.0.0]: https://github.com/bazel-contrib/rules_python/releases/tag/0.0.0
+[2.1.0]: https://github.com/bazel-contrib/rules_python/releases/tag/2.1.0
 
-{#v0-0-0-removed}
+{#v2-1-0-removed}
 ### Removed
 * (build_data) Removed CONFIG_MODE from build data
   ([#3793](https://github.com/bazel-contrib/rules_python/issues/3793)).
 * (coverage) Support for python 3.8 has been dropped from the bundled
   `coverage.py` wheel set, since coverage.py 7.6.2 dropped it.
 
-{#v0-0-0-changed}
+{#v2-1-0-changed}
 ### Changed
 * (bzlmod) How default runtimes are registered has changed to use a manifest
   of SHAs and URLs. `TOOL_VERSIONS` in `python/versions.bzl` is now empty under
@@ -75,7 +75,7 @@
   platform, a warning is now printed instead of silently producing an empty
   coverage report.
 
-{#v0-0-0-fixed}
+{#v2-1-0-fixed}
 ### Fixed
 * (gazelle) `py_library` and `py_test` targets with missing source files can now be
   removed by Gazelle ([#3375](https://github.com/bazel-contrib/rules_python/issues/3375)). 
@@ -117,7 +117,7 @@
 * (coverage) handle nested coverage collection
   ([#3823](https://github.com/bazel-contrib/rules_python/pull/3823))
 
-{#v0-0-0-added}
+{#v2-1-0-added}
 ### Added
 * (toolchain) Added {obj}`PyRuntimeInfo.interpreter_files_to_run` so action
   consumers can execute an in-build runtime interpreter with its runfiles.
@@ -2475,4 +2475,4 @@
 * (pip) Create all_data_requirements alias
 * Expose Python C headers through the toolchain.
 
-[0.24.0]: https://github.com/bazel-contrib/rules_python/releases/tag/0.24.0
+[0.24.0]: https://github.com/bazel-contrib/rules_python/releases/tag/0.24.0
\ No newline at end of file
diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md
index d7bc296..cd3cbc9 100644
--- a/docs/api/rules_python/python/config_settings/index.md
+++ b/docs/api/rules_python/python/config_settings/index.md
@@ -375,7 +375,7 @@
 
 ## Removed Flags
 
-:::{versionremoved} VERSION_NEXT_FEATURE
+:::{versionremoved} 2.1.0
 The following flags were removed:
 
 * `pip_whl`
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index 3579241..6c3444c 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -151,7 +151,7 @@
 
 ## Removed Environment Variables
 
-:::{versionremoved} VERSION_NEXT_FEATURE
+:::{versionremoved} 2.1.0
 The following environment variables were removed:
 
 * `RULES_PYTHON_ENABLE_PYSTAR`: Used to enable the Starlark implementation of
diff --git a/docs/toolchains.md b/docs/toolchains.md
index 80884ba..98534ae 100644
--- a/docs/toolchains.md
+++ b/docs/toolchains.md
@@ -373,7 +373,7 @@
   that match supported platforms.
 - Only runtimes matching known platforms in `rules_python` will be registered.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 Added support for registering runtimes from a manifest using
 `add_runtime_manifest_files`, `add_runtime_manifest_urls`, and
 `runtime_manifest_sha` in `python.override`.
diff --git a/gazelle/docs/directives.md b/gazelle/docs/directives.md
index dfa4393..ce8c03b 100644
--- a/gazelle/docs/directives.md
+++ b/gazelle/docs/directives.md
@@ -681,7 +681,7 @@
 {gh-pr}`3014`
 :::
 
-:::{versionchanged} VERSION_NEXT_FEATURE
+:::{versionchanged} 2.1.0
 The default was changed from `false` to `true`. {gh-pr}`3753`
 :::
 
@@ -725,7 +725,7 @@
 {gh-pr}`3356`
 :::
 
-:::{versionchanged} VERSION_NEXT_FEATURE
+:::{versionchanged} 2.1.0
 The default was changed from `false` to `true`. {gh-pr}`3753`
 :::
 
diff --git a/python/private/py_executable_info.bzl b/python/private/py_executable_info.bzl
index 9e9baea..7693fa9 100644
--- a/python/private/py_executable_info.bzl
+++ b/python/private/py_executable_info.bzl
@@ -88,7 +88,7 @@
 to create relative symlinks. These may overlap with paths in runfiles; it's
 up to the consumer to determine how to handle such overlaps.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 :::
 """,
         "venv_interpreter_runfiles": """
diff --git a/python/private/py_runtime_info.bzl b/python/private/py_runtime_info.bzl
index 64fef39..daf01e6 100644
--- a/python/private/py_runtime_info.bzl
+++ b/python/private/py_runtime_info.bzl
@@ -261,7 +261,7 @@
 interpreter together with its runfiles. This is `None` for platform runtimes
 using `interpreter_path` and for file-only interpreter targets.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 :::
 """,
         "interpreter_path": """
diff --git a/python/private/python.bzl b/python/private/python.bzl
index ac8d111..23bae5d 100644
--- a/python/private/python.bzl
+++ b/python/private/python.bzl
@@ -1231,7 +1231,7 @@
 [Manifest file format documentation](https://rules-python.readthedocs.io/en/latest/toolchains.html#manifest-file-format)
 :::
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 :::
 """,
         ),
@@ -1250,7 +1250,7 @@
 [Manifest file format documentation](https://rules-python.readthedocs.io/en/latest/toolchains.html#manifest-file-format)
 :::
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 :::
 """,
         ),
@@ -1274,7 +1274,7 @@
 registered by the extension, including any that already have settings
 from `python.single_version_platform_override`.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 :::
 """,
         ),
@@ -1328,7 +1328,7 @@
             doc = """
 SHA256 hash for the add_runtime_manifest_urls.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 :::
 """,
         ),
diff --git a/python/uv/private/lock.bzl b/python/uv/private/lock.bzl
index 23f2eed..7b2aa36 100644
--- a/python/uv/private/lock.bzl
+++ b/python/uv/private/lock.bzl
@@ -306,7 +306,7 @@
 `[tool.uv]` settings (e.g. `no-build-isolation`,
 `exclude-dependencies`) from that `pyproject.toml`.
 
-:::{versionadded} VERSION_NEXT_FEATURE
+:::{versionadded} 2.1.0
 :::
 """,
         ),
@@ -529,7 +529,7 @@
             `exclude-dependencies` from that `pyproject.toml`. If no
             `pyproject.toml` is in `srcs` and no `project` is given, the
             Bazel package directory is used as fallback.
-            {versionadded}VERSION_NEXT_FEATURE
+            {versionadded} 2.1.0
         python_version: {type}`str | None` the python_version to transition to
             when locking the requirements. Defaults to the default python version
             configured by the {obj}`python` module extension.