This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v2-10-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v2-10-test by this push:
     new ce002fa7ba Fix reproducibility of prepared provider packages (fix flit 
frontend) (#43683) (#43687)
ce002fa7ba is described below

commit ce002fa7ba6bd9cb87324cc112de0bd690e05930
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Nov 5 15:26:48 2024 +0100

    Fix reproducibility of prepared provider packages (fix flit frontend) 
(#43683) (#43687)
    
    After some checks it turned out that reproducibility of produced
    packages depends not only on the build backend configured for the
    project but also on the build front-end used - because frontend is
    the one to modify meta-data in prepared packages - including the build
    tool used, it's version and metadata version supported by the front-end.
    
    That's why in order to maintain reproducibility for anyone who builds
    the packages, we have to pin not only the build backend in
    pyproject.toml (flit-core) but also build fronted used (flit).
    
    Since package preparation is done with breeze, we can do it by
    pinning flit (and just in case also flit-core) so that anyone who
    builds specific version of the package will use exactly the same flit
    as the person who built the original packages.
    
    This way we will avoid reproducibility problems experienced with 1.5.0
    release of FAB.
    
    (cherry picked from commit 18ea01cef2b92fe820ceaa33be7b44f9f576aad4)
---
 dev/README_RELEASE_PROVIDER_PACKAGES.md            |  1 -
 dev/breeze/README.md                               |  2 +-
 dev/breeze/doc/images/output_build-docs.svg        | 28 +++++++++++-----------
 dev/breeze/doc/images/output_build-docs.txt        |  2 +-
 dev/breeze/doc/images/output_prod-image.svg        |  2 +-
 dev/breeze/doc/images/output_prod-image.txt        |  2 +-
 dev/breeze/doc/images/output_prod-image_build.txt  |  2 +-
 dev/breeze/doc/images/output_setup.svg             |  2 +-
 dev/breeze/doc/images/output_setup.txt             |  2 +-
 .../doc/images/output_setup_autocomplete.svg       | 10 ++++----
 .../doc/images/output_setup_autocomplete.txt       |  2 +-
 dev/breeze/doc/images/output_setup_config.txt      |  2 +-
 dev/breeze/doc/images/output_start-airflow.txt     |  2 +-
 dev/breeze/pyproject.toml                          | 15 +++++++++++-
 .../commands/release_candidate_command.py          |  1 -
 .../commands/release_management_commands.py        |  4 ----
 .../src/airflow_breeze/commands/setup_commands.py  | 26 +++++++++++++++++++-
 .../templates/pyproject_TEMPLATE.toml.jinja2       |  3 +--
 .../src/airflow_breeze/utils/python_versions.py    |  8 +------
 .../src/airflow_breeze/utils/reproducible.py       |  3 ---
 dev/breeze/uv.lock                                 |  4 +++-
 21 files changed, 73 insertions(+), 50 deletions(-)

diff --git a/dev/README_RELEASE_PROVIDER_PACKAGES.md 
b/dev/README_RELEASE_PROVIDER_PACKAGES.md
index 749f89e106..25aa8062c7 100644
--- a/dev/README_RELEASE_PROVIDER_PACKAGES.md
+++ b/dev/README_RELEASE_PROVIDER_PACKAGES.md
@@ -335,7 +335,6 @@ export AIRFLOW_REPO_ROOT=$(pwd -P)
 rm -rf ${AIRFLOW_REPO_ROOT}/dist/*
 ```
 
-
 * Release candidate packages:
 
 ```shell script
diff --git a/dev/breeze/README.md b/dev/breeze/README.md
index 2c38aa7c1a..713bf7ce83 100644
--- a/dev/breeze/README.md
+++ b/dev/breeze/README.md
@@ -66,6 +66,6 @@ PLEASE DO NOT MODIFY THE HASH BELOW! IT IS AUTOMATICALLY 
UPDATED BY PRE-COMMIT.
 
 
---------------------------------------------------------------------------------------------------------
 
-Package config hash: 
f8e8729f4236f050d4412cbbc9d53fdd4e6ddad65ce5fafd3c5b6fcdacbea5431eea760b961534a63fd5733b072b38e8167b5b0c12ee48b31c3257306ef11940
+Package config hash: 
d1d07397099e14c5fc5f0b0e13a87ac8e112bf66755f77cee62b29151cd18c2f2d35932906db6b3885af652defddce696ef9b2df58e21bd3a7749bca82baf910
 
 
---------------------------------------------------------------------------------------------------------
diff --git a/dev/breeze/doc/images/output_build-docs.svg 
b/dev/breeze/doc/images/output_build-docs.svg
index e270c6b92e..6fa9017144 100644
--- a/dev/breeze/doc/images/output_build-docs.svg
+++ b/dev/breeze/doc/images/output_build-docs.svg
@@ -203,32 +203,32 @@
 </text><text class="breeze-build-docs-r1" x="12.2" y="361.6" 
textLength="195.2" 
clip-path="url(#breeze-build-docs-line-14)">Build&#160;documents.</text><text 
class="breeze-build-docs-r1" x="1464" y="361.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-14)">
 </text><text class="breeze-build-docs-r1" x="1464" y="386" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-15)">
 </text><text class="breeze-build-docs-r5" x="0" y="410.4" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-16)">╭─</text><text 
class="breeze-build-docs-r5" x="24.4" y="410.4" textLength="134.2" 
clip-path="url(#breeze-build-docs-line-16)">&#160;Doc&#160;flags&#160;</text><text
 class="breeze-build-docs-r5" x="158.6" y="410.4" textLength="1281" 
clip-path="url(#breeze-build-docs-line-16)">────────────────────────────────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-17)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="434.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-17)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="434.8" textLength="61" 
clip-path="url(#breeze-build-docs-line-17)">-docs</text><text 
class="breeze-build-docs-r4" x="97.6" y="434.8" textLength="61" 
clip-path="url(#breeze-build-docs-line-17)"> [...]
-</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-18)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="459.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-18)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="459.2" textLength="134.2" 
clip-path="url(#breeze-build-docs-line-18)">-spellcheck</text><text 
class="breeze-build-docs-r4" x="170.8" y="459.2" textLength="61" 
clip-path="url(#breeze-build-docs- [...]
-</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-19)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="483.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-19)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="483.6" textLength="73.2" 
clip-path="url(#breeze-build-docs-line-19)">-clean</text><text 
class="breeze-build-docs-r4" x="109.8" y="483.6" textLength="73.2" 
clip-path="url(#breeze-build-docs-line [...]
+</text><text class="breeze-build-docs-r5" x="0" y="434.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-17)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="434.8" textLength="134.2" 
clip-path="url(#breeze-build-docs-line-17)">--docs-only</text><text 
class="breeze-build-docs-r6" x="402.6" y="434.8" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-17)">-d</text><text 
class="breeze-build-docs-r1" x="451.4" y="434.8" textLength="305" 
clip-path="url(#breeze-build-do [...]
+</text><text class="breeze-build-docs-r5" x="0" y="459.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-18)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="459.2" textLength="207.4" 
clip-path="url(#breeze-build-docs-line-18)">--spellcheck-only</text><text 
class="breeze-build-docs-r6" x="402.6" y="459.2" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-18)">-s</text><text 
class="breeze-build-docs-r1" x="451.4" y="459.2" textLength="292.8" 
clip-path="url(#breeze- [...]
+</text><text class="breeze-build-docs-r5" x="0" y="483.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-19)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="483.6" textLength="158.6" 
clip-path="url(#breeze-build-docs-line-19)">--clean-build</text><text 
class="breeze-build-docs-r1" x="451.4" y="483.6" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-19)">Clean&#160;inventories&#160;of&#160;Inter-Sphinx&#160;documentation&#160;and&#160;generated&#160;APIs&#160;an
 [...]
 </text><text class="breeze-build-docs-r5" x="0" y="508" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-20)">│</text><text 
class="breeze-build-docs-r1" x="451.4" y="508" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-20)">artifacts&#160;before&#160;the&#160;build&#160;-&#160;useful&#160;for&#160;a&#160;clean&#160;build.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-21)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="532.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-21)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="532.4" textLength="48.8" 
clip-path="url(#breeze-build-docs-line-21)">-one</text><text 
class="breeze-build-docs-r4" x="85.4" y="532.4" textLength="122" 
clip-path="url(#breeze-build-docs-line-21) [...]
+</text><text class="breeze-build-docs-r5" x="0" y="532.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-21)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="532.4" textLength="183" 
clip-path="url(#breeze-build-docs-line-21)">--one-pass-only</text><text 
class="breeze-build-docs-r1" x="451.4" y="532.4" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-21)">Builds&#160;documentation&#160;in&#160;one&#160;pass&#160;only.&#160;This&#160;is&#160;useful&#160;for&#160;d
 [...]
 </text><text class="breeze-build-docs-r5" x="0" y="556.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-22)">│</text><text 
class="breeze-build-docs-r1" x="451.4" y="556.8" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-22)">errors.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-23)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="581.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-23)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="581.2" textLength="97.6" 
clip-path="url(#breeze-build-docs-line-23)">-package</text><text 
class="breeze-build-docs-r4" x="134.2" y="581.2" textLength="85.4" 
clip-path="url(#breeze-build-docs-li [...]
+</text><text class="breeze-build-docs-r5" x="0" y="581.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-23)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="581.2" textLength="195.2" 
clip-path="url(#breeze-build-docs-line-23)">--package-filter</text><text 
class="breeze-build-docs-r1" x="451.4" y="581.2" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-23)">Filter(s)&#160;to&#160;use&#160;more&#160;than&#160;one&#160;can&#160;be&#160;specified.&#160;You&#160;can
 [...]
 </text><text class="breeze-build-docs-r5" x="0" y="605.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-24)">│</text><text 
class="breeze-build-docs-r1" x="451.4" y="605.6" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-24)">matching&#160;the&#160;full&#160;package&#160;name,&#160;for&#160;example&#160;`apache-airflow-providers-*`.&#160;Useful&#160;</text><text
 class="breeze-build-docs-r5" x="1451.8" y="605.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line- [...]
 </text><text class="breeze-build-docs-r5" x="0" y="630" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-25)">│</text><text 
class="breeze-build-docs-r1" x="451.4" y="630" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-25)">when&#160;you&#160;want&#160;to&#160;selectseveral&#160;similarly&#160;named&#160;packages&#160;together.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-build-docs-r5" x="1451 [...]
 </text><text class="breeze-build-docs-r5" x="0" y="654.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-26)">│</text><text 
class="breeze-build-docs-r7" x="451.4" y="654.4" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-26)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-27)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="678.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-27)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="678.8" textLength="97.6" 
clip-path="url(#breeze-build-docs-line-27)">-include</text><text 
class="breeze-build-docs-r4" x="134.2" y="678.8" textLength="244" 
clip-path="url(#breeze-build-docs-lin [...]
-</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-28)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="703.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-28)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="703.2" textLength="97.6" 
clip-path="url(#breeze-build-docs-line-28)">-include</text><text 
class="breeze-build-docs-r4" x="134.2" y="703.2" textLength="219.6" 
clip-path="url(#breeze-build-docs-l [...]
-</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-29)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="727.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-29)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="727.6" textLength="85.4" 
clip-path="url(#breeze-build-docs-line-29)">-github</text><text 
class="breeze-build-docs-r4" x="122" y="727.6" textLength="134.2" 
clip-path="url(#breeze-build-docs-line [...]
-</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-30)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="752" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-30)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="752" textLength="97.6" 
clip-path="url(#breeze-build-docs-line-30)">-builder</text><text 
class="breeze-build-docs-r1" x="451.4" y="752" textLength="756.4" 
clip-path="url(#breeze-build-docs-line-30)" [...]
+</text><text class="breeze-build-docs-r5" x="0" y="678.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-27)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="678.8" textLength="353.8" 
clip-path="url(#breeze-build-docs-line-27)">--include-not-ready-providers</text><text
 class="breeze-build-docs-r1" x="451.4" y="678.8" textLength="817.4" 
clip-path="url(#breeze-build-docs-line-27)">Whether&#160;to&#160;include&#160;providers&#160;that&#160;are&#160;not&#160;yet&#160;ready&#
 [...]
+</text><text class="breeze-build-docs-r5" x="0" y="703.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-28)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="703.2" textLength="329.4" 
clip-path="url(#breeze-build-docs-line-28)">--include-removed-providers</text><text
 class="breeze-build-docs-r1" x="451.4" y="703.2" textLength="561.2" 
clip-path="url(#breeze-build-docs-line-28)">Whether&#160;to&#160;include&#160;providers&#160;that&#160;are&#160;removed.</text><text
 class= [...]
+</text><text class="breeze-build-docs-r5" x="0" y="727.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-29)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="727.6" textLength="231.8" 
clip-path="url(#breeze-build-docs-line-29)">--github-repository</text><text 
class="breeze-build-docs-r6" x="402.6" y="727.6" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-29)">-g</text><text 
class="breeze-build-docs-r1" x="451.4" y="727.6" textLength="585.6" 
clip-path="url(#breez [...]
+</text><text class="breeze-build-docs-r5" x="0" y="752" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-30)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="752" textLength="109.8" 
clip-path="url(#breeze-build-docs-line-30)">--builder</text><text 
class="breeze-build-docs-r1" x="451.4" y="752" textLength="756.4" 
clip-path="url(#breeze-build-docs-line-30)">Buildx&#160;builder&#160;used&#160;to&#160;perform&#160;`docker&#160;buildx&#160;build`&#160;commands.</text><text
 clas [...]
 </text><text class="breeze-build-docs-r5" x="0" y="776.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-31)">│</text><text 
class="breeze-build-docs-r5" x="451.4" y="776.4" textLength="756.4" 
clip-path="url(#breeze-build-docs-line-31)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-32)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="800.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-32)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="800.8" textLength="97.6" 
clip-path="url(#breeze-build-docs-line-32)">-package</text><text 
class="breeze-build-docs-r4" x="134.2" y="800.8" textLength="61" 
clip-path="url(#breeze-build-docs-line [...]
+</text><text class="breeze-build-docs-r5" x="0" y="800.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-32)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="800.8" textLength="170.8" 
clip-path="url(#breeze-build-docs-line-32)">--package-list</text><text 
class="breeze-build-docs-r1" x="451.4" y="800.8" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-32)">Optional,&#160;contains&#160;comma-separated&#160;list&#160;of&#160;package&#160;ids&#160;that&#160;are&#160
 [...]
 </text><text class="breeze-build-docs-r5" x="0" y="825.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-33)">│</text><text 
class="breeze-build-docs-r1" x="451.4" y="825.2" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-33)">documentation&#160;building,&#160;and&#160;document&#160;publishing.&#160;It&#160;is&#160;an&#160;easier&#160;alternative&#160;to&#160;&#160;</text><text
 class="breeze-build-docs-r5" x="1451.8" y="825.2" textLength="12.2" 
clip-path="url(#breeze-b [...]
 </text><text class="breeze-build-docs-r5" x="0" y="849.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-34)">│</text><text 
class="breeze-build-docs-r1" x="451.4" y="849.6" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-34)">adding&#160;individual&#160;packages&#160;as&#160;arguments&#160;to&#160;every&#160;command.&#160;This&#160;overrides&#160;the&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-build-docs-r5" x="1451.8" y="849.6" textLength="12.2" clip-path 
[...]
 </text><text class="breeze-build-docs-r5" x="0" y="874" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-35)">│</text><text 
class="breeze-build-docs-r1" x="451.4" y="874" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-35)">packages&#160;passed&#160;as&#160;arguments.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
 </text><text class="breeze-build-docs-r5" x="0" y="898.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-36)">│</text><text 
class="breeze-build-docs-r7" x="451.4" y="898.4" textLength="988.2" 
clip-path="url(#breeze-build-docs-line-36)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
 </text><text class="breeze-build-docs-r5" x="0" y="922.8" textLength="1464" 
clip-path="url(#breeze-build-docs-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-build-docs-r1" x="1464" y="922.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-37)">
 </text><text class="breeze-build-docs-r5" x="0" y="947.2" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-38)">╭─</text><text 
class="breeze-build-docs-r5" x="24.4" y="947.2" textLength="195.2" 
clip-path="url(#breeze-build-docs-line-38)">&#160;Common&#160;options&#160;</text><text
 class="breeze-build-docs-r5" x="219.6" y="947.2" textLength="1220" 
clip-path="url(#breeze-build-docs-line-38)">───────────────────────────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="971.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-39)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="971.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-39)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="971.6" textLength="48.8" 
clip-path="url(#breeze-build-docs-line-39)">-dry</text><text 
class="breeze-build-docs-r4" x="85.4" y="971.6" textLength="48.8" 
clip-path="url(#breeze-build-docs-line-39 [...]
-</text><text class="breeze-build-docs-r5" x="0" y="996" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-40)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="996" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-40)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="996" textLength="97.6" 
clip-path="url(#breeze-build-docs-line-40)">-verbose</text><text 
class="breeze-build-docs-r6" x="158.6" y="996" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-40)"> [...]
-</text><text class="breeze-build-docs-r5" x="0" y="1020.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-41)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="1020.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-41)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="1020.4" textLength="85.4" 
clip-path="url(#breeze-build-docs-line-41)">-answer</text><text 
class="breeze-build-docs-r6" x="158.6" y="1020.4" textLength="24.4" 
clip-path="url(#breeze-build-docs [...]
-</text><text class="breeze-build-docs-r5" x="0" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-42)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-42)">-</text><text 
class="breeze-build-docs-r4" x="36.6" y="1044.8" textLength="61" 
clip-path="url(#breeze-build-docs-line-42)">-help</text><text 
class="breeze-build-docs-r6" x="158.6" y="1044.8" textLength="24.4" 
clip-path="url(#breeze-build-docs-lin [...]
+</text><text class="breeze-build-docs-r5" x="0" y="971.6" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-39)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="971.6" textLength="109.8" 
clip-path="url(#breeze-build-docs-line-39)">--dry-run</text><text 
class="breeze-build-docs-r6" x="158.6" y="971.6" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-39)">-D</text><text 
class="breeze-build-docs-r1" x="207.4" y="971.6" textLength="719.8" 
clip-path="url(#breeze-build-do [...]
+</text><text class="breeze-build-docs-r5" x="0" y="996" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-40)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="996" textLength="109.8" 
clip-path="url(#breeze-build-docs-line-40)">--verbose</text><text 
class="breeze-build-docs-r6" x="158.6" y="996" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-40)">-v</text><text 
class="breeze-build-docs-r1" x="207.4" y="996" textLength="585.6" 
clip-path="url(#breeze-build-docs-line- [...]
+</text><text class="breeze-build-docs-r5" x="0" y="1020.4" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-41)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="1020.4" textLength="97.6" 
clip-path="url(#breeze-build-docs-line-41)">--answer</text><text 
class="breeze-build-docs-r6" x="158.6" y="1020.4" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-41)">-a</text><text 
class="breeze-build-docs-r1" x="207.4" y="1020.4" textLength="317.2" 
clip-path="url(#breeze-build- [...]
+</text><text class="breeze-build-docs-r5" x="0" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-42)">│</text><text 
class="breeze-build-docs-r4" x="24.4" y="1044.8" textLength="73.2" 
clip-path="url(#breeze-build-docs-line-42)">--help</text><text 
class="breeze-build-docs-r6" x="158.6" y="1044.8" textLength="24.4" 
clip-path="url(#breeze-build-docs-line-42)">-h</text><text 
class="breeze-build-docs-r1" x="207.4" y="1044.8" textLength="329.4" 
clip-path="url(#breeze-build-do [...]
 </text><text class="breeze-build-docs-r5" x="0" y="1069.2" textLength="1464" 
clip-path="url(#breeze-build-docs-line-43)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-build-docs-r1" x="1464" y="1069.2" textLength="12.2" 
clip-path="url(#breeze-build-docs-line-43)">
 </text>
     </g>
diff --git a/dev/breeze/doc/images/output_build-docs.txt 
b/dev/breeze/doc/images/output_build-docs.txt
index 760b6b3d09..85554fb426 100644
--- a/dev/breeze/doc/images/output_build-docs.txt
+++ b/dev/breeze/doc/images/output_build-docs.txt
@@ -1 +1 @@
-ac6594538890f8fba65c916aa8672aa1
+91166ce4114ea9c162c139d2aff15886
diff --git a/dev/breeze/doc/images/output_prod-image.svg 
b/dev/breeze/doc/images/output_prod-image.svg
index 6b907c07a6..ef8e95626d 100644
--- a/dev/breeze/doc/images/output_prod-image.svg
+++ b/dev/breeze/doc/images/output_prod-image.svg
@@ -98,7 +98,7 @@
 </text><text class="breeze-prod-image-r1" x="12.2" y="93.2" textLength="732" 
clip-path="url(#breeze-prod-image-line-3)">Tools&#160;that&#160;developers&#160;can&#160;use&#160;to&#160;manually&#160;manage&#160;PROD&#160;images</text><text
 class="breeze-prod-image-r1" x="1464" y="93.2" textLength="12.2" 
clip-path="url(#breeze-prod-image-line-3)">
 </text><text class="breeze-prod-image-r1" x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-prod-image-line-4)">
 </text><text class="breeze-prod-image-r5" x="0" y="142" textLength="24.4" 
clip-path="url(#breeze-prod-image-line-5)">╭─</text><text 
class="breeze-prod-image-r5" x="24.4" y="142" textLength="195.2" 
clip-path="url(#breeze-prod-image-line-5)">&#160;Common&#160;options&#160;</text><text
 class="breeze-prod-image-r5" x="219.6" y="142" textLength="1220" 
clip-path="url(#breeze-prod-image-line-5)">────────────────────────────────────────────────────────────────────────────────────────────────────
 [...]
-</text><text class="breeze-prod-image-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-line-6)">│</text><text 
class="breeze-prod-image-r4" x="24.4" y="166.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-line-6)">-</text><text 
class="breeze-prod-image-r4" x="36.6" y="166.4" textLength="61" 
clip-path="url(#breeze-prod-image-line-6)">-help</text><text 
class="breeze-prod-image-r6" x="122" y="166.4" textLength="24.4" 
clip-path="url(#breeze-prod-image-line-6)">-h< [...]
+</text><text class="breeze-prod-image-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-prod-image-line-6)">│</text><text 
class="breeze-prod-image-r4" x="24.4" y="166.4" textLength="73.2" 
clip-path="url(#breeze-prod-image-line-6)">--help</text><text 
class="breeze-prod-image-r6" x="122" y="166.4" textLength="24.4" 
clip-path="url(#breeze-prod-image-line-6)">-h</text><text 
class="breeze-prod-image-r1" x="170.8" y="166.4" textLength="329.4" 
clip-path="url(#breeze-prod-image-line-6 [...]
 </text><text class="breeze-prod-image-r5" x="0" y="190.8" textLength="1464" 
clip-path="url(#breeze-prod-image-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-prod-image-r1" x="1464" y="190.8" textLength="12.2" 
clip-path="url(#breeze-prod-image-line-7)">
 </text><text class="breeze-prod-image-r5" x="0" y="215.2" textLength="24.4" 
clip-path="url(#breeze-prod-image-line-8)">╭─</text><text 
class="breeze-prod-image-r5" x="24.4" y="215.2" textLength="292.8" 
clip-path="url(#breeze-prod-image-line-8)">&#160;Production&#160;Image&#160;tools&#160;</text><text
 class="breeze-prod-image-r5" x="317.2" y="215.2" textLength="1122.4" 
clip-path="url(#breeze-prod-image-line-8)">───────────────────────────────────────────────────────────────────────────────
 [...]
 </text><text class="breeze-prod-image-r5" x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-prod-image-line-9)">│</text><text 
class="breeze-prod-image-r4" x="24.4" y="239.6" textLength="85.4" 
clip-path="url(#breeze-prod-image-line-9)">build&#160;&#160;</text><text 
class="breeze-prod-image-r1" x="134.2" y="239.6" textLength="1305.4" 
clip-path="url(#breeze-prod-image-line-9)">Build&#160;Production&#160;image.&#160;Include&#160;building&#160;multiple&#160;images&#160;for&#160;all&#16
 [...]
diff --git a/dev/breeze/doc/images/output_prod-image.txt 
b/dev/breeze/doc/images/output_prod-image.txt
index 4e4ac97bd6..c767ee09d4 100644
--- a/dev/breeze/doc/images/output_prod-image.txt
+++ b/dev/breeze/doc/images/output_prod-image.txt
@@ -1 +1 @@
-55030fe0d7718eb668fa1a37128647b0
+d91bcc76b14f186e749efe2c6aaa8682
diff --git a/dev/breeze/doc/images/output_prod-image_build.txt 
b/dev/breeze/doc/images/output_prod-image_build.txt
index e1e2a2c9c6..1645f4d547 100644
--- a/dev/breeze/doc/images/output_prod-image_build.txt
+++ b/dev/breeze/doc/images/output_prod-image_build.txt
@@ -1 +1 @@
-88290b22adcd4e5cc9da29aaa8467992
+c243f4de16bc858f6202d88922f00109
diff --git a/dev/breeze/doc/images/output_setup.svg 
b/dev/breeze/doc/images/output_setup.svg
index c747a1eea7..5dda408ade 100644
--- a/dev/breeze/doc/images/output_setup.svg
+++ b/dev/breeze/doc/images/output_setup.svg
@@ -110,7 +110,7 @@
 </text><text class="breeze-setup-r1" x="12.2" y="93.2" textLength="597.8" 
clip-path="url(#breeze-setup-line-3)">Tools&#160;that&#160;developers&#160;can&#160;use&#160;to&#160;configure&#160;Breeze</text><text
 class="breeze-setup-r1" x="1464" y="93.2" textLength="12.2" 
clip-path="url(#breeze-setup-line-3)">
 </text><text class="breeze-setup-r1" x="1464" y="117.6" textLength="12.2" 
clip-path="url(#breeze-setup-line-4)">
 </text><text class="breeze-setup-r5" x="0" y="142" textLength="24.4" 
clip-path="url(#breeze-setup-line-5)">╭─</text><text class="breeze-setup-r5" 
x="24.4" y="142" textLength="195.2" 
clip-path="url(#breeze-setup-line-5)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-r5" x="219.6" y="142" textLength="1220" 
clip-path="url(#breeze-setup-line-5)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="breeze-set [...]
-</text><text class="breeze-setup-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-setup-line-6)">│</text><text class="breeze-setup-r4" 
x="24.4" y="166.4" textLength="12.2" 
clip-path="url(#breeze-setup-line-6)">-</text><text class="breeze-setup-r4" 
x="36.6" y="166.4" textLength="61" 
clip-path="url(#breeze-setup-line-6)">-help</text><text class="breeze-setup-r6" 
x="122" y="166.4" textLength="24.4" 
clip-path="url(#breeze-setup-line-6)">-h</text><text class="breeze-setup-r1" 
x="1 [...]
+</text><text class="breeze-setup-r5" x="0" y="166.4" textLength="12.2" 
clip-path="url(#breeze-setup-line-6)">│</text><text class="breeze-setup-r4" 
x="24.4" y="166.4" textLength="73.2" 
clip-path="url(#breeze-setup-line-6)">--help</text><text 
class="breeze-setup-r6" x="122" y="166.4" textLength="24.4" 
clip-path="url(#breeze-setup-line-6)">-h</text><text class="breeze-setup-r1" 
x="170.8" y="166.4" textLength="329.4" 
clip-path="url(#breeze-setup-line-6)">Show&#160;this&#160;message&#160;and& 
[...]
 </text><text class="breeze-setup-r5" x="0" y="190.8" textLength="1464" 
clip-path="url(#breeze-setup-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-r1" x="1464" y="190.8" textLength="12.2" 
clip-path="url(#breeze-setup-line-7)">
 </text><text class="breeze-setup-r5" x="0" y="215.2" textLength="24.4" 
clip-path="url(#breeze-setup-line-8)">╭─</text><text class="breeze-setup-r5" 
x="24.4" y="215.2" textLength="85.4" 
clip-path="url(#breeze-setup-line-8)">&#160;Setup&#160;</text><text 
class="breeze-setup-r5" x="109.8" y="215.2" textLength="1329.8" 
clip-path="url(#breeze-setup-line-8)">─────────────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 class="breeze-s [...]
 </text><text class="breeze-setup-r5" x="0" y="239.6" textLength="12.2" 
clip-path="url(#breeze-setup-line-9)">│</text><text class="breeze-setup-r4" 
x="24.4" y="239.6" textLength="378.2" 
clip-path="url(#breeze-setup-line-9)">autocomplete&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-setup-r1" x="427" y="239.6" textLength="1012.6" 
clip-path="url(#breeze-setup-line-9)">Enables&#160;autocompletion&#1 [...]
diff --git a/dev/breeze/doc/images/output_setup.txt 
b/dev/breeze/doc/images/output_setup.txt
index b8f9048b91..274751197d 100644
--- a/dev/breeze/doc/images/output_setup.txt
+++ b/dev/breeze/doc/images/output_setup.txt
@@ -1 +1 @@
-d4a4f1b405f912fa234ff4116068290a
+08c78d9dddd037a2ade6b751c5a22ff9
diff --git a/dev/breeze/doc/images/output_setup_autocomplete.svg 
b/dev/breeze/doc/images/output_setup_autocomplete.svg
index e118e1fced..31f7814001 100644
--- a/dev/breeze/doc/images/output_setup_autocomplete.svg
+++ b/dev/breeze/doc/images/output_setup_autocomplete.svg
@@ -102,13 +102,13 @@
 </text><text class="breeze-setup-autocomplete-r1" x="12.2" y="93.2" 
textLength="512.4" 
clip-path="url(#breeze-setup-autocomplete-line-3)">Enables&#160;autocompletion&#160;of&#160;breeze&#160;commands.</text><text
 class="breeze-setup-autocomplete-r1" x="1464" y="93.2" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-3)">
 </text><text class="breeze-setup-autocomplete-r1" x="1464" y="117.6" 
textLength="12.2" clip-path="url(#breeze-setup-autocomplete-line-4)">
 </text><text class="breeze-setup-autocomplete-r5" x="0" y="142" 
textLength="24.4" 
clip-path="url(#breeze-setup-autocomplete-line-5)">╭─</text><text 
class="breeze-setup-autocomplete-r5" x="24.4" y="142" textLength="317.2" 
clip-path="url(#breeze-setup-autocomplete-line-5)">&#160;Setup&#160;autocomplete&#160;flags&#160;</text><text
 class="breeze-setup-autocomplete-r5" x="341.6" y="142" textLength="1098" 
clip-path="url(#breeze-setup-autocomplete-line-5)">─────────────────────────────────────
 [...]
-</text><text class="breeze-setup-autocomplete-r5" x="0" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-6)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="166.4" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-6)">-</text><text 
class="breeze-setup-autocomplete-r4" x="36.6" y="166.4" textLength="73.2" 
clip-path="url(#breeze-setup-autocomplete-line-6)">-force</text><text 
class="breeze-setup-autocomplete-r6" x="134.2" y="166.4" tex [...]
+</text><text class="breeze-setup-autocomplete-r5" x="0" y="166.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-6)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="166.4" textLength="85.4" 
clip-path="url(#breeze-setup-autocomplete-line-6)">--force</text><text 
class="breeze-setup-autocomplete-r6" x="134.2" y="166.4" textLength="24.4" 
clip-path="url(#breeze-setup-autocomplete-line-6)">-f</text><text 
class="breeze-setup-autocomplete-r1" x="183" y="166.4" te [...]
 </text><text class="breeze-setup-autocomplete-r5" x="0" y="190.8" 
textLength="1464" 
clip-path="url(#breeze-setup-autocomplete-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-autocomplete-r1" x="1464" y="190.8" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-7)">
 </text><text class="breeze-setup-autocomplete-r5" x="0" y="215.2" 
textLength="24.4" 
clip-path="url(#breeze-setup-autocomplete-line-8)">╭─</text><text 
class="breeze-setup-autocomplete-r5" x="24.4" y="215.2" textLength="195.2" 
clip-path="url(#breeze-setup-autocomplete-line-8)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-autocomplete-r5" x="219.6" y="215.2" textLength="1220" 
clip-path="url(#breeze-setup-autocomplete-line-8)">──────────────────────────────────────────────
 [...]
-</text><text class="breeze-setup-autocomplete-r5" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-9)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="239.6" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-9)">-</text><text 
class="breeze-setup-autocomplete-r4" x="36.6" y="239.6" textLength="97.6" 
clip-path="url(#breeze-setup-autocomplete-line-9)">-verbose</text><text 
class="breeze-setup-autocomplete-r6" x="158.6" y="239.6" t [...]
-</text><text class="breeze-setup-autocomplete-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-10)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="264" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-10)">-</text><text 
class="breeze-setup-autocomplete-r4" x="36.6" y="264" textLength="48.8" 
clip-path="url(#breeze-setup-autocomplete-line-10)">-dry</text><text 
class="breeze-setup-autocomplete-r4" x="85.4" y="264" textLength= [...]
-</text><text class="breeze-setup-autocomplete-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-11)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="288.4" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-11)">-</text><text 
class="breeze-setup-autocomplete-r4" x="36.6" y="288.4" textLength="85.4" 
clip-path="url(#breeze-setup-autocomplete-line-11)">-answer</text><text 
class="breeze-setup-autocomplete-r6" x="158.6" y="288.4" [...]
-</text><text class="breeze-setup-autocomplete-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-12)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="312.8" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-12)">-</text><text 
class="breeze-setup-autocomplete-r4" x="36.6" y="312.8" textLength="61" 
clip-path="url(#breeze-setup-autocomplete-line-12)">-help</text><text 
class="breeze-setup-autocomplete-r6" x="158.6" y="312.8" tex [...]
+</text><text class="breeze-setup-autocomplete-r5" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-9)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="239.6" textLength="109.8" 
clip-path="url(#breeze-setup-autocomplete-line-9)">--verbose</text><text 
class="breeze-setup-autocomplete-r6" x="158.6" y="239.6" textLength="24.4" 
clip-path="url(#breeze-setup-autocomplete-line-9)">-v</text><text 
class="breeze-setup-autocomplete-r1" x="207.4" y="239. [...]
+</text><text class="breeze-setup-autocomplete-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-10)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="264" textLength="109.8" 
clip-path="url(#breeze-setup-autocomplete-line-10)">--dry-run</text><text 
class="breeze-setup-autocomplete-r6" x="158.6" y="264" textLength="24.4" 
clip-path="url(#breeze-setup-autocomplete-line-10)">-D</text><text 
class="breeze-setup-autocomplete-r1" x="207.4" y="264" te [...]
+</text><text class="breeze-setup-autocomplete-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-11)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="288.4" textLength="97.6" 
clip-path="url(#breeze-setup-autocomplete-line-11)">--answer</text><text 
class="breeze-setup-autocomplete-r6" x="158.6" y="288.4" textLength="24.4" 
clip-path="url(#breeze-setup-autocomplete-line-11)">-a</text><text 
class="breeze-setup-autocomplete-r1" x="207.4" y="288 [...]
+</text><text class="breeze-setup-autocomplete-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-12)">│</text><text 
class="breeze-setup-autocomplete-r4" x="24.4" y="312.8" textLength="73.2" 
clip-path="url(#breeze-setup-autocomplete-line-12)">--help</text><text 
class="breeze-setup-autocomplete-r6" x="158.6" y="312.8" textLength="24.4" 
clip-path="url(#breeze-setup-autocomplete-line-12)">-h</text><text 
class="breeze-setup-autocomplete-r1" x="207.4" y="312.8 [...]
 </text><text class="breeze-setup-autocomplete-r5" x="0" y="337.2" 
textLength="1464" 
clip-path="url(#breeze-setup-autocomplete-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-autocomplete-r1" x="1464" y="337.2" textLength="12.2" 
clip-path="url(#breeze-setup-autocomplete-line-13)">
 </text>
     </g>
diff --git a/dev/breeze/doc/images/output_setup_autocomplete.txt 
b/dev/breeze/doc/images/output_setup_autocomplete.txt
index 185feef026..144c2613cd 100644
--- a/dev/breeze/doc/images/output_setup_autocomplete.txt
+++ b/dev/breeze/doc/images/output_setup_autocomplete.txt
@@ -1 +1 @@
-fffcd49e102e09ccd69b3841a9e3ea8e
+ec3b4541a478afe5cb86a6f1c48f50f5
diff --git a/dev/breeze/doc/images/output_setup_config.txt 
b/dev/breeze/doc/images/output_setup_config.txt
index 3b2da9a9c0..695e4b5c87 100644
--- a/dev/breeze/doc/images/output_setup_config.txt
+++ b/dev/breeze/doc/images/output_setup_config.txt
@@ -1 +1 @@
-96e10564034b282769a2c48ebf7176e2
+e77da96b508cc4911857d6f1266802b5
diff --git a/dev/breeze/doc/images/output_start-airflow.txt 
b/dev/breeze/doc/images/output_start-airflow.txt
index 31367c64bf..428a70cf0c 100644
--- a/dev/breeze/doc/images/output_start-airflow.txt
+++ b/dev/breeze/doc/images/output_start-airflow.txt
@@ -1 +1 @@
-2fdb4b01e6d949fb40993e3cc416ca5c
+834ca1bef0a55889bfccfeb41738a2f6
diff --git a/dev/breeze/pyproject.toml b/dev/breeze/pyproject.toml
index 32b3e1fbe6..e7bdbb4db0 100644
--- a/dev/breeze/pyproject.toml
+++ b/dev/breeze/pyproject.toml
@@ -48,7 +48,20 @@ dependencies = [
     "black>=23.11.0",
     "click>=8.1.7",
     "filelock>=3.13.0",
-    "flit>=3.5.0",
+    #
+    # We pin flit in order to make sure reproducibility of provider packages 
is maintained
+    # It turns out that when packages are prepared metadata version in the 
produced packages
+    # is taken from the front-end not from the backend, so in order to make 
sure that the
+    # packages are reproducible, we should pin both backend in "build-system" 
and frontend in
+    # "dependencies" of the environment that is used to build the packages.
+    #
+    # TODO(potiuk): automate bumping the version of flit in breeze and sync it 
with
+    # the version in the template for provider packages with pre-commit also 
add instructions in
+    # the source packages explaining that reproducibility can only be achieved 
by using the same
+    # version of flit front-end to build the package
+    #
+    "flit==3.10.1",
+    "flit-core==3.10.1",
     "gitpython>=3.1.40",
     "hatch==1.9.4",
     # Importib_resources 6.2.0-6.3.1 break pytest_rewrite
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py 
b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
index 8c5c449ed7..697526c1af 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
@@ -341,7 +341,6 @@ def remove_old_releases(version, repo_root):
     "--version", required=True, help="The release candidate version e.g. 
2.4.3rc1", envvar="VERSION"
 )
 def prepare_airflow_tarball(version: str):
-    check_python_version()
     from packaging.version import Version
 
     airflow_version = Version(version)
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index ce9ec44e57..9defbe7ef4 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -520,7 +520,6 @@ def prepare_airflow_packages(
     version_suffix_for_pypi: str,
     use_local_hatch: bool,
 ):
-    check_python_version()
     perform_environment_checks()
     fix_ownership_using_docker()
     cleanup_python_generated_files()
@@ -3067,7 +3066,6 @@ def prepare_helm_chart_tarball(
 ) -> None:
     import yaml
 
-    check_python_version()
     chart_yaml_file_content = CHART_YAML_FILE.read_text()
     chart_yaml_dict = yaml.safe_load(chart_yaml_file_content)
     version_in_chart = chart_yaml_dict["version"]
@@ -3209,8 +3207,6 @@ def prepare_helm_chart_tarball(
 @option_dry_run
 @option_verbose
 def prepare_helm_chart_package(sign_email: str):
-    check_python_version()
-
     import yaml
 
     from airflow_breeze.utils.kubernetes_utils import (
diff --git a/dev/breeze/src/airflow_breeze/commands/setup_commands.py 
b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
index bc1ac4f1fa..f0d1e4eac7 100644
--- a/dev/breeze/src/airflow_breeze/commands/setup_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/setup_commands.py
@@ -22,6 +22,7 @@ import os
 import shutil
 import subprocess
 import sys
+import textwrap
 from copy import copy
 from pathlib import Path
 from typing import Any
@@ -274,8 +275,31 @@ def change_config(
     get_console().print()
 
 
-def dict_hash(dictionary: dict[str, Any]) -> str:
+def dedent_help(dictionary: dict[str, Any]) -> None:
+    """
+    Dedent help stored in the dictionary.
+
+    Python 3.13 automatically dedents docstrings retrieved from functions.
+    See https://github.com/python/cpython/issues/81283
+
+    However, click uses docstrings in the absence of help strings, and we are 
using click
+    command definition dictionary hash to detect changes in the command 
definitions, so if the
+    help strings are not dedented, the hash will change.
+
+    That's why we must de-dent all the help strings in the command definition 
dictionary
+    before we hash it.
+    """
+    for key, value in dictionary.items():
+        if isinstance(value, dict):
+            dedent_help(value)
+        elif key == "help" and isinstance(value, str):
+            dictionary[key] = textwrap.dedent(value)
+
+
+def dict_hash(dictionary: dict[str, Any], dedent_help_strings: bool = True) -> 
str:
     """MD5 hash of a dictionary. Sorted and dumped via json to account for 
random sequence)"""
+    if dedent_help_strings:
+        dedent_help(dictionary)
     # noinspection InsecureHash
     dhash = hashlib.md5()
     try:
diff --git 
a/dev/breeze/src/airflow_breeze/templates/pyproject_TEMPLATE.toml.jinja2 
b/dev/breeze/src/airflow_breeze/templates/pyproject_TEMPLATE.toml.jinja2
index 389d2ce62e..a375ffedc6 100644
--- a/dev/breeze/src/airflow_breeze/templates/pyproject_TEMPLATE.toml.jinja2
+++ b/dev/breeze/src/airflow_breeze/templates/pyproject_TEMPLATE.toml.jinja2
@@ -39,9 +39,8 @@
 
 # IF YOU WANT TO MODIFY THIS FILE, YOU SHOULD MODIFY THE TEMPLATE
 # `pyproject_TEMPLATE.toml.jinja2` IN the 
`dev/breeze/src/airflow_breeze/templates` DIRECTORY
-#
 [build-system]
-requires = ["flit_core >=3.2,<4"]
+requires = ["flit_core==3.10.1"]
 build-backend = "flit_core.buildapi"
 
 [project]
diff --git a/dev/breeze/src/airflow_breeze/utils/python_versions.py 
b/dev/breeze/src/airflow_breeze/utils/python_versions.py
index b8807e66bf..d84c4f932b 100644
--- a/dev/breeze/src/airflow_breeze/utils/python_versions.py
+++ b/dev/breeze/src/airflow_breeze/utils/python_versions.py
@@ -46,16 +46,10 @@ def get_python_version_list(python_versions: str) -> 
list[str]:
 
 
 def check_python_version():
-    error = False
     if not sys.version_info >= (3, 9):
         get_console().print("[error]At least Python 3.9 is required to prepare 
reproducible archives.\n")
-        error = True
-    elif not sys.version_info < (3, 12):
-        get_console().print("[error]Python 3.12 is not supported.\n")
-        error = True
-    if error:
         get_console().print(
-            "[warning]Please reinstall Breeze using Python 3.9 - 3.11 
environment.[/]\n\n"
+            "[warning]Please reinstall Breeze using Python 3.9 - 3.12 
environment.[/]\n\n"
             "If you are using uv:\n\n"
             "   uv tool install --force --reinstall --python 3.9 -e 
./dev/breeze\n\n"
             "If you are using pipx:\n\n"
diff --git a/dev/breeze/src/airflow_breeze/utils/reproducible.py 
b/dev/breeze/src/airflow_breeze/utils/reproducible.py
index 1429333d64..cf4005d9dd 100644
--- a/dev/breeze/src/airflow_breeze/utils/reproducible.py
+++ b/dev/breeze/src/airflow_breeze/utils/reproducible.py
@@ -43,7 +43,6 @@ from pathlib import Path
 from subprocess import CalledProcessError, CompletedProcess
 
 from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT, OUT_DIR, 
REPRODUCIBLE_DIR
-from airflow_breeze.utils.python_versions import check_python_version
 from airflow_breeze.utils.run_utils import run_command
 
 
@@ -91,7 +90,6 @@ def repack_deterministically(
         tarinfo.mtime = timestamp
         return tarinfo
 
-    check_python_version()
     OUT_DIR.mkdir(exist_ok=True)
     shutil.rmtree(REPRODUCIBLE_DIR, ignore_errors=True)
     REPRODUCIBLE_DIR.mkdir(exist_ok=True)
@@ -149,7 +147,6 @@ def repack_deterministically(
 
 
 def main():
-    check_python_version()
     parser = ArgumentParser()
     parser.add_argument("-a", "--archive", help="archive to repack")
     parser.add_argument("-o", "--out", help="archive destination")
diff --git a/dev/breeze/uv.lock b/dev/breeze/uv.lock
index 666cb37805..a5a2520636 100644
--- a/dev/breeze/uv.lock
+++ b/dev/breeze/uv.lock
@@ -25,6 +25,7 @@ dependencies = [
     { name = "click" },
     { name = "filelock" },
     { name = "flit" },
+    { name = "flit-core" },
     { name = "gitpython" },
     { name = "hatch" },
     { name = "importlib-resources", marker = "python_full_version < '3.9'" },
@@ -53,7 +54,8 @@ requires-dist = [
     { name = "black", specifier = ">=23.11.0" },
     { name = "click", specifier = ">=8.1.7" },
     { name = "filelock", specifier = ">=3.13.0" },
-    { name = "flit", specifier = ">=3.5.0" },
+    { name = "flit", specifier = "==3.10.1" },
+    { name = "flit-core", specifier = "==3.10.1" },
     { name = "gitpython", specifier = ">=3.1.40" },
     { name = "hatch", specifier = "==1.9.4" },
     { name = "importlib-resources", marker = "python_full_version < '3.9'", 
specifier = ">=5.2,!=6.2.0,!=6.3.0,!=6.3.1" },

Reply via email to