This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 72a571dc6d Update Airflow release process to include reproducible
tarballs (#36744)
72a571dc6d is described below
commit 72a571dc6d21d90f92d5ce683a5d40c6a527fcb0
Author: Jarek Potiuk <[email protected]>
AuthorDate: Fri Jan 12 17:39:50 2024 +0100
Update Airflow release process to include reproducible tarballs (#36744)
Source tarball is the main artifact produced by the release
process - one that is the "official" release and named like that
by the Apache Software Foundation.
This PR makes the source tarball generation reproducible - following
reproducibility of the `.whl` and `sdist` packages.
This change adds:
* vendors-in reproducible.py script that repacks .tar.gz package
in reproducible way using source-date-epoch as timestamps
* breeze release-management prepare-airflow-tarball command
* adds verification of the tarballs to PMC verification process
* adds --use-local-hatch for package building command to allow for
faster / non-docker build of packages for PMC verification
* improves diagnostic output of the release and build commands
---
.rat-excludes | 2 +
3rd-party-licenses/LICENSE-reproducible.txt | 8 ++
BREEZE.rst | 24 ++++
dev/README_RELEASE_AIRFLOW.md | 15 ++-
.../commands/release_candidate_command.py | 136 +++++++++++++++------
.../commands/release_management_commands.py | 31 ++++-
.../commands/release_management_commands_config.py | 15 ++-
.../src/airflow_breeze/utils/reproducible.py | 135 ++++++++++++++++++++
images/breeze/output_release-management.svg | 54 ++++----
images/breeze/output_release-management.txt | 2 +-
..._release-management_prepare-airflow-package.svg | 28 +++--
..._release-management_prepare-airflow-package.txt | 2 +-
..._release-management_prepare-airflow-tarball.svg | 106 ++++++++++++++++
..._release-management_prepare-airflow-tarball.txt | 1 +
.../output_setup_check-all-params-in-groups.svg | 20 +--
.../output_setup_check-all-params-in-groups.txt | 2 +-
.../output_setup_regenerate-command-images.svg | 46 +++----
.../output_setup_regenerate-command-images.txt | 2 +-
.../in_container/run_prepare_airflow_packages.py | 5 +-
19 files changed, 514 insertions(+), 120 deletions(-)
diff --git a/.rat-excludes b/.rat-excludes
index 9822c9ac41..6464d827d5 100644
--- a/.rat-excludes
+++ b/.rat-excludes
@@ -132,6 +132,8 @@ scripts/*
images/*
dev/*
chart/*.iml
+out/*
+airflow-build-dockerfile*
# Sha files
.*sha256
diff --git a/3rd-party-licenses/LICENSE-reproducible.txt
b/3rd-party-licenses/LICENSE-reproducible.txt
new file mode 100644
index 0000000000..65310b4f85
--- /dev/null
+++ b/3rd-party-licenses/LICENSE-reproducible.txt
@@ -0,0 +1,8 @@
+# Copyright 2013 The Servo Project Developers.
+# Copyright 2017 zerolib Developers.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
diff --git a/BREEZE.rst b/BREEZE.rst
index 61b42c510f..e5a12a8ac9 100644
--- a/BREEZE.rst
+++ b/BREEZE.rst
@@ -1981,6 +1981,30 @@ default is to build ``both`` type of packages ``sdist``
and ``wheel``.
:alt: Breeze release-management prepare-airflow-package
+Preparing airflow tarball
+"""""""""""""""""""""""""
+
+You can prepare airflow source tarball using Breeze:
+
+.. code-block:: bash
+
+ breeze release-management prepare-airflow-tarball
+
+This prepares airflow -source.tar.gz package in the dist folder.
+
+You must specify ``--version`` flag which is a pre-release version of Airflow
you are preparing the
+tarball for.
+
+.. code-block:: bash
+
+ breeze release-management prepare-airflow-tarball --version 2.8.0rc1
+
+.. image::
./images/breeze/output_release-management_prepare-airflow-tarball.svg
+ :target:
https://raw.githubusercontent.com/apache/airflow/main/images/breeze/output_release-management_prepare-airflow-tarball.svg
+ :width: 100%
+ :alt: Breeze release-management prepare-airflow-tarball
+
+
Start minor branch of Airflow
"""""""""""""""""""""""""""""
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 6b51c9189f..6c98f9beb1 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -585,16 +585,23 @@ Airflow supports reproducible builds, which means that
the packages prepared fro
produce binary identical packages in reproducible way. You should check if the
packages can be
binary-reproduced when built from the sources.
-Checkout airflow sources and build packages in dist folder:
+Checkout airflow sources and build packages in dist folder (replace X.Y.Zrc1
with the version
+you are checking):
```shell script
-git checkout X.Y.Zrc1
+VERSION=X.Y.Zrc1
+git checkout ${VERSION}
export AIRFLOW_REPO_ROOT=$(pwd)
rm -rf dist/*
-breeze release-management prepare-airflow-package --package-format both
+breeze release-management prepare-airflow-tarball --version ${VERSION}
+breeze release-management prepare-airflow-package --package-format both
--use-local-hatch
```
-That should produce `.whl` and `.tar.gz` packages in dist folder.
+Note that you need to have `hatch` installed in order to build the packages
with the last command.
+If you do not have `hatch`, you can remove the `--use-local-hatch` flag and it
will build and use
+docker image that has `hatch` and other necessary tools installed.
+
+That should produce `-source.tar.gz` tarball of sources and `.whl`, `.tar.gz`
packages in dist folder.
Change to the directory where you have the packages from svn:
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 09cc67c226..11cba8d9f5 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_candidate_command.py
@@ -17,6 +17,7 @@
from __future__ import annotations
import os
+import shutil
import click
@@ -25,6 +26,7 @@ from airflow_breeze.commands.release_management_group import
release_management
from airflow_breeze.utils.confirm import confirm_action
from airflow_breeze.utils.console import console_print
from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+from airflow_breeze.utils.reproducible import archive_deterministically,
get_source_date_epoch
from airflow_breeze.utils.run_utils import run_command
CI = os.environ.get("CI")
@@ -59,21 +61,30 @@ def merge_pr(version_branch):
def git_tag(version):
if confirm_action(f"Tag {version}?"):
run_command(["git", "tag", "-s", f"{version}", "-m", f"Apache Airflow
{version}"], check=True)
- console_print("Tagged")
+ console_print("[success]Tagged")
def git_clean():
if confirm_action("Clean git repo?"):
run_command(["breeze", "ci", "fix-ownership"],
dry_run_override=DRY_RUN, check=True)
run_command(["git", "clean", "-fxd"], dry_run_override=DRY_RUN,
check=True)
- console_print("Git repo cleaned")
+ console_print("[success]Git repo cleaned")
-def tarball_release(version, version_without_rc):
- if confirm_action("Create tarball?"):
- run_command(["rm", "-rf", "dist"], check=True)
+DIST_DIR = AIRFLOW_SOURCES_ROOT / "dist"
+OUT_DIR = AIRFLOW_SOURCES_ROOT / "out"
+REPRODUCIBLE_DIR = OUT_DIR / "reproducible"
+
- run_command(["mkdir", "dist"], check=True)
+def tarball_release(version: str, version_without_rc: str, source_date_epoch:
int):
+ if confirm_action("Create tarball?"):
+ console_print(f"[info]Creating tarball for Airflow {version}")
+ shutil.rmtree(OUT_DIR, ignore_errors=True)
+ DIST_DIR.mkdir(exist_ok=True)
+ OUT_DIR.mkdir(exist_ok=True)
+ REPRODUCIBLE_DIR.mkdir(exist_ok=True)
+ archive_name = f"apache-airflow-{version_without_rc}-source.tar.gz"
+ temporary_archive = OUT_DIR / archive_name
run_command(
[
"git",
@@ -82,19 +93,48 @@ def tarball_release(version, version_without_rc):
f"{version}",
f"--prefix=apache-airflow-{version_without_rc}/",
"-o",
- f"dist/apache-airflow-{version_without_rc}-source.tar.gz",
+ temporary_archive.as_posix(),
],
check=True,
)
- console_print("Tarball created")
+ run_command(
+ [
+ "tar",
+ "-xf",
+ temporary_archive.as_posix(),
+ "-C",
+ REPRODUCIBLE_DIR.as_posix(),
+ "--strip",
+ "1",
+ ]
+ )
+ final_archive = DIST_DIR / archive_name
+ archive_deterministically(
+ dir_to_archive=REPRODUCIBLE_DIR.as_posix(),
+ dest_archive=final_archive.as_posix(),
+ prepend_path=None,
+ timestamp=source_date_epoch,
+ )
+ console_print(f"[success]Tarball created in {final_archive}")
-def create_artifacts_with_sdist():
- run_command(["hatch", "build", "-t", "sdist", "-t", "wheel"], check=True)
- console_print("Artifacts created")
+def create_artifacts_with_hatch(source_date_epoch: int):
+ console_print("[info]Creating artifacts with hatch")
+ shutil.rmtree(DIST_DIR, ignore_errors=True)
+ DIST_DIR.mkdir(exist_ok=True)
+ env_copy = os.environ.copy()
+ env_copy["SOURCE_DATE_EPOCH"] = str(source_date_epoch)
+ run_command(
+ ["hatch", "build", "-c", "-t", "custom", "-t", "sdist", "-t",
"wheel"], check=True, env=env_copy
+ )
+ console_print("[success]Successfully prepared Airflow packages:")
+ for file in sorted(DIST_DIR.glob("apache_airflow*")):
+ console_print(print(file.name))
+ console_print()
-def create_artifacts_with_breeze():
+def create_artifacts_with_docker():
+ console_print("[info]Creating artifacts with docker")
run_command(
[
"breeze",
@@ -105,14 +145,14 @@ def create_artifacts_with_breeze():
],
check=True,
)
- console_print("Artifacts created")
+ console_print("[success]Artifacts created")
def sign_the_release(repo_root):
if confirm_action("Do you want to sign the release?"):
os.chdir(f"{repo_root}/dist")
run_command("./../dev/sign.sh *", dry_run_override=DRY_RUN,
check=True, shell=True)
- console_print("Release signed")
+ console_print("[success]Release signed")
def tag_and_push_constraints(version, version_branch):
@@ -135,7 +175,7 @@ def tag_and_push_constraints(version, version_branch):
run_command(
["git", "push", "origin", "tag", f"constraints-{version}"],
dry_run_override=DRY_RUN, check=True
)
- console_print("Constraints tagged and pushed")
+ console_print("[success]Constraints tagged and pushed")
def clone_asf_repo(version, repo_root):
@@ -146,7 +186,7 @@ def clone_asf_repo(version, repo_root):
check=True,
)
run_command(["svn", "update", "--set-depth=infinity",
"asf-dist/dev/airflow"], check=True)
- console_print("Cloned ASF repo successfully")
+ console_print("[success]Cloned ASF repo successfully")
def move_artifacts_to_svn(version, repo_root):
@@ -154,7 +194,7 @@ def move_artifacts_to_svn(version, repo_root):
os.chdir(f"{repo_root}/asf-dist/dev/airflow")
run_command(["svn", "mkdir", f"{version}"], dry_run_override=DRY_RUN,
check=True)
run_command(f"mv {repo_root}/dist/* {version}/",
dry_run_override=DRY_RUN, check=True, shell=True)
- console_print("Moved artifacts to SVN:")
+ console_print("[success]Moved artifacts to SVN:")
run_command(["ls"], dry_run_override=DRY_RUN)
@@ -171,7 +211,7 @@ def push_artifacts_to_asf_repo(version, repo_root):
dry_run_override=DRY_RUN,
check=True,
)
- console_print("Files pushed to svn")
+ console_print("[success]Files pushed to svn")
def delete_asf_repo(repo_root):
@@ -182,7 +222,7 @@ def delete_asf_repo(repo_root):
def prepare_pypi_packages(version, version_suffix, repo_root):
if confirm_action("Prepare pypi packages?"):
- console_print("Preparing PyPI packages")
+ console_print("[info]Preparing PyPI packages")
os.chdir(repo_root)
run_command(["git", "checkout", f"{version}"],
dry_run_override=DRY_RUN, check=True)
run_command(
@@ -198,13 +238,13 @@ def prepare_pypi_packages(version, version_suffix,
repo_root):
check=True,
)
run_command(["twine", "check", "dist/*"], check=True)
- console_print("PyPI packages prepared")
+ console_print("[success]PyPI packages prepared")
def push_packages_to_pypi(version):
if confirm_action("Do you want to push packages to production PyPI?"):
run_command(["twine", "upload", "-r", "pypi", "dist/*"],
dry_run_override=DRY_RUN, check=True)
- console_print("Packages pushed to production PyPI")
+ console_print("[success]Packages pushed to production PyPI")
console_print(
"Again, confirm that the package is available here:
https://pypi.python.org/pypi/apache-airflow"
)
@@ -240,7 +280,7 @@ def push_release_candidate_tag_to_github(version):
)
confirm_action(f"Confirm that {version} is pushed to PyPI(not PyPI
test). Is it pushed?", abort=True)
run_command(["git", "push", "origin", "tag", f"{version}"],
dry_run_override=DRY_RUN, check=True)
- console_print("Release candidate tag pushed to GitHub")
+ console_print("[success]Release candidate tag pushed to GitHub")
def create_issue_for_testing(version, previous_version, github_token):
@@ -293,10 +333,31 @@ def remove_old_releases(version, repo_root):
dry_run_override=DRY_RUN,
check=True,
)
-
+ console_print("[success]Old releases removed")
os.chdir(repo_root)
+@release_management.command(
+ name="prepare-airflow-tarball",
+ help="Prepare airflow's source tarball.",
+)
[email protected](
+ "--version", required=True, help="The release candidate version e.g.
2.4.3rc1", envvar="VERSION"
+)
+def prepare_airflow_tarball(version: str):
+ from packaging.version import Version
+
+ airflow_version = Version(version)
+ if not airflow_version.is_prerelease:
+ exit("--version value must be a pre-release")
+ source_date_epoch = get_source_date_epoch()
+ version_without_rc = airflow_version.base_version
+ # Create the tarball
+ tarball_release(
+ version=version, version_without_rc=version_without_rc,
source_date_epoch=source_date_epoch
+ )
+
+
@release_management.command(
name="start-rc-process",
short_help="Start RC process",
@@ -311,7 +372,8 @@ def remove_old_releases(version, repo_root):
def publish_release_candidate(version, previous_version, github_token):
from packaging.version import Version
- if not Version(version).is_prerelease:
+ airflow_version = Version(version)
+ if not airflow_version.is_prerelease:
exit("--version value must be a pre-release")
if Version(previous_version).is_prerelease:
exit("--previous-version value must be a release not a pre-release")
@@ -320,9 +382,10 @@ def publish_release_candidate(version, previous_version,
github_token):
if not github_token:
console_print("GITHUB_TOKEN is not set! Issue generation will
fail.")
confirm_action("Do you want to continue?", abort=True)
- version_suffix = version[5:]
- version_branch = version[:3].replace(".", "-")
- version_without_rc = version[:5]
+
+ version_suffix = airflow_version.pre[0] + str(airflow_version.pre[1])
+ version_branch = str(airflow_version.release[0]) + "-" +
str(airflow_version.release[1])
+ version_without_rc = airflow_version.base_version
os.chdir(AIRFLOW_SOURCES_ROOT)
airflow_repo_root = os.getcwd()
@@ -343,20 +406,21 @@ def publish_release_candidate(version, previous_version,
github_token):
confirm_action("Pushes will be made to origin. Do you want to continue?",
abort=True)
# Merge the sync PR
merge_pr(version_branch)
-
- # Tag & clean the repo
+ #
+ # # Tag & clean the repo
git_tag(version)
git_clean()
- # Build the latest image
- if confirm_action("Build latest breeze image?"):
- run_command(["breeze", "ci-image", "build", "--python", "3.8"],
dry_run_override=DRY_RUN, check=True)
+ source_date_epoch = get_source_date_epoch()
+ shutil.rmtree(DIST_DIR, ignore_errors=True)
# Create the tarball
- tarball_release(version, version_without_rc)
+ tarball_release(
+ version=version, version_without_rc=version_without_rc,
source_date_epoch=source_date_epoch
+ )
# Create the artifacts
- if confirm_action("Use breeze to create artifacts?"):
- create_artifacts_with_breeze()
+ if confirm_action("Use docker to create artifacts?"):
+ create_artifacts_with_docker()
elif confirm_action("Use hatch to create artifacts?"):
- create_artifacts_with_sdist()
+ create_artifacts_with_hatch()
# Sign the release
sign_the_release(airflow_repo_root)
# Tag and push constraints
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 202ae1f682..5d132036e9 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -142,6 +142,7 @@ from airflow_breeze.utils.provider_dependencies import (
get_related_providers,
)
from airflow_breeze.utils.python_versions import get_python_version_list
+from airflow_breeze.utils.reproducible import get_source_date_epoch
from airflow_breeze.utils.run_utils import (
run_command,
)
@@ -284,6 +285,11 @@ AIRFLOW_BUILD_DOCKERFILE_IGNORE_PATH =
AIRFLOW_SOURCES_ROOT / "airflow-build-doc
name="prepare-airflow-package",
help="Prepare sdist/whl package of Airflow.",
)
[email protected](
+ "--use-local-hatch",
+ is_flag=True,
+ help="Use local hatch instead of docker to build the package. You need to
have hatch installed.",
+)
@option_package_format
@option_version_suffix_for_pypi
@option_verbose
@@ -291,10 +297,30 @@ AIRFLOW_BUILD_DOCKERFILE_IGNORE_PATH =
AIRFLOW_SOURCES_ROOT / "airflow-build-doc
def prepare_airflow_packages(
package_format: str,
version_suffix_for_pypi: str,
+ use_local_hatch: bool,
):
perform_environment_checks()
fix_ownership_using_docker()
cleanup_python_generated_files()
+ source_date_epoch = get_source_date_epoch()
+ if use_local_hatch:
+ hatch_build_command = ["hatch", "build", "-c", "-t", "custom"]
+ if package_format in ["sdist", "both"]:
+ hatch_build_command.extend(["-t", "sdist"])
+ if package_format in ["wheel", "both"]:
+ hatch_build_command.extend(["-t", "wheel"])
+ env_copy = os.environ.copy()
+ env_copy["SOURCE_DATE_EPOCH"] = str(source_date_epoch)
+ run_command(
+ hatch_build_command,
+ check=True,
+ env=env_copy,
+ )
+ get_console().print("[success]Successfully prepared Airflow packages:")
+ for file in sorted(DIST_DIR.glob("apache_airflow*")):
+ get_console().print(file.name)
+ get_console().print()
+ return
# This is security feature.
#
# Building the image needed to build airflow package including .git
directory
@@ -352,7 +378,10 @@ def prepare_airflow_packages(
# Copy all files in the dist directory in container to the host dist
directory (note '/.' in SRC)
run_command(["docker", "cp", f"{container_id}:/opt/airflow/dist/.",
"./dist"], check=True)
run_command(["docker", "rm", "--force", container_id], check=True)
- get_console().print("[success]Successfully prepared Airflow package!\n\n")
+ get_console().print("[success]Successfully prepared Airflow packages:")
+ for file in sorted(DIST_DIR.glob("apache_airflow*")):
+ get_console().print(file.name)
+ get_console().print()
def provider_action_summary(description: str, message_type: MessageType,
packages: list[str]):
diff --git
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index e6ddec7e16..b0b1bb96e0 100644
---
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -19,8 +19,9 @@ from __future__ import annotations
RELEASE_AIRFLOW_COMMANDS: dict[str, str | list[str]] = {
"name": "Airflow release commands",
"commands": [
- "prepare-airflow-package",
"create-minor-branch",
+ "prepare-airflow-package",
+ "prepare-airflow-tarball",
"start-rc-process",
"start-release",
"release-prod-images",
@@ -43,9 +44,10 @@ RELEASE_PROVIDERS_COMMANDS: dict[str, str | list[str]] = {
RELEASE_OTHER_COMMANDS: dict[str, str | list[str]] = {
"name": "Other release commands",
"commands": [
+ "add-back-references",
"publish-docs",
"generate-constraints",
- "add-back-references",
+ "update-constraints",
],
}
@@ -55,10 +57,19 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str
| list[str]]]] = {
"name": "Package flags",
"options": [
"--package-format",
+ "--use-local-hatch",
"--version-suffix-for-pypi",
],
}
],
+ "breeze release-management prepare-airflow-tarball": [
+ {
+ "name": "Package flags",
+ "options": [
+ "--version",
+ ],
+ }
+ ],
"breeze release-management verify-provider-packages": [
{
"name": "Provider verification flags",
diff --git a/dev/breeze/src/airflow_breeze/utils/reproducible.py
b/dev/breeze/src/airflow_breeze/utils/reproducible.py
new file mode 100644
index 0000000000..a85d871a3c
--- /dev/null
+++ b/dev/breeze/src/airflow_breeze/utils/reproducible.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python3
+
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Copyright 2013 The Servo Project Developers.
+# Copyright 2017 zerolib Developers.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
+
+# This command is a largely vendored-in script from
+# https://github.com/MuxZeroNet/reproducible/blob/master/reproducible.py
+from __future__ import annotations
+
+import contextlib
+import gzip
+import itertools
+import locale
+import os
+import tarfile
+from argparse import ArgumentParser
+
+from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT
+
+
+def get_source_date_epoch():
+ import yaml
+
+ reproducible_build_yaml = AIRFLOW_SOURCES_ROOT / "airflow" /
"reproducible_build.yaml"
+ reproducible_build_dict =
yaml.safe_load(reproducible_build_yaml.read_text())
+ source_date_epoch: int = reproducible_build_dict["source-date-epoch"]
+ return source_date_epoch
+
+
[email protected]
+def cd(new_path):
+ """Context manager for changing the current working directory"""
+ previous_path = os.getcwd()
+ try:
+ os.chdir(new_path)
+ yield
+ finally:
+ os.chdir(previous_path)
+
+
[email protected]
+def setlocale(name):
+ """Context manager for changing the current locale"""
+ saved_locale = locale.setlocale(locale.LC_ALL)
+ try:
+ yield locale.setlocale(locale.LC_ALL, name)
+ finally:
+ locale.setlocale(locale.LC_ALL, saved_locale)
+
+
+def archive_deterministically(dir_to_archive, dest_archive, prepend_path=None,
timestamp=0):
+ """Create a .tar.gz archive in a deterministic (reproducible) manner.
+
+ See https://reproducible-builds.org/docs/archives/ for more details."""
+
+ def reset(tarinfo):
+ """Helper to reset owner/group and modification time for tar entries"""
+ tarinfo.uid = tarinfo.gid = 0
+ tarinfo.uname = tarinfo.gname = "root"
+ tarinfo.mtime = timestamp
+ return tarinfo
+
+ dest_archive = os.path.abspath(dest_archive)
+ with cd(dir_to_archive):
+ current_dir = "."
+ file_list = [current_dir]
+ for root, dirs, files in os.walk(current_dir):
+ for name in itertools.chain(dirs, files):
+ file_list.append(os.path.join(root, name))
+
+ # Sort file entries with the fixed locale
+ with setlocale("C"):
+ file_list.sort(key=locale.strxfrm)
+
+ # Use a temporary file and atomic rename to avoid partially-formed
+ # packaging (in case of exceptional situations like running out of
disk space).
+ temp_file = f"{dest_archive}.temp~"
+ with os.fdopen(os.open(temp_file, os.O_WRONLY | os.O_CREAT, 0o644),
"wb") as out_file:
+ with gzip.GzipFile("wb", fileobj=out_file, mtime=0) as gzip_file:
+ with tarfile.open(fileobj=gzip_file, mode="w:") as tar_file:
+ for entry in file_list:
+ arcname = entry
+ if prepend_path is not None:
+ arcname =
os.path.normpath(os.path.join(prepend_path, arcname))
+ tar_file.add(entry, filter=reset, recursive=False,
arcname=arcname)
+ os.rename(temp_file, dest_archive)
+
+
+def main():
+ parser = ArgumentParser()
+ parser.add_argument("-d", "--dir", help="directory to archive")
+ parser.add_argument("-o", "--out", help="archive destination")
+ parser.add_argument("-p", "--prepend", help="prepend path")
+ parser.add_argument(
+ "-t", "--timestamp", help="timestamp of files", type=int,
default=get_source_date_epoch()
+ )
+
+ args = parser.parse_args()
+
+ if not args.dir or not args.out:
+ error = (
+ "You should provide a directory to archive, and the "
+ f"archive file name, not {repr((args.dir, args.out))}"
+ )
+ raise ValueError(error)
+
+ archive_deterministically(args.dir, args.out, args.prepend, args.timestamp)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/images/breeze/output_release-management.svg
b/images/breeze/output_release-management.svg
index f853a75b69..745601db24 100644
--- a/images/breeze/output_release-management.svg
+++ b/images/breeze/output_release-management.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 830.8"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 806.4"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -42,7 +42,7 @@
<defs>
<clipPath id="breeze-release-management-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="779.8" />
+ <rect x="0" y="0" width="1463.0" height="755.4" />
</clipPath>
<clipPath id="breeze-release-management-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -134,12 +134,9 @@
<clipPath id="breeze-release-management-line-29">
<rect x="0" y="709.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-line-30">
- <rect x="0" y="733.5" width="1464" height="24.65"/>
- </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="828.8" rx="8"/><text
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle"
x="740" y="27">Command: release-management</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="804.4" rx="8"/><text
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle"
x="740" y="27">Command: release-management</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -158,29 +155,28 @@
</text><text class="breeze-release-management-r5" x="0" y="166.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-6)">│</text><text
class="breeze-release-management-r4" x="24.4" y="166.4" textLength="12.2"
clip-path="url(#breeze-release-management-line-6)">-</text><text
class="breeze-release-management-r4" x="36.6" y="166.4" textLength="61"
clip-path="url(#breeze-release-management-line-6)">-help</text><text
class="breeze-release-management-r6" x="122" y="166.4" textLeng [...]
</text><text class="breeze-release-management-r5" x="0" y="190.8"
textLength="1464"
clip-path="url(#breeze-release-management-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-line-7)">
</text><text class="breeze-release-management-r5" x="0" y="215.2"
textLength="24.4"
clip-path="url(#breeze-release-management-line-8)">╭─</text><text
class="breeze-release-management-r5" x="24.4" y="215.2" textLength="317.2"
clip-path="url(#breeze-release-management-line-8)"> Airflow release commands </text><text
class="breeze-release-management-r5" x="341.6" y="215.2" textLength="1098"
clip-path="url(#breeze-release-management-line-8)">───────────────────────────────
[...]
-</text><text class="breeze-release-management-r5" x="0" y="239.6"
textLength="12.2"
clip-path="url(#breeze-release-management-line-9)">│</text><text
class="breeze-release-management-r4" x="24.4" y="239.6" textLength="353.8"
clip-path="url(#breeze-release-management-line-9)">prepare-airflow-package      </text><text
class="breeze-release-management-r1" x="402.6" y="239.6" textLength="1037"
clip-path="url(#breeze-release-management-line-9)">Prepare sdist/ [...]
-</text><text class="breeze-release-management-r5" x="0" y="264"
textLength="12.2"
clip-path="url(#breeze-release-management-line-10)">│</text><text
class="breeze-release-management-r4" x="24.4" y="264" textLength="353.8"
clip-path="url(#breeze-release-management-line-10)">create-minor-branch          </text><text
class="breeze-release-management-r1" x="402.6" y="264" textLength="1037"
clip-path="url(#breeze-release-management-line-10)">Cr [...]
-</text><text class="breeze-release-management-r5" x="0" y="288.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-11)">│</text><text
class="breeze-release-management-r4" x="24.4" y="288.4" textLength="353.8"
clip-path="url(#breeze-release-management-line-11)">start-rc-process             </text><text
class="breeze-release-management-r1" x="402.6" y="288.4" textLength="1037"
clip-path="url(#breeze-release-ma [...]
-</text><text class="breeze-release-management-r5" x="0" y="312.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-12)">│</text><text
class="breeze-release-management-r4" x="24.4" y="312.8" textLength="353.8"
clip-path="url(#breeze-release-management-line-12)">start-release                </text><text
class="breeze-release-management-r1" x="402.6" y="312.8" textLength="1037"
clip-path="url(#br [...]
-</text><text class="breeze-release-management-r5" x="0" y="337.2"
textLength="12.2"
clip-path="url(#breeze-release-management-line-13)">│</text><text
class="breeze-release-management-r4" x="24.4" y="337.2" textLength="353.8"
clip-path="url(#breeze-release-management-line-13)">release-prod-images          </text><text
class="breeze-release-management-r1" x="402.6" y="337.2" textLength="1037"
clip-path="url(#breeze-release-management-line-1 [...]
-</text><text class="breeze-release-management-r5" x="0" y="361.6"
textLength="1464"
clip-path="url(#breeze-release-management-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="361.6" textLength="12.2"
clip-path="url(#breeze-release-management-line-14)">
-</text><text class="breeze-release-management-r5" x="0" y="386"
textLength="24.4"
clip-path="url(#breeze-release-management-line-15)">╭─</text><text
class="breeze-release-management-r5" x="24.4" y="386" textLength="341.6"
clip-path="url(#breeze-release-management-line-15)"> Providers release commands </text><text
class="breeze-release-management-r5" x="366" y="386" textLength="1073.6"
clip-path="url(#breeze-release-management-line-15)">────────────────────────────────
[...]
-</text><text class="breeze-release-management-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-16)">│</text><text
class="breeze-release-management-r4" x="24.4" y="410.4" textLength="439.2"
clip-path="url(#breeze-release-management-line-16)">prepare-provider-documentation      </text><text
class="breeze-release-management-r1" x="488" y="410.4" textLength="951.6"
clip-path="url(#breeze-release-management-line-16)">Prepare [...]
-</text><text class="breeze-release-management-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-17)">│</text><text
class="breeze-release-management-r4" x="24.4" y="434.8" textLength="439.2"
clip-path="url(#breeze-release-management-line-17)">prepare-provider-packages           </text><text
class="breeze-release-management-r1" x="488" y="434.8" textLength="951.6"
clip-path="url(#breeze-release-manage [...]
-</text><text class="breeze-release-management-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-release-management-line-18)">│</text><text
class="breeze-release-management-r4" x="24.4" y="459.2" textLength="439.2"
clip-path="url(#breeze-release-management-line-18)">install-provider-packages           </text><text
class="breeze-release-management-r1" x="488" y="459.2" textLength="951.6"
clip-path="url(#breeze-release-manage [...]
-</text><text class="breeze-release-management-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-release-management-line-19)">│</text><text
class="breeze-release-management-r4" x="24.4" y="483.6" textLength="439.2"
clip-path="url(#breeze-release-management-line-19)">verify-provider-packages            </text><text
class="breeze-release-management-r1" x="488" y="483.6" textLength="951.6"
clip-path="url(#breeze-release-m [...]
-</text><text class="breeze-release-management-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-release-management-line-20)">│</text><text
class="breeze-release-management-r4" x="24.4" y="508" textLength="439.2"
clip-path="url(#breeze-release-management-line-20)">generate-providers-metadata         </text><text
class="breeze-release-management-r1" x="488" y="508" textLength="951.6"
clip-path="url(#breeze-release-management-line-20)">G [...]
-</text><text class="breeze-release-management-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-21)">│</text><text
class="breeze-release-management-r4" x="24.4" y="532.4" textLength="439.2"
clip-path="url(#breeze-release-management-line-21)">generate-issue-content-providers    </text><text
class="breeze-release-management-r1" x="488" y="532.4" textLength="951.6"
clip-path="url(#breeze-release-management-line-21)">Generates conte [...]
-</text><text class="breeze-release-management-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-22)">│</text><text
class="breeze-release-management-r4" x="24.4" y="556.8" textLength="439.2"
clip-path="url(#breeze-release-management-line-22)">clean-old-provider-artifacts        </text><text
class="breeze-release-management-r1" x="488" y="556.8" textLength="951.6"
clip-path="url(#breeze-release-management-line-22)"> [...]
-</text><text class="breeze-release-management-r5" x="0" y="581.2"
textLength="1464"
clip-path="url(#breeze-release-management-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="581.2" textLength="12.2"
clip-path="url(#breeze-release-management-line-23)">
-</text><text class="breeze-release-management-r5" x="0" y="605.6"
textLength="24.4"
clip-path="url(#breeze-release-management-line-24)">╭─</text><text
class="breeze-release-management-r5" x="24.4" y="605.6" textLength="292.8"
clip-path="url(#breeze-release-management-line-24)"> Other release commands </text><text
class="breeze-release-management-r5" x="317.2" y="605.6" textLength="1122.4"
clip-path="url(#breeze-release-management-line-24)">────────────────────────────
[...]
-</text><text class="breeze-release-management-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-release-management-line-25)">│</text><text
class="breeze-release-management-r4" x="24.4" y="630" textLength="280.6"
clip-path="url(#breeze-release-management-line-25)">publish-docs           </text><text
class="breeze-release-management-r1" x="329.4" y="630" textLength="1110.2"
clip-path="url(#breeze-release-management-line-25)">C [...]
-</text><text class="breeze-release-management-r5" x="0" y="654.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-26)">│</text><text
class="breeze-release-management-r4" x="24.4" y="654.4" textLength="280.6"
clip-path="url(#breeze-release-management-line-26)">generate-constraints   </text><text
class="breeze-release-management-r1" x="329.4" y="654.4" textLength="1110.2"
clip-path="url(#breeze-release-management-line-26)">Generates pinned constrai
[...]
-</text><text class="breeze-release-management-r5" x="0" y="678.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-27)">│</text><text
class="breeze-release-management-r4" x="24.4" y="678.8" textLength="280.6"
clip-path="url(#breeze-release-management-line-27)">add-back-references    </text><text
class="breeze-release-management-r1" x="329.4" y="678.8" textLength="1110.2"
clip-path="url(#breeze-release-management-line-27)">Command to add 
[...]
-</text><text class="breeze-release-management-r5" x="0" y="703.2"
textLength="1464"
clip-path="url(#breeze-release-management-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="703.2" textLength="12.2"
clip-path="url(#breeze-release-management-line-28)">
-</text><text class="breeze-release-management-r5" x="0" y="727.6"
textLength="24.4"
clip-path="url(#breeze-release-management-line-29)">╭─</text><text
class="breeze-release-management-r5" x="24.4" y="727.6" textLength="122"
clip-path="url(#breeze-release-management-line-29)"> Commands </text><text
class="breeze-release-management-r5" x="146.4" y="727.6" textLength="1293.2"
clip-path="url(#breeze-release-management-line-29)">──────────────────────────────────────────────────────
[...]
-</text><text class="breeze-release-management-r5" x="0" y="752"
textLength="12.2"
clip-path="url(#breeze-release-management-line-30)">│</text><text
class="breeze-release-management-r4" x="24.4" y="752" textLength="390.4"
clip-path="url(#breeze-release-management-line-30)">update-constraints              </text><text
class="breeze-release-management-r1" x="439.2" y="752" textLength="1000.4"
clip-path="url(#breeze-releas [...]
-</text><text class="breeze-release-management-r5" x="0" y="776.4"
textLength="1464"
clip-path="url(#breeze-release-management-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="776.4" textLength="12.2"
clip-path="url(#breeze-release-management-line-31)">
+</text><text class="breeze-release-management-r5" x="0" y="239.6"
textLength="12.2"
clip-path="url(#breeze-release-management-line-9)">│</text><text
class="breeze-release-management-r4" x="24.4" y="239.6" textLength="353.8"
clip-path="url(#breeze-release-management-line-9)">create-minor-branch          </text><text
class="breeze-release-management-r1" x="402.6" y="239.6" textLength="1037"
clip-path="url(#breeze-release-management-line-9)" [...]
+</text><text class="breeze-release-management-r5" x="0" y="264"
textLength="12.2"
clip-path="url(#breeze-release-management-line-10)">│</text><text
class="breeze-release-management-r4" x="24.4" y="264" textLength="353.8"
clip-path="url(#breeze-release-management-line-10)">prepare-airflow-package      </text><text
class="breeze-release-management-r1" x="402.6" y="264" textLength="1037"
clip-path="url(#breeze-release-management-line-10)">Prepare sdist/whl [...]
+</text><text class="breeze-release-management-r5" x="0" y="288.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-11)">│</text><text
class="breeze-release-management-r4" x="24.4" y="288.4" textLength="353.8"
clip-path="url(#breeze-release-management-line-11)">prepare-airflow-tarball      </text><text
class="breeze-release-management-r1" x="402.6" y="288.4" textLength="1037"
clip-path="url(#breeze-release-management-line-11)">Prepare air [...]
+</text><text class="breeze-release-management-r5" x="0" y="312.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-12)">│</text><text
class="breeze-release-management-r4" x="24.4" y="312.8" textLength="353.8"
clip-path="url(#breeze-release-management-line-12)">start-rc-process             </text><text
class="breeze-release-management-r1" x="402.6" y="312.8" textLength="1037"
clip-path="url(#breeze-release-ma [...]
+</text><text class="breeze-release-management-r5" x="0" y="337.2"
textLength="12.2"
clip-path="url(#breeze-release-management-line-13)">│</text><text
class="breeze-release-management-r4" x="24.4" y="337.2" textLength="353.8"
clip-path="url(#breeze-release-management-line-13)">start-release                </text><text
class="breeze-release-management-r1" x="402.6" y="337.2" textLength="1037"
clip-path="url(#br [...]
+</text><text class="breeze-release-management-r5" x="0" y="361.6"
textLength="12.2"
clip-path="url(#breeze-release-management-line-14)">│</text><text
class="breeze-release-management-r4" x="24.4" y="361.6" textLength="353.8"
clip-path="url(#breeze-release-management-line-14)">release-prod-images          </text><text
class="breeze-release-management-r1" x="402.6" y="361.6" textLength="1037"
clip-path="url(#breeze-release-management-line-1 [...]
+</text><text class="breeze-release-management-r5" x="0" y="386"
textLength="1464"
clip-path="url(#breeze-release-management-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="386" textLength="12.2"
clip-path="url(#breeze-release-management-line-15)">
+</text><text class="breeze-release-management-r5" x="0" y="410.4"
textLength="24.4"
clip-path="url(#breeze-release-management-line-16)">╭─</text><text
class="breeze-release-management-r5" x="24.4" y="410.4" textLength="341.6"
clip-path="url(#breeze-release-management-line-16)"> Providers release commands </text><text
class="breeze-release-management-r5" x="366" y="410.4" textLength="1073.6"
clip-path="url(#breeze-release-management-line-16)">──────────────────────────
[...]
+</text><text class="breeze-release-management-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-17)">│</text><text
class="breeze-release-management-r4" x="24.4" y="434.8" textLength="439.2"
clip-path="url(#breeze-release-management-line-17)">prepare-provider-documentation      </text><text
class="breeze-release-management-r1" x="488" y="434.8" textLength="951.6"
clip-path="url(#breeze-release-management-line-17)">Prepare [...]
+</text><text class="breeze-release-management-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-release-management-line-18)">│</text><text
class="breeze-release-management-r4" x="24.4" y="459.2" textLength="439.2"
clip-path="url(#breeze-release-management-line-18)">prepare-provider-packages           </text><text
class="breeze-release-management-r1" x="488" y="459.2" textLength="951.6"
clip-path="url(#breeze-release-manage [...]
+</text><text class="breeze-release-management-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-release-management-line-19)">│</text><text
class="breeze-release-management-r4" x="24.4" y="483.6" textLength="439.2"
clip-path="url(#breeze-release-management-line-19)">install-provider-packages           </text><text
class="breeze-release-management-r1" x="488" y="483.6" textLength="951.6"
clip-path="url(#breeze-release-manage [...]
+</text><text class="breeze-release-management-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-release-management-line-20)">│</text><text
class="breeze-release-management-r4" x="24.4" y="508" textLength="439.2"
clip-path="url(#breeze-release-management-line-20)">verify-provider-packages            </text><text
class="breeze-release-management-r1" x="488" y="508" textLength="951.6"
clip-path="url(#breeze-release-managem [...]
+</text><text class="breeze-release-management-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-21)">│</text><text
class="breeze-release-management-r4" x="24.4" y="532.4" textLength="439.2"
clip-path="url(#breeze-release-management-line-21)">generate-providers-metadata         </text><text
class="breeze-release-management-r1" x="488" y="532.4" textLength="951.6"
clip-path="url(#breeze-release-management-line- [...]
+</text><text class="breeze-release-management-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-22)">│</text><text
class="breeze-release-management-r4" x="24.4" y="556.8" textLength="439.2"
clip-path="url(#breeze-release-management-line-22)">generate-issue-content-providers    </text><text
class="breeze-release-management-r1" x="488" y="556.8" textLength="951.6"
clip-path="url(#breeze-release-management-line-22)">Generates conte [...]
+</text><text class="breeze-release-management-r5" x="0" y="581.2"
textLength="12.2"
clip-path="url(#breeze-release-management-line-23)">│</text><text
class="breeze-release-management-r4" x="24.4" y="581.2" textLength="439.2"
clip-path="url(#breeze-release-management-line-23)">clean-old-provider-artifacts        </text><text
class="breeze-release-management-r1" x="488" y="581.2" textLength="951.6"
clip-path="url(#breeze-release-management-line-23)"> [...]
+</text><text class="breeze-release-management-r5" x="0" y="605.6"
textLength="1464"
clip-path="url(#breeze-release-management-line-24)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="605.6" textLength="12.2"
clip-path="url(#breeze-release-management-line-24)">
+</text><text class="breeze-release-management-r5" x="0" y="630"
textLength="24.4"
clip-path="url(#breeze-release-management-line-25)">╭─</text><text
class="breeze-release-management-r5" x="24.4" y="630" textLength="292.8"
clip-path="url(#breeze-release-management-line-25)"> Other release commands </text><text
class="breeze-release-management-r5" x="317.2" y="630" textLength="1122.4"
clip-path="url(#breeze-release-management-line-25)">──────────────────────────────────
[...]
+</text><text class="breeze-release-management-r5" x="0" y="654.4"
textLength="12.2"
clip-path="url(#breeze-release-management-line-26)">│</text><text
class="breeze-release-management-r4" x="24.4" y="654.4" textLength="280.6"
clip-path="url(#breeze-release-management-line-26)">add-back-references    </text><text
class="breeze-release-management-r1" x="329.4" y="654.4" textLength="1110.2"
clip-path="url(#breeze-release-management-line-26)">Command to add 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="678.8"
textLength="12.2"
clip-path="url(#breeze-release-management-line-27)">│</text><text
class="breeze-release-management-r4" x="24.4" y="678.8" textLength="280.6"
clip-path="url(#breeze-release-management-line-27)">publish-docs           </text><text
class="breeze-release-management-r1" x="329.4" y="678.8" textLength="1110.2"
clip-path="url(#breeze-release-management-line- [...]
+</text><text class="breeze-release-management-r5" x="0" y="703.2"
textLength="12.2"
clip-path="url(#breeze-release-management-line-28)">│</text><text
class="breeze-release-management-r4" x="24.4" y="703.2" textLength="280.6"
clip-path="url(#breeze-release-management-line-28)">generate-constraints   </text><text
class="breeze-release-management-r1" x="329.4" y="703.2" textLength="1110.2"
clip-path="url(#breeze-release-management-line-28)">Generates pinned constrai
[...]
+</text><text class="breeze-release-management-r5" x="0" y="727.6"
textLength="12.2"
clip-path="url(#breeze-release-management-line-29)">│</text><text
class="breeze-release-management-r4" x="24.4" y="727.6" textLength="280.6"
clip-path="url(#breeze-release-management-line-29)">update-constraints     </text><text
class="breeze-release-management-r1" x="329.4" y="727.6" textLength="1110.2"
clip-path="url(#breeze-release-management-line-29)">Update released 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="752"
textLength="1464"
clip-path="url(#breeze-release-management-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-r1" x="1464" y="752" textLength="12.2"
clip-path="url(#breeze-release-management-line-30)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management.txt
b/images/breeze/output_release-management.txt
index a0e84e6bf9..81a7a34a0e 100644
--- a/images/breeze/output_release-management.txt
+++ b/images/breeze/output_release-management.txt
@@ -1 +1 @@
-f4edc0671c6ceb04d81e936f600ba8c4
+531a745e860b739dd3e802e594db6e7e
diff --git
a/images/breeze/output_release-management_prepare-airflow-package.svg
b/images/breeze/output_release-management_prepare-airflow-package.svg
index c8490f5700..8ee42db614 100644
--- a/images/breeze/output_release-management_prepare-airflow-package.svg
+++ b/images/breeze/output_release-management_prepare-airflow-package.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 391.59999999999997"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 440.4"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath
id="breeze-release-management-prepare-airflow-package-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="340.59999999999997" />
+ <rect x="0" y="0" width="1463.0" height="389.4" />
</clipPath>
<clipPath id="breeze-release-management-prepare-airflow-package-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -84,9 +84,15 @@
<clipPath id="breeze-release-management-prepare-airflow-package-line-12">
<rect x="0" y="294.3" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-package-line-13">
+ <rect x="0" y="318.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-package-line-14">
+ <rect x="0" y="343.1" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="389.6" rx="8"/><text
class="breeze-release-management-prepare-airflow-package-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: release-management prepare-airflow-package</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="438.4" rx="8"/><text
class="breeze-release-management-prepare-airflow-package-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: release-management prepare-airflow-package</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -103,13 +109,15 @@
</text><text class="breeze-release-management-prepare-airflow-package-r1"
x="1464" y="117.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-4)">
</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="142" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-5)">╭─</text><text
class="breeze-release-management-prepare-airflow-package-r5" x="24.4" y="142"
textLength="183"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-5)"> Package flags </text><text
class="breeze-release-management-prepare-airflow-package-r5" x="207.4" y="142"
text [...]
</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="166.4" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-6)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="166.4" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-6)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="166.4" textLength="97.6" clip-path= [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="190.8" textLength="97.6" clip-path= [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="215.2" textLength="1464"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-prepare-airflow-package-r1" x="1464"
y="215.2" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">
-</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="239.6" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)">╭─</text><text
class="breeze-release-management-prepare-airflow-package-r5" x="24.4"
y="239.6" textLength="195.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)"> Common options </text><text
class="breeze-release-management-prepare-airflow-package-r5" x="219.6" y="23
[...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="264" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4" y="264"
textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6" y="264"
textLength="97.6" clip-path="url [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="288.4" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="288.4" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="288.4" textLength="48.8" clip-pat [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="312.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="312.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="312.8" textLength="61" clip-path= [...]
-</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="337.2" textLength="1464"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-prepare-airflow-package-r1" x="1464"
y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-7)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="190.8" textLength="48.8" clip-path= [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="215.2" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">│</text><text
class="breeze-release-management-prepare-airflow-package-r1" x="378.2"
y="215.2" textLength="1061.4"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-8)">installed.                  &
[...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="239.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="239.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-9)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="239.6" textLength="97.6" clip-path= [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="264" textLength="1464"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-prepare-airflow-package-r1" x="1464" y="264"
textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-10)">
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="288.4" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)">╭─</text><text
class="breeze-release-management-prepare-airflow-package-r5" x="24.4"
y="288.4" textLength="195.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-11)"> Common options </text><text
class="breeze-release-management-prepare-airflow-package-r5" x="219.6" y="
[...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="312.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="312.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-12)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="312.8" textLength="97.6" clip-pat [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="337.2" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-13)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="337.2" textLength="48.8" clip-pat [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="361.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-14)">│</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="24.4"
y="361.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-14)">-</text><text
class="breeze-release-management-prepare-airflow-package-r4" x="36.6"
y="361.6" textLength="61" clip-path= [...]
+</text><text class="breeze-release-management-prepare-airflow-package-r5"
x="0" y="386" textLength="1464"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-15)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-prepare-airflow-package-r1" x="1464" y="386"
textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-package-line-15)">
</text>
</g>
</g>
diff --git
a/images/breeze/output_release-management_prepare-airflow-package.txt
b/images/breeze/output_release-management_prepare-airflow-package.txt
index f295947476..315a3f647a 100644
--- a/images/breeze/output_release-management_prepare-airflow-package.txt
+++ b/images/breeze/output_release-management_prepare-airflow-package.txt
@@ -1 +1 @@
-8f786828b9862f9ae63f1b691921979f
+92215dd76f7de9837fa03e88324d4be7
diff --git
a/images/breeze/output_release-management_prepare-airflow-tarball.svg
b/images/breeze/output_release-management_prepare-airflow-tarball.svg
new file mode 100644
index 0000000000..5a982d348d
--- /dev/null
+++ b/images/breeze/output_release-management_prepare-airflow-tarball.svg
@@ -0,0 +1,106 @@
+<svg class="rich-terminal" viewBox="0 0 1482 318.4"
xmlns="http://www.w3.org/2000/svg">
+ <!-- Generated with Rich https://www.textualize.io -->
+ <style>
+
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Regular"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2")
format("woff2"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff")
format("woff");
+ font-style: normal;
+ font-weight: 400;
+ }
+ @font-face {
+ font-family: "Fira Code";
+ src: local("FiraCode-Bold"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2")
format("woff2"),
+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff")
format("woff");
+ font-style: bold;
+ font-weight: 700;
+ }
+
+ .breeze-release-management-prepare-airflow-tarball-matrix {
+ font-family: Fira Code, monospace;
+ font-size: 20px;
+ line-height: 24.4px;
+ font-variant-east-asian: full-width;
+ }
+
+ .breeze-release-management-prepare-airflow-tarball-title {
+ font-size: 18px;
+ font-weight: bold;
+ font-family: arial;
+ }
+
+ .breeze-release-management-prepare-airflow-tarball-r1 { fill: #c5c8c6 }
+.breeze-release-management-prepare-airflow-tarball-r2 { fill: #d0b344 }
+.breeze-release-management-prepare-airflow-tarball-r3 { fill:
#c5c8c6;font-weight: bold }
+.breeze-release-management-prepare-airflow-tarball-r4 { fill:
#68a0b3;font-weight: bold }
+.breeze-release-management-prepare-airflow-tarball-r5 { fill: #868887 }
+.breeze-release-management-prepare-airflow-tarball-r6 { fill: #cc555a }
+.breeze-release-management-prepare-airflow-tarball-r7 { fill: #8d7b39 }
+.breeze-release-management-prepare-airflow-tarball-r8 { fill: #8a4346 }
+.breeze-release-management-prepare-airflow-tarball-r9 { fill:
#98a84b;font-weight: bold }
+ </style>
+
+ <defs>
+ <clipPath
id="breeze-release-management-prepare-airflow-tarball-clip-terminal">
+ <rect x="0" y="0" width="1463.0" height="267.4" />
+ </clipPath>
+ <clipPath id="breeze-release-management-prepare-airflow-tarball-line-0">
+ <rect x="0" y="1.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-1">
+ <rect x="0" y="25.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-2">
+ <rect x="0" y="50.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-3">
+ <rect x="0" y="74.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-4">
+ <rect x="0" y="99.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-5">
+ <rect x="0" y="123.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-6">
+ <rect x="0" y="147.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-7">
+ <rect x="0" y="172.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-8">
+ <rect x="0" y="196.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-release-management-prepare-airflow-tarball-line-9">
+ <rect x="0" y="221.1" width="1464" height="24.65"/>
+ </clipPath>
+ </defs>
+
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="316.4" rx="8"/><text
class="breeze-release-management-prepare-airflow-tarball-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: release-management prepare-airflow-tarball</text>
+ <g transform="translate(26,22)">
+ <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+ <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+ <circle cx="44" cy="0" r="7" fill="#28c840"/>
+ </g>
+
+ <g transform="translate(9, 41)"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-clip-terminal)">
+
+ <g class="breeze-release-management-prepare-airflow-tarball-matrix">
+ <text class="breeze-release-management-prepare-airflow-tarball-r1"
x="1464" y="20" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-0)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r2"
x="12.2" y="44.4" textLength="73.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-1)">Usage:</text><text
class="breeze-release-management-prepare-airflow-tarball-r3" x="97.6" y="44.4"
textLength="597.8"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-1)">breeze release-management prepare-airflow-tarball</text><text
class="breeze-release-management-prepare-ai [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r1"
x="1464" y="68.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-2)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r1"
x="12.2" y="93.2" textLength="402.6"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">Prepare airflow's source tarball.</text><text
class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="93.2"
textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-3)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r1"
x="1464" y="117.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-4)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5"
x="0" y="142" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-5)">╭─</text><text
class="breeze-release-management-prepare-airflow-tarball-r5" x="24.4" y="142"
textLength="183"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-5)"> Package flags </text><text
class="breeze-release-management-prepare-airflow-tarball-r5" x="207.4" y="142"
text [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5"
x="0" y="166.4" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-6)">│</text><text
class="breeze-release-management-prepare-airflow-tarball-r6" x="24.4"
y="166.4" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-6)">*</text><text
class="breeze-release-management-prepare-airflow-tarball-r4" x="61" y="166.4"
textLength="12.2" clip-path="u [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5"
x="0" y="190.8" textLength="1464"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-prepare-airflow-tarball-r1" x="1464"
y="190.8" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-7)">
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5"
x="0" y="215.2" textLength="24.4"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)">╭─</text><text
class="breeze-release-management-prepare-airflow-tarball-r5" x="24.4"
y="215.2" textLength="195.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-8)"> Common options </text><text
class="breeze-release-management-prepare-airflow-tarball-r5" x="219.6" y="21
[...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5"
x="0" y="239.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">│</text><text
class="breeze-release-management-prepare-airflow-tarball-r4" x="24.4"
y="239.6" textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-9)">-</text><text
class="breeze-release-management-prepare-airflow-tarball-r4" x="36.6"
y="239.6" textLength="61" clip-path="u [...]
+</text><text class="breeze-release-management-prepare-airflow-tarball-r5"
x="0" y="264" textLength="1464"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-release-management-prepare-airflow-tarball-r1" x="1464" y="264"
textLength="12.2"
clip-path="url(#breeze-release-management-prepare-airflow-tarball-line-10)">
+</text>
+ </g>
+ </g>
+</svg>
diff --git
a/images/breeze/output_release-management_prepare-airflow-tarball.txt
b/images/breeze/output_release-management_prepare-airflow-tarball.txt
new file mode 100644
index 0000000000..12bc4ebe94
--- /dev/null
+++ b/images/breeze/output_release-management_prepare-airflow-tarball.txt
@@ -0,0 +1 @@
+7cf8b45e0b23837e8bf99d5a4907d48c
diff --git a/images/breeze/output_setup_check-all-params-in-groups.svg
b/images/breeze/output_setup_check-all-params-in-groups.svg
index f8b7ce58c0..05beab1bb3 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.svg
+++ b/images/breeze/output_setup_check-all-params-in-groups.svg
@@ -170,16 +170,16 @@
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="361.6" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="361.6"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">release-management:clean-old-provider-artifacts | release-management:create-minor-branch |         
[...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="386"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">release-management:generate-constraints | release-management:generate-issue-content-providers |        </tex
[...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="410.4" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="410.4"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:generate-providers-metadata | release-management:install-provider-packages |        <
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="434.8"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:prepare-airflow-package | release-management:prepare-provider-documentation |       </text
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="459.2"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:prepare-provider-packages | release-management:publish-docs |          
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="483.6" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="483.6"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:release-prod-images | release-management:start-rc-process |           
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="508"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:start-release | release-management:update-constraints |            &#
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="532.4" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="532.4"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:verify-provider-packages | sbom | sbom:build-all-airflow-images |        &#
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="556.8" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="556.8"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">sbom:generate-providers-requirements | sbom:update-sbom-information | setup | setup:autocomplete |    &#
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="581.2" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="581.2"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images | setup:self-upgrade </text><text
class="b [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="605.6" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="605.6"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">| setup:synchronize-local-mounts | setup:version | shell | start-airflow | static-checks | testing 
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="630"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">testing:db-tests | testing:docker-compose-tests | testing:helm-tests | testing:integration-tests |     
[...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="654.4" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="654.4"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">testing:non-db-tests | testing:tests)                  
[...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="434.8" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="434.8"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:prepare-airflow-package | release-management:prepare-airflow-tarball |         &
[...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="459.2" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="459.2"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:prepare-provider-documentation | release-management:prepare-provider-packages |     </text><text
cla [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="483.6" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="483.6"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:publish-docs | release-management:release-prod-images |           
[...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="508"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:start-rc-process | release-management:start-release |            
[...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="532.4" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="532.4"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:update-constraints | release-management:verify-provider-packages | sbom |       
[...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="556.8" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="556.8"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">sbom:build-all-airflow-images | sbom:generate-providers-requirements | sbom:update-sbom-information |  </text><text
class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="581.2" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="581.2"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">setup | setup:autocomplete | setup:check-all-params-in-groups | setup:config |       
[...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="605.6" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="605.6"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-24)">setup:regenerate-command-images | setup:self-upgrade | setup:synchronize-local-mounts | setup:version |</text><text
class="b [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="630"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-25)">shell | start-airflow | static-checks | testing | testing:db-tests | testing:docker-compose-tests | 
[...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="654.4" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">│</text><text
class="breeze-setup-check-all-params-in-groups-r6" x="183" y="654.4"
textLength="1256.6"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-26)">testing:helm-tests | testing:integration-tests | testing:non-db-tests | testing:tests)       &
[...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="678.8" textLength="1464"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="678.8"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-27)">
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="703.2" textLength="24.4"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)">╭─</text><text
class="breeze-setup-check-all-params-in-groups-r5" x="24.4" y="703.2"
textLength="195.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-28)"> Common options </text><text
class="breeze-setup-check-all-params-in-groups-r5" x="219.6" y="703.2"
textLength="1220" clip-path="url(#breeze-se [...]
</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0"
y="727.6" textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">│</text><text
class="breeze-setup-check-all-params-in-groups-r4" x="24.4" y="727.6"
textLength="12.2"
clip-path="url(#breeze-setup-check-all-params-in-groups-line-29)">-</text><text
class="breeze-setup-check-all-params-in-groups-r4" x="36.6" y="727.6"
textLength="97.6" clip-path="url(#breeze-setup-check-all-params-in-groups-li
[...]
diff --git a/images/breeze/output_setup_check-all-params-in-groups.txt
b/images/breeze/output_setup_check-all-params-in-groups.txt
index a785973bff..243d3eca55 100644
--- a/images/breeze/output_setup_check-all-params-in-groups.txt
+++ b/images/breeze/output_setup_check-all-params-in-groups.txt
@@ -1 +1 @@
-ff7ba7e2ad2a27deacc72227a3584b6b
+69ae9158510708ca0793c715a62368b2
diff --git a/images/breeze/output_setup_regenerate-command-images.svg
b/images/breeze/output_setup_regenerate-command-images.svg
index 5057857969..fc59c7c211 100644
--- a/images/breeze/output_setup_regenerate-command-images.svg
+++ b/images/breeze/output_setup_regenerate-command-images.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 928.4"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 952.8"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-setup-regenerate-command-images-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="877.4" />
+ <rect x="0" y="0" width="1463.0" height="901.8" />
</clipPath>
<clipPath id="breeze-setup-regenerate-command-images-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -150,9 +150,12 @@
<clipPath id="breeze-setup-regenerate-command-images-line-34">
<rect x="0" y="831.1" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-setup-regenerate-command-images-line-35">
+ <rect x="0" y="855.5" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="926.4" rx="8"/><text
class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: setup regenerate-command-images</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="950.8" rx="8"/><text
class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: setup regenerate-command-images</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -180,24 +183,25 @@
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="386"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-15)">release-management:clean-old-provider-artifacts | release-management:create-minor-branch |          </
[...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="410.4"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-16)">release-management:generate-constraints | release-management:generate-issue-content-providers |     </text><text
class="bre [...]
</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="434.8"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:generate-providers-metadata | release-management:install-provider-packages |     </text><text
class="bre [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="459.2"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:prepare-airflow-package | release-management:prepare-provider-documentation |    </text><text
class="breeze-s [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="483.6"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:prepare-provider-packages | release-management:publish-docs |           &#
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="508"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">release-management:release-prod-images | release-management:start-rc-process |            &#
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="532.4"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management:start-release | release-management:update-constraints |            &#
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="556.8"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">release-management:verify-provider-packages | sbom | sbom:build-all-airflow-images |         
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="581.2"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">sbom:generate-providers-requirements | sbom:update-sbom-information | setup | setup:autocomplete |  </text><text
class [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="605.6"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">setup:check-all-params-in-groups | setup:config | setup:regenerate-command-images |         &
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="630"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">setup:self-upgrade | setup:synchronize-local-mounts | setup:version | shell | start-airflow |     
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="654.4"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">static-checks | testing | testing:db-tests | testing:docker-compose-tests | testing:helm-tests |   
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="678.8"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">testing:integration-tests | testing:non-db-tests | testing:tests)             
[...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="703.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="703.2"
textLength="73.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-28) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">│</text><text
class="breeze-setup-regenerate-command-images-r1" x="219.6" y="727.6"
textLength="170.8"
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">together with </text><text
class="breeze-setup-regenerate-command-images-r4" x="390.4" y="727.6"
textLength="12.2" clip-path="url(#breeze-setup-regenera [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752"
textLength="1464"
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-setup-regenerate-command-images-r1" x="1464" y="752"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4"
textLength="24.4"
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">╭─</text><text
class="breeze-setup-regenerate-command-images-r5" x="24.4" y="776.4"
textLength="195.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-31)"> Common options </text><text
class="breeze-setup-regenerate-command-images-r5" x="219.6" y="776.4"
textLength="1220" clip-path="url(#breeze-setup-r [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="800.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="800.8"
textLength="97.6"
clip-path="url(#breeze-setup-regenerate-command-images-line-32) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="825.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="825.2"
textLength="48.8"
clip-path="url(#breeze-setup-regenerate-command-images-line-33) [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="849.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="849.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="849.6"
textLength="61"
clip-path="url(#breeze-setup-regenerate-command-images-line-34)"> [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="874"
textLength="1464"
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-setup-regenerate-command-images-r1" x="1464" y="874"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="459.2"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:prepare-airflow-package | release-management:prepare-airflow-tarball |          
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="483.6"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:prepare-provider-documentation | release-management:prepare-provider-packages |  </text><text
class="breeze-setup-regen [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="508"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">release-management:publish-docs | release-management:release-prod-images |             
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="532.4"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management:start-rc-process | release-management:start-release |            
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="556.8"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">release-management:update-constraints | release-management:verify-provider-packages | sbom |       
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="581.2"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">sbom:build-all-airflow-images | sbom:generate-providers-requirements | sbom:update-sbom-information </text><text
class="breeze-setup-regen [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="605.6"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">| setup | setup:autocomplete | setup:check-all-params-in-groups | setup:config |       &
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="630"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">setup:regenerate-command-images | setup:self-upgrade | setup:synchronize-local-mounts |         &
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="654.4"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">setup:version | shell | start-airflow | static-checks | testing | testing:db-tests |    
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="678.8"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">testing:docker-compose-tests | testing:helm-tests | testing:integration-tests | testing:non-db-tests</text><text
class="breeze-setup- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text
class="breeze-setup-regenerate-command-images-r6" x="219.6" y="703.2"
textLength="1220"
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">| testing:tests)                       
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="727.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="727.6"
textLength="73.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-29) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">│</text><text
class="breeze-setup-regenerate-command-images-r1" x="219.6" y="752"
textLength="170.8"
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">together with </text><text
class="breeze-setup-regenerate-command-images-r4" x="390.4" y="752"
textLength="12.2" clip-path="url(#breeze-setup-regenerate-com [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4"
textLength="1464"
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-setup-regenerate-command-images-r1" x="1464" y="776.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8"
textLength="24.4"
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">╭─</text><text
class="breeze-setup-regenerate-command-images-r5" x="24.4" y="800.8"
textLength="195.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-32)"> Common options </text><text
class="breeze-setup-regenerate-command-images-r5" x="219.6" y="800.8"
textLength="1220" clip-path="url(#breeze-setup-r [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="825.2"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="825.2"
textLength="97.6"
clip-path="url(#breeze-setup-regenerate-command-images-line-33) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="849.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="849.6"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="849.6"
textLength="48.8"
clip-path="url(#breeze-setup-regenerate-command-images-line-34) [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="874"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">│</text><text
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="874"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">-</text><text
class="breeze-setup-regenerate-command-images-r4" x="36.6" y="874"
textLength="61"
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">-help< [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="898.4"
textLength="1464"
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-setup-regenerate-command-images-r1" x="1464" y="898.4"
textLength="12.2"
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">
</text>
</g>
</g>
diff --git a/images/breeze/output_setup_regenerate-command-images.txt
b/images/breeze/output_setup_regenerate-command-images.txt
index c1fea28696..87d87112ba 100644
--- a/images/breeze/output_setup_regenerate-command-images.txt
+++ b/images/breeze/output_setup_regenerate-command-images.txt
@@ -1 +1 @@
-2dd686ef33844512aed7032351111991
+4f1d4b74c81fd81e8c6f32ec137ff480
diff --git a/scripts/in_container/run_prepare_airflow_packages.py
b/scripts/in_container/run_prepare_airflow_packages.py
index 66aae93ca4..9305d0dbd4 100755
--- a/scripts/in_container/run_prepare_airflow_packages.py
+++ b/scripts/in_container/run_prepare_airflow_packages.py
@@ -77,11 +77,10 @@ def get_current_airflow_version() -> str:
def build_airflow_packages(package_format: str):
build_command = [sys.executable, "-m", "hatch", "build", "-t", "custom"]
-
- if package_format in ["both", "wheel"]:
- build_command.extend(["-t", "wheel"])
if package_format in ["both", "sdist"]:
build_command.extend(["-t", "sdist"])
+ if package_format in ["both", "wheel"]:
+ build_command.extend(["-t", "wheel"])
reproducible_date =
yaml.safe_load(REPRODUCIBLE_BUILD_FILE.read_text())["source-date-epoch"]