You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2023/12/10 15:07:17 UTC
(airflow) branch main updated: Unify how docker commands get executed in Breeze (#36131)
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 2d15dbfe18 Unify how docker commands get executed in Breeze (#36131)
2d15dbfe18 is described below
commit 2d15dbfe18f3eab0fbedb32af8e527bcf753f442
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sun Dec 10 16:07:06 2023 +0100
Unify how docker commands get executed in Breeze (#36131)
So far we executed commands in CI image in breeze in two ways:
* entering the shell (which runs docker-compose under the hood)
* running `docker run` with the CI image
This requires rather complex mapping of environment variables
between `docker-compose` and `docker`. Since recently (#35862)
we can use `shell` command to run commands in very similar way
as docker run (with docker-compose, without database and extra
components - just using the same `breeze shell` mechanisms.
This PR converts all the usages of docker run CI_IMAGE we had
and converts them to use modified `enter_shell` method that has
been moved to "docker_command_utils". This also simplified
passing arguments to the "enter_shell" command - no longer need
to filter out none parameters and **kwargs - all parameters are
passed explicitly.
This also allowed to remove some of the code (extracting args,
filtering_out_none) that are not used anymore.
The entypoint CI has been slightly refactored - to provide
a bit better structure and handle `--skip-environment-initialization`
better - we can now both set `--use-airflow-version` and
`--skip-environment-initialization` which was not possible
before.
---
Dockerfile.ci | 122 +++++-----
.../airflow_breeze/commands/developer_commands.py | 168 ++------------
.../commands/release_management_commands.py | 156 +++----------
.../commands/release_management_commands_config.py | 3 -
dev/breeze/src/airflow_breeze/global_constants.py | 5 +-
.../src/airflow_breeze/params/shell_params.py | 33 ++-
.../src/airflow_breeze/utils/common_options.py | 3 +
.../airflow_breeze/utils/docker_command_utils.py | 255 +++++++++++++++++----
dev/breeze/src/airflow_breeze/utils/path_utils.py | 6 +
dev/breeze/src/airflow_breeze/utils/run_utils.py | 5 -
dev/breeze/tests/test_commands.py | 55 -----
dev/breeze/tests/test_run_utils.py | 8 -
images/breeze/output_ci-image_build.txt | 2 +-
images/breeze/output_prod-image_build.txt | 2 +-
...put_release-management_generate-constraints.svg | 44 ++--
...put_release-management_generate-constraints.txt | 2 +-
...elease-management_install-provider-packages.svg | 110 +++++----
...elease-management_install-provider-packages.txt | 2 +-
...release-management_verify-provider-packages.svg | 92 ++++----
...release-management_verify-provider-packages.txt | 2 +-
images/breeze/output_shell.svg | 86 +++----
images/breeze/output_shell.txt | 2 +-
images/breeze/output_start-airflow.txt | 2 +-
...ve-sources.yml => backend-sqlite-no-volume.yml} | 13 +-
scripts/ci/docker-compose/remove-sources.yml | 4 +-
scripts/docker/entrypoint_ci.sh | 136 ++++++-----
.../in_container/install_airflow_and_providers.py | 19 +-
27 files changed, 607 insertions(+), 730 deletions(-)
diff --git a/Dockerfile.ci b/Dockerfile.ci
index b569c47e41..845a1c8f44 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -710,7 +710,7 @@ PYTHON_MAJOR_MINOR_VERSION=${PYTHON_MAJOR_MINOR_VERSION:=3.8}
export AIRFLOW_HOME=${AIRFLOW_HOME:=${HOME}}
-: "${AIRFLOW_SOURCES:?"ERROR: AIRFLOW_SOURCES not set !!!!"}"
+mkdir "${AIRFLOW_HOME}/sqlite" -p || true
ASSET_COMPILATION_WAIT_MULTIPLIER=${ASSET_COMPILATION_WAIT_MULTIPLIER:=1}
@@ -755,8 +755,10 @@ If it does not complete soon, you might want to stop it and remove file lock:
fi
}
-if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
-
+function environment_initialization() {
+ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} == "true" ]]; then
+ return
+ fi
if [[ $(uname -m) == "arm64" || $(uname -m) == "aarch64" ]]; then
if [[ ${BACKEND:=} == "mssql" ]]; then
echo "${COLOR_RED}ARM platform is not supported for ${BACKEND} backend. Exiting.${COLOR_RESET}"
@@ -778,6 +780,7 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
echo
export AIRFLOW__SCHEDULER__STANDALONE_DAG_PROCESSOR=True
fi
+
if [[ ${DATABASE_ISOLATION=} == "true" ]]; then
echo "${COLOR_BLUE}Force database isolation configuration:${COLOR_RESET}"
export AIRFLOW__CORE__DATABASE_ACCESS_ISOLATION=True
@@ -787,33 +790,10 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
RUN_TESTS=${RUN_TESTS:="false"}
CI=${CI:="false"}
- USE_AIRFLOW_VERSION="${USE_AIRFLOW_VERSION:=""}"
-
- if [[ ${USE_AIRFLOW_VERSION} == "" && ${USE_PACKAGES_FROM_DIST=} != "true" ]]; then
- export PYTHONPATH=${AIRFLOW_SOURCES}
- echo
- echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
- echo
- # Cleanup the logs, tmp when entering the environment
- sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
- sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
- mkdir -p "${AIRFLOW_SOURCES}"/logs/
- mkdir -p "${AIRFLOW_SOURCES}"/tmp/
- else
- python "${IN_CONTAINER_DIR}/install_airflow_and_providers.py"
- fi
-
- if [[ "${USE_AIRFLOW_VERSION}" =~ ^2\.2\..*|^2\.1\..*|^2\.0\..* && "${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=}" != "" ]]; then
- # make sure old variable is used for older airflow versions
- export AIRFLOW__CORE__SQL_ALCHEMY_CONN="${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN}"
- fi
# Added to have run-tests on path
export PATH=${PATH}:${AIRFLOW_SOURCES}
- # This is now set in conftest.py - only for pytest tests
- unset AIRFLOW__CORE__UNIT_TEST_MODE
-
mkdir -pv "${AIRFLOW_HOME}/logs/"
# Change the default worker_concurrency for tests
@@ -869,54 +849,86 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
# shellcheck source=scripts/in_container/bin/run_tmux
exec run_tmux
fi
-fi
+}
+
+function determine_airflow_to_use() {
+ USE_AIRFLOW_VERSION="${USE_AIRFLOW_VERSION:=""}"
+ if [[ ${USE_AIRFLOW_VERSION} == "" && ${USE_PACKAGES_FROM_DIST=} != "true" ]]; then
+ export PYTHONPATH=${AIRFLOW_SOURCES}
+ echo
+ echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
+ echo
+ # Cleanup the logs, tmp when entering the environment
+ sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
+ sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
+ mkdir -p "${AIRFLOW_SOURCES}"/logs/
+ mkdir -p "${AIRFLOW_SOURCES}"/tmp/
+ else
+ python "${IN_CONTAINER_DIR}/install_airflow_and_providers.py"
+ fi
-rm -f "${AIRFLOW_SOURCES}/pytest.ini"
-rm -f "${AIRFLOW_SOURCES}/.coveragerc"
+ if [[ "${USE_AIRFLOW_VERSION}" =~ ^2\.2\..*|^2\.1\..*|^2\.0\..* && "${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=}" != "" ]]; then
+ # make sure old variable is used for older airflow versions
+ export AIRFLOW__CORE__SQL_ALCHEMY_CONN="${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN}"
+ fi
+}
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+function check_boto_upgrade() {
+ if [[ ${UPGRADE_BOTO=} != "true" ]]; then
+ return
+ fi
echo
echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
echo
pip uninstall --root-user-action ignore aiobotocore s3fs -y || true
pip install --root-user-action ignore --upgrade boto3 botocore
pip check
-fi
-if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+}
+
+function check_download_sqlalchemy() {
+ if [[ ${DOWNGRADE_SQLALCHEMY=} != "true" ]]; then
+ return
+ fi
min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed "s/.*>=\([0-9\.]*\).*/\1/")
echo
echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: ${min_sqlalchemy_version}${COLOR_RESET}"
echo
pip install --root-user-action ignore "sqlalchemy==${min_sqlalchemy_version}"
pip check
-fi
+}
-pip uninstall --root-user-action ignore "pytest-capture-warnings" -y >/dev/null 2>&1 || true
+function check_run_tests() {
+ if [[ ${RUN_TESTS=} != "true" ]]; then
+ return
+ fi
-set +u
-if [[ "${RUN_TESTS}" != "true" ]]; then
- exec /bin/bash "${@}"
-fi
-set -u
+ if [[ ${REMOVE_ARM_PACKAGES:="false"} == "true" ]]; then
+ # Test what happens if we do not have ARM packages installed.
+ # This is useful to see if pytest collection works without ARM packages which is important
+ # for the MacOS M1 users running tests in their ARM machines with `breeze testing tests` command
+ python "${IN_CONTAINER_DIR}/remove_arm_packages.py"
+ fi
-if [[ ${REMOVE_ARM_PACKAGES:="false"} == "true" ]]; then
- # Test what happens if we do not have ARM packages installed.
- # This is useful to see if pytest collection works without ARM packages which is important
- # for the MacOS M1 users running tests in their ARM machines with `breeze testing tests` command
- python "${IN_CONTAINER_DIR}/remove_arm_packages.py"
-fi
+ if [[ ${TEST_TYPE} == "PlainAsserts" ]]; then
+ # Plain asserts should be converted to env variable to make sure they are taken into account
+ # otherwise they will not be effective during test collection when plain assert is breaking collection
+ export PYTEST_PLAIN_ASSERTS="true"
+ fi
-if [[ ${TEST_TYPE} == "PlainAsserts" ]]; then
- # Plain asserts should be converted to env variable to make sure they are taken into account
- # otherwise they will not be effective during test collection when plain assert is breaking collection
- export PYTEST_PLAIN_ASSERTS="true"
-fi
+ if [[ ${RUN_SYSTEM_TESTS:="false"} == "true" ]]; then
+ exec "${IN_CONTAINER_DIR}/run_system_tests.sh" "${@}"
+ else
+ exec "${IN_CONTAINER_DIR}/run_ci_tests.sh" "${@}"
+ fi
+}
-if [[ ${RUN_SYSTEM_TESTS:="false"} == "true" ]]; then
- "${IN_CONTAINER_DIR}/run_system_tests.sh" "${@}"
-else
- "${IN_CONTAINER_DIR}/run_ci_tests.sh" "${@}"
-fi
+determine_airflow_to_use
+environment_initialization
+check_boto_upgrade
+check_download_sqlalchemy
+check_run_tests "${@}"
+
+exec /bin/bash "${@}"
EOF
# The content below is automatically copied from scripts/docker/entrypoint_exec.sh
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index 9e1d50a33e..050bc02271 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -18,6 +18,7 @@ from __future__ import annotations
import os
import re
+import shlex
import shutil
import sys
import threading
@@ -33,14 +34,11 @@ from airflow_breeze.commands.main_command import main
from airflow_breeze.global_constants import (
ALLOWED_TTY,
DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
- DOCKER_DEFAULT_PLATFORM,
- MOUNT_SELECTED,
)
from airflow_breeze.params.build_ci_params import BuildCiParams
from airflow_breeze.params.doc_build_params import DocBuildParams
from airflow_breeze.params.shell_params import ShellParams
from airflow_breeze.pre_commit_ids import PRE_COMMIT_LIST
-from airflow_breeze.utils.cache import read_from_cache_file
from airflow_breeze.utils.coertions import one_or_none_set
from airflow_breeze.utils.common_options import (
argument_doc_packages,
@@ -98,26 +96,24 @@ from airflow_breeze.utils.common_options import (
from airflow_breeze.utils.console import get_console
from airflow_breeze.utils.custom_param_types import BetterChoice
from airflow_breeze.utils.docker_command_utils import (
+ bring_compose_project_down,
check_docker_resources,
+ enter_shell,
+ execute_command_in_shell,
fix_ownership_using_docker,
- get_extra_docker_flags,
perform_environment_checks,
)
from airflow_breeze.utils.packages import expand_all_provider_packages
from airflow_breeze.utils.path_utils import (
AIRFLOW_SOURCES_ROOT,
cleanup_python_generated_files,
- create_mypy_volume_if_needed,
)
from airflow_breeze.utils.run_utils import (
- RunCommandResult,
assert_pre_commit_installed,
- filter_out_none,
run_command,
run_compile_www_assets,
)
from airflow_breeze.utils.shared_options import get_dry_run, get_verbose, set_forced_answer
-from airflow_breeze.utils.visuals import ASCIIART, ASCIIART_STYLE, CHEATSHEET, CHEATSHEET_STYLE
def _determine_constraint_branch_used(airflow_constraints_reference: str, use_airflow_version: str | None):
@@ -288,11 +284,12 @@ def shell(
airflow_constraints_reference = _determine_constraint_branch_used(
airflow_constraints_reference, use_airflow_version
)
- result = enter_shell(
+ shell_params = ShellParams(
airflow_constraints_location=airflow_constraints_location,
airflow_constraints_mode=airflow_constraints_mode,
airflow_constraints_reference=airflow_constraints_reference,
airflow_extras=airflow_extras,
+ airflow_skip_constraints=airflow_skip_constraints,
backend=backend,
builder=builder,
celery_broker=celery_broker,
@@ -320,6 +317,7 @@ def shell(
providers_constraints_location=providers_constraints_location,
providers_constraints_mode=providers_constraints_mode,
providers_constraints_reference=providers_constraints_reference,
+ providers_skip_constraints=providers_skip_constraints,
python=python,
quiet=quiet,
run_db_tests_only=run_db_tests_only,
@@ -335,6 +333,8 @@ def shell(
restart=restart,
warn_image_upgrade_needed=warn_image_upgrade_needed,
)
+ rebuild_or_pull_ci_image_if_needed(command_params=shell_params)
+ result = enter_shell(shell_params=shell_params)
fix_ownership_using_docker()
sys.exit(result.returncode)
@@ -450,12 +450,12 @@ def start_airflow(
airflow_constraints_reference, use_airflow_version
)
- result = enter_shell(
+ shell_params = ShellParams(
airflow_constraints_location=airflow_constraints_location,
airflow_constraints_mode=airflow_constraints_mode,
airflow_constraints_reference=airflow_constraints_reference,
- airflow_skip_constraints=airflow_skip_constraints,
airflow_extras=airflow_extras,
+ airflow_skip_constraints=airflow_skip_constraints,
backend=backend,
builder=builder,
celery_broker=celery_broker,
@@ -492,6 +492,8 @@ def start_airflow(
use_airflow_version=use_airflow_version,
use_packages_from_dist=use_packages_from_dist,
)
+ rebuild_or_pull_ci_image_if_needed(command_params=shell_params)
+ result = enter_shell(shell_params=shell_params)
fix_ownership_using_docker()
sys.exit(result.returncode)
@@ -549,7 +551,6 @@ def build_docs(
for directory in docs_dir.rglob(dir_name):
get_console().print(f"[info]Removing {directory}")
shutil.rmtree(directory, ignore_errors=True)
- ci_image_name = build_params.airflow_image_name
doc_builder = DocBuildParams(
package_filter=package_filter,
docs_only=docs_only,
@@ -557,32 +558,20 @@ def build_docs(
one_pass_only=one_pass_only,
short_doc_packages=expand_all_provider_packages(doc_packages),
)
+ cmd = "/opt/airflow/scripts/in_container/run_docs_build.sh " + " ".join(
+ [shlex.quote(arg) for arg in doc_builder.args_doc_builder]
+ )
shell_params = ShellParams(
github_repository=github_repository,
python=DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
- quiet=True,
- skip_environment_initialization=True,
- skip_image_upgrade_check=True,
)
- extra_docker_flags = get_extra_docker_flags(mount_sources=MOUNT_SELECTED)
- cmd = [
- "docker",
- "run",
- "-t",
- *extra_docker_flags,
- "--pull",
- "never",
- ci_image_name,
- "/opt/airflow/scripts/in_container/run_docs_build.sh",
- *doc_builder.args_doc_builder,
- ]
- process = run_command(cmd, text=True, check=False, env=shell_params.env_variables_for_docker_commands)
+ result = execute_command_in_shell(shell_params, project_name="docs", command=cmd)
fix_ownership_using_docker()
- if process.returncode == 0:
+ if result.returncode == 0:
get_console().print(
"[info]Start the webserver in breeze and view the built docs at http://localhost:28080/docs/[/]"
)
- sys.exit(process.returncode)
+ sys.exit(result.returncode)
@main.command(
@@ -861,125 +850,6 @@ def exec(exec_args: tuple):
sys.exit(process.returncode)
-def enter_shell(**kwargs) -> RunCommandResult:
- """
- Executes entering shell using the parameters passed as kwargs:
-
- * checks if docker version is good
- * checks if docker-compose version is good
- * updates kwargs with cached parameters
- * displays ASCIIART and CHEATSHEET unless disabled
- * build ShellParams from the updated kwargs
- * shuts down existing project
- * executes the command to drop the user to Breeze shell
-
- """
- quiet: bool = kwargs.get("quiet") or False
- perform_environment_checks(quiet=quiet)
- fix_ownership_using_docker(quiet=quiet)
- cleanup_python_generated_files()
- if read_from_cache_file("suppress_asciiart") is None and not quiet:
- get_console().print(ASCIIART, style=ASCIIART_STYLE)
- if read_from_cache_file("suppress_cheatsheet") is None and not quiet:
- get_console().print(CHEATSHEET, style=CHEATSHEET_STYLE)
- shell_params = ShellParams(**filter_out_none(**kwargs))
- rebuild_or_pull_ci_image_if_needed(command_params=shell_params)
- if shell_params.use_airflow_version:
- # in case you use specific version of Airflow, you want to bring airflow down automatically before
- # using it. This prevents the problem that if you have newer DB, airflow will not know how
- # to migrate to it and fail with "Can't locate revision identified by 'xxxx'".
- get_console().print(
- f"[warning]Bringing the project down as {shell_params.use_airflow_version} "
- f"airflow version is used[/]"
- )
- bring_compose_project_down(preserve_volumes=False, shell_params=shell_params)
- if shell_params.backend == "sqlite":
- get_console().print(
- f"\n[warning]backend: sqlite is not "
- f"compatible with executor: {shell_params.executor}. "
- f"Changing the executor to SequentialExecutor.\n"
- )
- shell_params.executor = "SequentialExecutor"
-
- if shell_params.executor == "CeleryExecutor" and shell_params.use_airflow_version:
- if shell_params.airflow_extras and "celery" not in shell_params.airflow_extras.split():
- get_console().print(
- f"\n[warning]CeleryExecutor requires airflow_extras: celery. "
- f"Adding celery to extras: '{shell_params.airflow_extras}'.\n"
- )
- shell_params.airflow_extras += ",celery"
- elif not shell_params.airflow_extras:
- get_console().print(
- "\n[warning]CeleryExecutor requires airflow_extras: celery. "
- "Setting airflow extras to 'celery'.\n"
- )
- shell_params.airflow_extras = "celery"
- if shell_params.restart:
- bring_compose_project_down(preserve_volumes=False, shell_params=shell_params)
- if shell_params.include_mypy_volume:
- create_mypy_volume_if_needed()
- shell_params.print_badge_info()
- cmd = ["docker", "compose"]
- if shell_params.quiet:
- cmd.extend(["--progress", "quiet"])
- if shell_params.project_name:
- cmd.extend(["--project-name", shell_params.project_name])
- cmd.extend(["run", "--service-ports", "--rm"])
- if shell_params.tty == "disabled":
- cmd.append("--no-TTY")
- elif shell_params.tty == "enabled":
- cmd.append("--tty")
- cmd.append("airflow")
- cmd_added = shell_params.command_passed
- if cmd_added is not None:
- cmd.extend(["-c", cmd_added])
- if "arm64" in DOCKER_DEFAULT_PLATFORM:
- if shell_params.backend == "mysql":
- get_console().print("\n[warn]MySQL use MariaDB client binaries on ARM architecture.[/]\n")
- elif shell_params.backend == "mssql":
- get_console().print("\n[error]MSSQL is not supported on ARM architecture[/]\n")
- sys.exit(1)
-
- if "openlineage" in shell_params.integration or "all" in shell_params.integration:
- if shell_params.backend != "postgres" or shell_params.postgres_version not in ["12", "13", "14"]:
- get_console().print(
- "\n[error]Only PostgreSQL 12, 13, and 14 are supported "
- "as a backend with OpenLineage integration via Breeze[/]\n"
- )
- sys.exit(1)
-
- command_result = run_command(
- cmd,
- text=True,
- check=False,
- env=shell_params.env_variables_for_docker_commands,
- output_outside_the_group=True,
- )
- if command_result.returncode == 0:
- return command_result
- else:
- get_console().print(f"[red]Error {command_result.returncode} returned[/]")
- if get_verbose():
- get_console().print(command_result.stderr)
- return command_result
-
-
-def bring_compose_project_down(preserve_volumes: bool, shell_params: ShellParams):
- down_command_to_execute = ["docker", "compose"]
- if shell_params.project_name:
- down_command_to_execute.extend(["--project-name", shell_params.project_name])
- down_command_to_execute.extend(["down", "--remove-orphans"])
- if not preserve_volumes:
- down_command_to_execute.append("--volumes")
- run_command(
- down_command_to_execute,
- text=True,
- check=False,
- capture_output=shell_params.quiet,
- env=shell_params.env_variables_for_docker_commands,
- )
-
-
def stop_exec_on_error(returncode: int):
get_console().print("\n[error]ERROR in finding the airflow docker-compose process id[/]\n")
sys.exit(returncode)
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 ad3df865f5..ff3f9bf9c7 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -20,7 +20,6 @@ import glob
import operator
import os
import re
-import shlex
import shutil
import sys
import textwrap
@@ -107,8 +106,8 @@ from airflow_breeze.utils.console import MessageType, Output, get_console
from airflow_breeze.utils.custom_param_types import BetterChoice
from airflow_breeze.utils.docker_command_utils import (
check_remote_ghcr_io_commands,
+ execute_command_in_shell,
fix_ownership_using_docker,
- get_extra_docker_flags,
perform_environment_checks,
)
from airflow_breeze.utils.github import download_constraints_file, get_active_airflow_versions
@@ -144,7 +143,6 @@ from airflow_breeze.utils.provider_dependencies import (
from airflow_breeze.utils.publish_docs_builder import PublishDocsBuilder
from airflow_breeze.utils.python_versions import get_python_version_list
from airflow_breeze.utils.run_utils import (
- RunCommandResult,
clean_www_assets,
run_command,
run_compile_www_assets,
@@ -152,13 +150,6 @@ from airflow_breeze.utils.run_utils import (
from airflow_breeze.utils.shared_options import get_dry_run, get_verbose
from airflow_breeze.utils.versions import is_pre_release
-option_debug_release_management = click.option(
- "--debug",
- is_flag=True,
- help="Drop user in shell instead of running the command. Useful for debugging.",
- envvar="DEBUG",
-)
-
if TYPE_CHECKING:
from packaging.version import Version
@@ -171,60 +162,6 @@ class VersionedFile(NamedTuple):
comparable_version: Version
-def run_docker_command_with_debug(
- shell_params: ShellParams,
- command: list[str],
- debug: bool,
- enable_input: bool = False,
- output_outside_the_group: bool = False,
- **kwargs,
-) -> RunCommandResult:
- env = shell_params.env_variables_for_docker_commands
- extra_docker_flags = get_extra_docker_flags(mount_sources=shell_params.mount_sources)
- if enable_input or debug:
- term_flag = "-it"
- else:
- term_flag = "-t"
- base_command = [
- "docker",
- "run",
- term_flag,
- *extra_docker_flags,
- "--pull",
- "never",
- shell_params.airflow_image_name_with_tag,
- ]
- if debug:
- cmd_string = " ".join([shlex.quote(s) for s in command if s != "-c"])
- base_command.extend(
- [
- "-c",
- f"""
-echo -e '\\e[34mRun this command to debug:
-
- {cmd_string}
-
-\\e[0m\n'; exec bash
-""",
- ]
- )
- return run_command(
- base_command,
- output_outside_the_group=output_outside_the_group,
- env=env,
- **kwargs,
- )
- else:
- base_command.extend(command)
- return run_command(
- base_command,
- check=False,
- env=env,
- output_outside_the_group=output_outside_the_group,
- **kwargs,
- )
-
-
AIRFLOW_PIP_VERSION = "23.3.1"
WHEEL_VERSION = "0.36.2"
GITPYTHON_VERSION = "3.1.40"
@@ -627,22 +564,16 @@ def prepare_provider_packages(
def run_generate_constraints(
shell_params: ShellParams,
- debug: bool,
output: Output | None,
) -> tuple[int, str]:
- cmd_to_run = [
- "/opt/airflow/scripts/in_container/run_generate_constraints.sh",
- ]
- generate_constraints_result = run_docker_command_with_debug(
- shell_params=shell_params,
- command=cmd_to_run,
- debug=debug,
- output=output,
- output_outside_the_group=True,
+ result = execute_command_in_shell(
+ shell_params,
+ project_name="constraints",
+ command="/opt/airflow/scripts/in_container/run_generate_constraints.sh",
)
fix_ownership_using_docker()
return (
- generate_constraints_result.returncode,
+ result.returncode,
f"Constraints {shell_params.airflow_constraints_mode}:{shell_params.python}",
)
@@ -679,7 +610,6 @@ def run_generate_constraints_in_parallel(
run_generate_constraints,
kwds={
"shell_params": shell_params,
- "debug": False,
"output": outputs[index],
},
)
@@ -707,7 +637,6 @@ def run_generate_constraints_in_parallel(
@option_debug_resources
@option_python_versions
@option_image_tag_for_running
-@option_debug_release_management
@option_airflow_constraints_mode_ci
@option_chicken_egg_providers
@option_github_repository
@@ -716,7 +645,6 @@ def run_generate_constraints_in_parallel(
@option_answer
def generate_constraints(
airflow_constraints_mode: str,
- debug: bool,
debug_resources: bool,
github_repository: str,
image_tag: str | None,
@@ -731,9 +659,6 @@ def generate_constraints(
check_remote_ghcr_io_commands()
fix_ownership_using_docker()
cleanup_python_generated_files()
- if debug and run_in_parallel:
- get_console().print("\n[error]Cannot run --debug and --run-in-parallel at the same time[/]\n")
- sys.exit(1)
if run_in_parallel:
given_answer = user_confirm(
f"Did you build all CI images {python_versions} with --upgrade-to-newer-dependencies flag set?",
@@ -765,37 +690,33 @@ def generate_constraints(
python_version_list = get_python_version_list(python_versions)
shell_params_list = [
ShellParams(
- image_tag=image_tag,
- python=python,
- github_repository=github_repository,
airflow_constraints_mode=airflow_constraints_mode,
chicken_egg_providers=chicken_egg_providers,
+ github_repository=github_repository,
+ image_tag=image_tag,
+ python=python,
)
for python in python_version_list
]
run_generate_constraints_in_parallel(
- shell_params_list=shell_params_list,
- parallelism=parallelism,
- skip_cleanup=skip_cleanup,
debug_resources=debug_resources,
include_success_outputs=True,
+ parallelism=parallelism,
python_version_list=python_version_list,
+ shell_params_list=shell_params_list,
+ skip_cleanup=skip_cleanup,
)
else:
shell_params = ShellParams(
- image_tag=image_tag,
- python=python,
- github_repository=github_repository,
- skip_environment_initialization=True,
- skip_image_upgrade_check=True,
- quiet=True,
airflow_constraints_mode=airflow_constraints_mode,
chicken_egg_providers=chicken_egg_providers,
+ github_repository=github_repository,
+ image_tag=image_tag,
+ python=python,
)
return_code, info = run_generate_constraints(
shell_params=shell_params,
output=None,
- debug=debug,
)
if return_code != 0:
get_console().print(f"[error]There was an error when generating constraints: {info}[/]")
@@ -849,17 +770,11 @@ def get_all_providers_in_dist(package_format: str, install_selected_providers: s
def _run_command_for_providers(
shell_params: ShellParams,
- cmd_to_run: list[str],
list_of_providers: list[str],
output: Output | None,
) -> tuple[int, str]:
shell_params.install_selected_providers = " ".join(list_of_providers)
- result_command = run_docker_command_with_debug(
- shell_params=shell_params,
- command=cmd_to_run,
- debug=False,
- output=output,
- )
+ result_command = execute_command_in_shell(shell_params, project_name="providers")
return result_command.returncode, f"{list_of_providers}"
@@ -875,7 +790,6 @@ SDIST_INSTALL_PROGRESS_REGEXP = r"Processing .*|Requirement already satisfied:.*
@option_airflow_constraints_reference
@option_airflow_extras
@option_airflow_skip_constraints
-@option_debug_release_management
@option_debug_resources
@option_dry_run
@option_github_repository
@@ -900,7 +814,6 @@ def install_provider_packages(
airflow_constraints_reference: str,
airflow_skip_constraints: bool,
airflow_extras: str,
- debug: bool,
debug_resources: bool,
github_repository: str,
include_success_outputs: bool,
@@ -927,12 +840,15 @@ def install_provider_packages(
airflow_constraints_reference=airflow_constraints_reference,
airflow_extras=airflow_extras,
airflow_skip_constraints=airflow_skip_constraints,
+ # We just want to install the providers by entrypoint
+ # we do not need to run any command in the container
+ extra_args=("exit 0",),
github_repository=github_repository,
install_selected_providers=install_selected_providers,
mount_sources=mount_sources,
package_format=package_format,
- providers_constraints_mode=providers_constraints_mode,
providers_constraints_location=providers_constraints_location,
+ providers_constraints_mode=providers_constraints_mode,
providers_constraints_reference=providers_constraints_reference,
providers_skip_constraints=providers_skip_constraints,
python=python,
@@ -940,11 +856,6 @@ def install_provider_packages(
use_packages_from_dist=use_packages_from_dist,
)
rebuild_or_pull_ci_image_if_needed(command_params=shell_params)
- # We just want to install the providers by entrypoint, we do not need to run any command in the container
- cmd_to_run = [
- "-c",
- "exit 0",
- ]
if run_in_parallel:
list_of_all_providers = get_all_providers_in_dist(
package_format=package_format, install_selected_providers=install_selected_providers
@@ -995,7 +906,6 @@ def install_provider_packages(
_run_command_for_providers,
kwds={
"shell_params": shell_params,
- "cmd_to_run": cmd_to_run,
"list_of_providers": list_of_providers,
"output": outputs[index],
},
@@ -1010,12 +920,7 @@ def install_provider_packages(
skip_cleanup=skip_cleanup,
)
else:
- result_command = run_docker_command_with_debug(
- shell_params=shell_params,
- command=cmd_to_run,
- debug=debug,
- output_outside_the_group=True,
- )
+ result_command = execute_command_in_shell(shell_params, project_name="providers")
fix_ownership_using_docker()
sys.exit(result_command.returncode)
@@ -1029,7 +934,6 @@ def install_provider_packages(
@option_airflow_constraints_reference
@option_airflow_extras
@option_airflow_skip_constraints
-@option_debug_release_management
@option_dry_run
@option_github_repository
@option_install_selected_providers
@@ -1048,7 +952,6 @@ def verify_provider_packages(
airflow_constraints_mode: str,
airflow_constraints_reference: str,
airflow_extras: str,
- debug: bool,
github_repository: str,
install_selected_providers: str,
mount_sources: str,
@@ -1074,13 +977,11 @@ def verify_provider_packages(
airflow_constraints_reference=airflow_constraints_reference,
airflow_extras=airflow_extras,
airflow_skip_constraints=airflow_skip_constraints,
- backend="sqlite",
- executor="SequentialExecutor",
github_repository=github_repository,
mount_sources=mount_sources,
package_format=package_format,
- providers_constraints_mode=providers_constraints_mode,
providers_constraints_location=providers_constraints_location,
+ providers_constraints_mode=providers_constraints_mode,
providers_constraints_reference=providers_constraints_reference,
providers_skip_constraints=providers_skip_constraints,
python=python,
@@ -1088,15 +989,10 @@ def verify_provider_packages(
use_packages_from_dist=use_packages_from_dist,
)
rebuild_or_pull_ci_image_if_needed(command_params=shell_params)
- cmd_to_run = [
- "-c",
- "python /opt/airflow/scripts/in_container/verify_providers.py",
- ]
- result_command = run_docker_command_with_debug(
- shell_params=shell_params,
- command=cmd_to_run,
- debug=debug,
- output_outside_the_group=True,
+ result_command = execute_command_in_shell(
+ shell_params,
+ project_name="providers",
+ command="python /opt/airflow/scripts/in_container/verify_providers.py",
)
fix_ownership_using_docker()
sys.exit(result_command.returncode)
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 d51aa8722e..bf03085e99 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
@@ -67,7 +67,6 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--python",
"--mount-sources",
"--github-repository",
- "--debug",
],
},
{
@@ -96,7 +95,6 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--python",
"--mount-sources",
"--github-repository",
- "--debug",
],
},
{
@@ -163,7 +161,6 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"--python",
"--airflow-constraints-mode",
"--chicken-egg-providers",
- "--debug",
"--github-repository",
],
},
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py b/dev/breeze/src/airflow_breeze/global_constants.py
index 6d8306058d..f336900d04 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -86,6 +86,9 @@ ALLOWED_EXECUTORS = [
DEFAULT_ALLOWED_EXECUTOR = ALLOWED_EXECUTORS[0]
START_AIRFLOW_ALLOWED_EXECUTORS = ["LocalExecutor", "CeleryExecutor", "SequentialExecutor"]
START_AIRFLOW_DEFAULT_ALLOWED_EXECUTOR = START_AIRFLOW_ALLOWED_EXECUTORS[0]
+
+SEQUENTIAL_EXECUTOR = "SequentialExecutor"
+
ALLOWED_KIND_OPERATIONS = ["start", "stop", "restart", "status", "deploy", "test", "shell", "k9s"]
ALLOWED_CONSTRAINTS_MODES_CI = ["constraints-source-providers", "constraints", "constraints-no-providers"]
ALLOWED_CONSTRAINTS_MODES_PROD = ["constraints", "constraints-no-providers", "constraints-source-providers"]
@@ -196,7 +199,7 @@ ALL_HISTORICAL_PYTHON_VERSIONS = ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"]
def get_default_platform_machine() -> str:
machine = platform.uname().machine
# Some additional conversion for various platforms...
- machine = {"AMD64": "x86_64"}.get(machine, machine)
+ machine = {"x86_64": "amd64"}.get(machine, machine)
return machine
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py b/dev/breeze/src/airflow_breeze/params/shell_params.py
index 311e2497fa..58c49ecf9b 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -52,8 +52,8 @@ from airflow_breeze.global_constants import (
get_airflow_version,
)
from airflow_breeze.utils.console import get_console
+from airflow_breeze.utils.docker_command_utils import is_docker_rootless
from airflow_breeze.utils.host_info_utils import get_host_group_id, get_host_os, get_host_user_id
-from airflow_breeze.utils.packages import get_suspended_provider_folders
from airflow_breeze.utils.path_utils import (
AIRFLOW_SOURCES_ROOT,
BUILD_CACHE_DIR,
@@ -153,7 +153,7 @@ class ShellParams:
executor: str = START_AIRFLOW_DEFAULT_ALLOWED_EXECUTOR
extra_args: tuple = ()
force_build: bool = False
- forward_credentials: str = "false"
+ forward_credentials: bool = False
forward_ports: bool = True
github_actions: str = os.environ.get("GITHUB_ACTIONS", "false")
github_repository: str = APACHE_AIRFLOW_GITHUB_REPOSITORY
@@ -198,7 +198,7 @@ class ShellParams:
skip_provider_tests: bool = False
skip_ssh_setup: bool = os.environ.get("SKIP_SSH_SETUP", "false") == "true"
standalone_dag_processor: bool = False
- start_airflow: str = "false"
+ start_airflow: bool = False
test_type: str | None = None
tty: str = "auto"
upgrade_boto: bool = False
@@ -298,7 +298,13 @@ class ShellParams:
get_console().print(f"[info]Airflow used at runtime: {self.use_airflow_version}[/]")
def get_backend_compose_files(self, backend: str) -> list[Path]:
- backend_docker_compose_file = DOCKER_COMPOSE_DIR / f"backend-{backend}.yml"
+ if backend == "sqlite" and self.project_name != "breeze":
+ # When running scripts, we do not want to mount the volume to make sure that the
+ # sqlite database is not persisted between runs of the script and that the
+ # breeze database is not cleaned accidentally
+ backend_docker_compose_file = DOCKER_COMPOSE_DIR / f"backend-{backend}-no-volume.yml"
+ else:
+ backend_docker_compose_file = DOCKER_COMPOSE_DIR / f"backend-{backend}.yml"
if backend in ("sqlite", "none") or not self.forward_ports:
return [backend_docker_compose_file]
if self.project_name == "pre-commit":
@@ -344,8 +350,6 @@ class ShellParams:
compose_file_list.append(DOCKER_COMPOSE_DIR / "remove-sources.yml")
if self.forward_credentials:
compose_file_list.append(DOCKER_COMPOSE_DIR / "forward-credentials.yml")
- if self.use_airflow_version is not None:
- compose_file_list.append(DOCKER_COMPOSE_DIR / "remove-sources.yml")
if self.include_mypy_volume:
compose_file_list.append(DOCKER_COMPOSE_DIR / "mypy.yml")
if "all-testable" in self.integration:
@@ -383,6 +387,8 @@ class ShellParams:
@cached_property
def suspended_providers_folders(self):
+ from airflow_breeze.utils.packages import get_suspended_provider_folders
+
return " ".join(get_suspended_provider_folders()).strip()
@cached_property
@@ -453,20 +459,7 @@ class ShellParams:
@cached_property
def rootless_docker(self) -> bool:
- try:
- response = run_command(
- ["docker", "info", "-f", "{{println .SecurityOptions}}"],
- capture_output=True,
- check=False,
- text=True,
- )
- if response.returncode == 0 and "rootless" in response.stdout.strip():
- get_console().print("[info]Docker is running in rootless mode.[/]\n")
- return True
- except FileNotFoundError:
- # we ignore if docker is missing
- pass
- return False
+ return is_docker_rootless()
@cached_property
def env_variables_for_docker_commands(self) -> dict[str, str]:
diff --git a/dev/breeze/src/airflow_breeze/utils/common_options.py b/dev/breeze/src/airflow_breeze/utils/common_options.py
index 2be5db94c4..bf6288658e 100644
--- a/dev/breeze/src/airflow_breeze/utils/common_options.py
+++ b/dev/breeze/src/airflow_breeze/utils/common_options.py
@@ -48,6 +48,7 @@ from airflow_breeze.global_constants import (
AUTOCOMPLETE_INTEGRATIONS,
DEFAULT_ALLOWED_EXECUTOR,
DEFAULT_CELERY_BROKER,
+ DOCKER_DEFAULT_PLATFORM,
SINGLE_PLATFORMS,
START_AIRFLOW_ALLOWED_EXECUTORS,
START_AIRFLOW_DEFAULT_ALLOWED_EXECUTOR,
@@ -276,12 +277,14 @@ option_platform_multiple = click.option(
"--platform",
help="Platform for Airflow image.",
envvar="PLATFORM",
+ default=DOCKER_DEFAULT_PLATFORM if not generating_command_images() else "linux/amd64",
type=BetterChoice(ALLOWED_PLATFORMS),
)
option_platform_single = click.option(
"--platform",
help="Platform for Airflow image.",
envvar="PLATFORM",
+ default=DOCKER_DEFAULT_PLATFORM if not generating_command_images() else "linux/amd64",
type=BetterChoice(SINGLE_PLATFORMS),
)
option_upgrade_to_newer_dependencies = click.option(
diff --git a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
index 10e628ba5d..c3c5b3ef81 100644
--- a/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
@@ -26,9 +26,15 @@ from subprocess import DEVNULL, CalledProcessError, CompletedProcess
from typing import TYPE_CHECKING
from airflow_breeze.params.build_prod_params import BuildProdParams
-from airflow_breeze.utils.host_info_utils import get_host_os
-from airflow_breeze.utils.image import find_available_ci_image
-from airflow_breeze.utils.path_utils import AIRFLOW_SOURCES_ROOT, GENERATED_DOCKER_ENV_FILE
+from airflow_breeze.utils.cache import read_from_cache_file
+from airflow_breeze.utils.host_info_utils import get_host_group_id, get_host_os, get_host_user_id
+from airflow_breeze.utils.path_utils import (
+ AIRFLOW_SOURCES_ROOT,
+ cleanup_python_generated_files,
+ create_mypy_volume_if_needed,
+)
+from airflow_breeze.utils.shared_options import get_verbose
+from airflow_breeze.utils.visuals import ASCIIART, ASCIIART_STYLE, CHEATSHEET, CHEATSHEET_STYLE
try:
from packaging import version
@@ -39,13 +45,11 @@ except ImportError:
from airflow_breeze.global_constants import (
ALLOWED_CELERY_BROKERS,
ALLOWED_DEBIAN_VERSIONS,
- APACHE_AIRFLOW_GITHUB_REPOSITORY,
DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
+ DOCKER_DEFAULT_PLATFORM,
MIN_DOCKER_COMPOSE_VERSION,
MIN_DOCKER_VERSION,
- MOUNT_ALL,
- MOUNT_REMOVE,
- MOUNT_SELECTED,
+ SEQUENTIAL_EXECUTOR,
)
from airflow_breeze.utils.console import Output, get_console
from airflow_breeze.utils.run_utils import (
@@ -56,6 +60,7 @@ from airflow_breeze.utils.run_utils import (
if TYPE_CHECKING:
from airflow_breeze.params.common_build_params import CommonBuildParams
+ from airflow_breeze.params.shell_params import ShellParams
# Those are volumes that are mounted when MOUNT_SELECTED is chosen (which is the default when
# entering Breeze. MOUNT_SELECTED prevents to mount the files that you can have accidentally added
@@ -99,39 +104,6 @@ VOLUMES_FOR_SELECTED_MOUNTS = [
]
-def get_extra_docker_flags(mount_sources: str, include_mypy_volume: bool = False) -> list[str]:
- """
- Returns extra docker flags based on the type of mounting we want to do for sources.
-
- :param mount_sources: type of mounting we want to have
- :param env: environment variables to pass to docker
- :param include_mypy_volume: includes mypy_volume
- :return: extra flag as list of strings
- """
- extra_docker_flags = []
- if mount_sources == MOUNT_ALL:
- extra_docker_flags.extend(["--mount", f"type=bind,src={AIRFLOW_SOURCES_ROOT},dst=/opt/airflow/"])
- elif mount_sources == MOUNT_SELECTED:
- for src, dst in VOLUMES_FOR_SELECTED_MOUNTS:
- if (AIRFLOW_SOURCES_ROOT / src).exists():
- extra_docker_flags.extend(
- ["--mount", f"type=bind,src={AIRFLOW_SOURCES_ROOT / src},dst={dst}"]
- )
- if include_mypy_volume:
- extra_docker_flags.extend(
- ["--mount", "type=volume,src=mypy-cache-volume,dst=/opt/airflow/.mypy_cache"]
- )
- elif mount_sources == MOUNT_REMOVE:
- extra_docker_flags.extend(
- ["--mount", f"type=bind,src={AIRFLOW_SOURCES_ROOT / 'empty'},dst=/opt/airflow/airflow"]
- )
- extra_docker_flags.extend(["--mount", f"type=bind,src={AIRFLOW_SOURCES_ROOT / 'files'},dst=/files"])
- extra_docker_flags.extend(["--mount", f"type=bind,src={AIRFLOW_SOURCES_ROOT / 'dist'},dst=/dist"])
- extra_docker_flags.extend(["--rm"])
- extra_docker_flags.extend(["--env-file", GENERATED_DOCKER_ENV_FILE.as_posix()])
- return extra_docker_flags
-
-
def check_docker_resources(airflow_image_name: str) -> RunCommandResult:
"""
Check if we have enough resources to run docker. This is done via running script embedded in our image.
@@ -563,21 +535,26 @@ def fix_ownership_using_docker(quiet: bool = False):
if get_host_os() != "linux":
# no need to even attempt fixing ownership on MacOS/Windows
return
- shell_params = find_available_ci_image(
- github_repository=APACHE_AIRFLOW_GITHUB_REPOSITORY,
- )
- extra_docker_flags = get_extra_docker_flags(mount_sources=MOUNT_ALL)
cmd = [
"docker",
"run",
+ "-v",
+ "./scripts/in_container:/opt/airflow/scripts/in_container",
+ "-e",
+ f"HOST_OS={get_host_os()}",
+ "-e",
+ f"HOST_USER_ID={get_host_user_id()}",
+ "-e",
+ f"HOST_GROUP_ID={get_host_group_id()}",
+ "-e",
+ f"DOCKER_IS_ROOTLESS={is_docker_rootless()}",
+ "-e",
+ f"VERBOSE_COMMANDS={str(not quiet).lower()}",
"-t",
- *extra_docker_flags,
OWNERSHIP_CLEANUP_DOCKER_TAG,
"/opt/airflow/scripts/in_container/run_fix_ownership.py",
]
- run_command(
- cmd, text=True, check=False, env=shell_params.env_variables_for_docker_commands, capture_output=quiet
- )
+ run_command(cmd, text=True, check=False, capture_output=quiet)
def remove_docker_networks(networks: list[str] | None = None) -> None:
@@ -671,3 +648,185 @@ def get_docker_build_env(image_params: CommonBuildParams) -> dict[str, str]:
if image_params.docker_host:
env["DOCKER_HOST"] = image_params.docker_host
return env
+
+
+def bring_compose_project_down(preserve_volumes: bool, shell_params: ShellParams):
+ down_command_to_execute = ["docker", "compose"]
+ if shell_params.project_name:
+ down_command_to_execute.extend(["--project-name", shell_params.project_name])
+ down_command_to_execute.extend(["down", "--remove-orphans"])
+ if not preserve_volumes:
+ down_command_to_execute.append("--volumes")
+ run_command(
+ down_command_to_execute,
+ text=True,
+ check=False,
+ capture_output=shell_params.quiet,
+ env=shell_params.env_variables_for_docker_commands,
+ )
+
+
+def execute_command_in_shell(
+ shell_params: ShellParams, project_name: str, command: str | None = None
+) -> RunCommandResult:
+ """Executes command in shell.
+
+ When you want to execute a script/bash command inside the CI container and want to use `enter_shell`
+ for this purpose, the helper methods sets the following parameters of shell_params:
+
+ * backend - to force sqlite backend
+ * clean_sql_db=True - to clean the sqlite DB
+ * executor - to force SequentialExecutor
+ * forward_ports=False - to avoid forwarding ports from the container to the host - again that will
+ allow to avoid clashes with other commands and opened breeze shell
+ * project_name - to avoid name clashes with default "breeze" project name used
+ * quiet=True - avoid displaying all "interactive" parts of Breeze: ASCIIART, CHEATSHEET, some diagnostics
+ * skip_environment_initialization - to avoid initializing interactive environment
+ * skip_image_upgrade_check - to avoid checking if the image is up to date
+
+ if command is passed as parameter, extra_args - to pass the command to execute in the shell
+
+ :param shell_params: shell parameters to use
+ :param project_name: Name of the project to use. This avoids name clashes with default 'breeze"
+ project name used - this way you will be able to run the command in parallel to regular
+ "breeze" shell opened in parallel
+ :param command:
+ """
+ shell_params.backend = "sqlite"
+ shell_params.executor = SEQUENTIAL_EXECUTOR
+ shell_params.forward_ports = False
+ shell_params.project_name = project_name
+ shell_params.quiet = True
+ shell_params.skip_environment_initialization = True
+ shell_params.skip_image_upgrade_check = True
+ if get_verbose():
+ get_console().print(f"[warning]Backend forced to: sqlite and {SEQUENTIAL_EXECUTOR}[/]")
+ get_console().print("[warning]Sqlite DB is cleaned[/]")
+ get_console().print(f"[warning]Executor forced to {SEQUENTIAL_EXECUTOR}[/]")
+ get_console().print("[warning]Disabled port forwarding[/]")
+ get_console().print(f"[warning]Project name set to: {project_name}[/]")
+ get_console().print("[warning]Forced quiet mode[/]")
+ get_console().print("[warning]Forced skipping environment initialization[/]")
+ get_console().print("[warning]Forced skipping upgrade check[/]")
+ if command:
+ shell_params.extra_args = (command,)
+ if get_verbose():
+ get_console().print(f"[info]Command to execute: '{command}'[/]")
+ return enter_shell(shell_params)
+
+
+def enter_shell(shell_params: ShellParams) -> RunCommandResult:
+ """
+ Executes entering shell using the parameters passed as kwargs:
+
+ * checks if docker version is good
+ * checks if docker-compose version is good
+ * updates kwargs with cached parameters
+ * displays ASCIIART and CHEATSHEET unless disabled
+ * build ShellParams from the updated kwargs
+ * shuts down existing project
+ * executes the command to drop the user to Breeze shell
+ """
+ perform_environment_checks(quiet=shell_params.quiet)
+ fix_ownership_using_docker(quiet=shell_params.quiet)
+ cleanup_python_generated_files()
+ if read_from_cache_file("suppress_asciiart") is None and not shell_params.quiet:
+ get_console().print(ASCIIART, style=ASCIIART_STYLE)
+ if read_from_cache_file("suppress_cheatsheet") is None and not shell_params.quiet:
+ get_console().print(CHEATSHEET, style=CHEATSHEET_STYLE)
+ if shell_params.use_airflow_version:
+ # in case you use specific version of Airflow, you want to bring airflow down automatically before
+ # using it. This prevents the problem that if you have newer DB, airflow will not know how
+ # to migrate to it and fail with "Can't locate revision identified by 'xxxx'".
+ get_console().print(
+ f"[warning]Bringing the project down as {shell_params.use_airflow_version} "
+ f"airflow version is used[/]"
+ )
+ bring_compose_project_down(preserve_volumes=False, shell_params=shell_params)
+
+ if shell_params.backend == "sqlite" and shell_params.executor != SEQUENTIAL_EXECUTOR:
+ get_console().print(
+ f"\n[warning]backend: sqlite is not "
+ f"compatible with executor: {shell_params.executor}. "
+ f"Changing the executor to {SEQUENTIAL_EXECUTOR}.\n"
+ )
+ shell_params.executor = SEQUENTIAL_EXECUTOR
+
+ if shell_params.executor == "CeleryExecutor" and shell_params.use_airflow_version:
+ if shell_params.airflow_extras and "celery" not in shell_params.airflow_extras.split():
+ get_console().print(
+ f"\n[warning]CeleryExecutor requires airflow_extras: celery. "
+ f"Adding celery to extras: '{shell_params.airflow_extras}'.\n"
+ )
+ shell_params.airflow_extras += ",celery"
+ elif not shell_params.airflow_extras:
+ get_console().print(
+ "\n[warning]CeleryExecutor requires airflow_extras: celery. "
+ "Setting airflow extras to 'celery'.\n"
+ )
+ shell_params.airflow_extras = "celery"
+ if shell_params.restart:
+ bring_compose_project_down(preserve_volumes=False, shell_params=shell_params)
+ if shell_params.include_mypy_volume:
+ create_mypy_volume_if_needed()
+ shell_params.print_badge_info()
+ cmd = ["docker", "compose"]
+ if shell_params.quiet:
+ cmd.extend(["--progress", "quiet"])
+ if shell_params.project_name:
+ cmd.extend(["--project-name", shell_params.project_name])
+ cmd.extend(["run", "--service-ports", "--rm"])
+ if shell_params.tty == "disabled":
+ cmd.append("--no-TTY")
+ elif shell_params.tty == "enabled":
+ cmd.append("--tty")
+ cmd.append("airflow")
+ cmd_added = shell_params.command_passed
+ if cmd_added is not None:
+ cmd.extend(["-c", cmd_added])
+ if "arm64" in DOCKER_DEFAULT_PLATFORM:
+ if shell_params.backend == "mysql":
+ get_console().print("\n[warn]MySQL use MariaDB client binaries on ARM architecture.[/]\n")
+ elif shell_params.backend == "mssql":
+ get_console().print("\n[error]MSSQL is not supported on ARM architecture[/]\n")
+ sys.exit(1)
+
+ if "openlineage" in shell_params.integration or "all" in shell_params.integration:
+ if shell_params.backend != "postgres" or shell_params.postgres_version not in ["12", "13", "14"]:
+ get_console().print(
+ "\n[error]Only PostgreSQL 12, 13, and 14 are supported "
+ "as a backend with OpenLineage integration via Breeze[/]\n"
+ )
+ sys.exit(1)
+
+ command_result = run_command(
+ cmd,
+ text=True,
+ check=False,
+ env=shell_params.env_variables_for_docker_commands,
+ output_outside_the_group=True,
+ )
+ if command_result.returncode == 0:
+ return command_result
+ else:
+ get_console().print(f"[red]Error {command_result.returncode} returned[/]")
+ if get_verbose():
+ get_console().print(command_result.stderr)
+ return command_result
+
+
+def is_docker_rootless() -> bool:
+ try:
+ response = run_command(
+ ["docker", "info", "-f", "{{println .SecurityOptions}}"],
+ capture_output=True,
+ check=False,
+ text=True,
+ )
+ if response.returncode == 0 and "rootless" in response.stdout.strip():
+ get_console().print("[info]Docker is running in rootless mode.[/]\n")
+ return True
+ except FileNotFoundError:
+ # we ignore if docker is missing
+ pass
+ return False
diff --git a/dev/breeze/src/airflow_breeze/utils/path_utils.py b/dev/breeze/src/airflow_breeze/utils/path_utils.py
index cc2e302e4d..6e701e0c24 100644
--- a/dev/breeze/src/airflow_breeze/utils/path_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/path_utils.py
@@ -356,11 +356,17 @@ def cleanup_python_generated_files():
for path in AIRFLOW_SOURCES_ROOT.rglob("*.pyc"):
try:
path.unlink()
+ except FileNotFoundError:
+ # File has been removed in the meantime.
+ pass
except PermissionError:
permission_errors.append(path)
for path in AIRFLOW_SOURCES_ROOT.rglob("__pycache__"):
try:
shutil.rmtree(path)
+ except FileNotFoundError:
+ # File has been removed in the meantime.
+ pass
except PermissionError:
permission_errors.append(path)
if permission_errors:
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 0707cdad11..f3956bc07d 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -365,11 +365,6 @@ def commit_sha():
return "COMMIT_SHA_NOT_FOUND"
-def filter_out_none(**kwargs) -> dict:
- """Filters out all None values from parameters passed."""
- return {key: val for key, val in kwargs.items() if val is not None}
-
-
def check_if_image_exists(image: str) -> bool:
cmd_result = run_command(
["docker", "inspect", image],
diff --git a/dev/breeze/tests/test_commands.py b/dev/breeze/tests/test_commands.py
deleted file mode 100644
index 7420aa4940..0000000000
--- a/dev/breeze/tests/test_commands.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# 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.
-from __future__ import annotations
-
-from airflow_breeze.global_constants import MOUNT_ALL, MOUNT_REMOVE, MOUNT_SELECTED, MOUNT_SKIP
-from airflow_breeze.utils.docker_command_utils import get_extra_docker_flags
-from airflow_breeze.utils.visuals import ASCIIART
-
-
-def test_visuals():
- assert 2051 == len(ASCIIART)
-
-
-def test_get_extra_docker_flags_all():
- flags = get_extra_docker_flags(MOUNT_ALL)
- assert "/empty," not in "".join(flags)
- assert len(flags) < 10
-
-
-def test_get_extra_docker_flags_selected():
- flags = get_extra_docker_flags(MOUNT_SELECTED)
- assert "/empty," not in "".join(flags)
- assert len(flags) > 40
-
-
-def test_get_extra_docker_flags_remove():
- flags = get_extra_docker_flags(MOUNT_REMOVE)
- assert "/empty," in "".join(flags)
- assert len(flags) < 10
-
-
-def test_get_extra_docker_flags_skip():
- flags = get_extra_docker_flags(MOUNT_SKIP)
- assert "/empty," not in "".join(flags)
- assert len(flags) < 10
-
-
-def test_get_no_unknown_common_options():
- flags = get_extra_docker_flags(MOUNT_SKIP)
- assert "/empty," not in "".join(flags)
- assert len(flags) < 10
diff --git a/dev/breeze/tests/test_run_utils.py b/dev/breeze/tests/test_run_utils.py
index 46e98c731d..5b243e8f0e 100644
--- a/dev/breeze/tests/test_run_utils.py
+++ b/dev/breeze/tests/test_run_utils.py
@@ -21,7 +21,6 @@ import stat
from airflow_breeze.utils.run_utils import (
change_directory_permission,
change_file_permission,
- filter_out_none,
)
@@ -44,10 +43,3 @@ def test_change_directory_permission(tmp_path):
and (mode & stat.S_IXGRP)
and (mode & stat.S_IXOTH)
)
-
-
-def test_filter_out_none():
- dict_input_with_none = {"sample": None, "sample1": "One", "sample2": "Two", "samplen": None}
- expected_dict_output = {"sample1": "One", "sample2": "Two"}
- output_dict = filter_out_none(**dict_input_with_none)
- assert output_dict == expected_dict_output
diff --git a/images/breeze/output_ci-image_build.txt b/images/breeze/output_ci-image_build.txt
index f7f8699294..ef0bd73071 100644
--- a/images/breeze/output_ci-image_build.txt
+++ b/images/breeze/output_ci-image_build.txt
@@ -1 +1 @@
-68b9aef6374f30b1186afc6160e376b5
+6a130b347fa7137782ee7e0c6287c6a1
diff --git a/images/breeze/output_prod-image_build.txt b/images/breeze/output_prod-image_build.txt
index f855f15f03..f78db4ceba 100644
--- a/images/breeze/output_prod-image_build.txt
+++ b/images/breeze/output_prod-image_build.txt
@@ -1 +1 @@
-9f21108a81b471ca20972af0a577fb85
+9590fde87467c3a97ef5a0bc37fae8bb
diff --git a/images/breeze/output_release-management_generate-constraints.svg b/images/breeze/output_release-management_generate-constraints.svg
index 33caf14d07..b8bc2f4b31 100644
--- a/images/breeze/output_release-management_generate-constraints.svg
+++ b/images/breeze/output_release-management_generate-constraints.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 952.8" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 928.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-generate-constraints-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="901.8" />
+ <rect x="0" y="0" width="1463.0" height="877.4" />
</clipPath>
<clipPath id="breeze-release-management-generate-constraints-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -150,12 +150,9 @@
<clipPath id="breeze-release-management-generate-constraints-line-34">
<rect x="0" y="831.1" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-generate-constraints-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="950.8" rx="8"/><text class="breeze-release-management-generate-constraints-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management generate-constraints</text>
+ <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-release-management-generate-constraints-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management generate-constraints</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -184,24 +181,23 @@
</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-16)">│</text><text class="breeze-release-management-generate-constraints-r1" x="414.8" y="410.4" textLength="1024.8" clip-path="url(#breeze-release-management-generate-constraints-line-16)">current_version and should be installed in CI from locally built packages  [...]
</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-17)">│</text><text class="breeze-release-management-generate-constraints-r1" x="414.8" y="434.8" textLength="1024.8" clip-path="url(#breeze-release-management-generate-constraints-line-17)">current_version.dev0                  & [...]
</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-18)">│</text><text class="breeze-release-management-generate-constraints-r6" x="414.8" y="459.2" textLength="1024.8" clip-path="url(#breeze-release-management-generate-constraints-line-18)">(TEXT)                     [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-19)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-19)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="483.6" textLength="73.2" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-20)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-20)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="508" textLength="85.4" clip-path="url(#breeze-releas [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="532.4" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-21)">
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="556.8" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-22)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="556.8" textLength="219.6" clip-path="url(#breeze-release-management-generate-constraints-line-22)"> Parallel running </text><text class="breeze-release-management-generate-constraints-r5" x="244" y="556.8" textLeng [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-23)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-23)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="581.2" textLength="48.8" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-24)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-24)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="605.6" textLength="146.4" clip-path="url(#breeze [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-25)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="630" textLength="915" clip-path="url(#breeze-release-management-generate-constraints-line-25)">[default: 4; 1<=x<=8]                 [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-26)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-26)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="654.4" textLength="85.4" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-27)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="678.8" textLength="951.6" clip-path="url(#breeze-release-management-generate-constraints-line-27)">[default: 3.8 3.9 3.10 3.11]              [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-28)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-28)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="703.2" textLength="61" clip-path="url(#breeze-re [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-29)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-29)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="727.6" textLength="73.2" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="752" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-30)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-30)">
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="776.4" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-31)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="776.4" textLength="195.2" clip-path="url(#breeze-release-management-generate-constraints-line-31)"> Common options </text><text class="breeze-release-management-generate-constraints-r5" x="219.6" y="776.4" textLeng [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-32)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-32)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="800.8" textLength="97.6" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-33)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-33)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="825.2" textLength="48.8" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-34)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-34)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="849.6" textLength="85.4" clip-path="url(#breeze- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-35)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-35)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="874" textLength="61" clip-path="url(#breeze-release- [...]
-</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="898.4" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-36)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-36)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-19)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-19)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="483.6" textLength="85.4" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="508" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-20)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-20)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="532.4" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-21)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="532.4" textLength="219.6" clip-path="url(#breeze-release-management-generate-constraints-line-21)"> Parallel running </text><text class="breeze-release-management-generate-constraints-r5" x="244" y="532.4" textLeng [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-22)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-22)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="556.8" textLength="48.8" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-23)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-23)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="581.2" textLength="146.4" clip-path="url(#breeze [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-24)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="605.6" textLength="915" clip-path="url(#breeze-release-management-generate-constraints-line-24)">[default: 4; 1<=x<=8]                 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-25)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-25)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="630" textLength="85.4" clip-path="url(#breeze-releas [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-26)">│</text><text class="breeze-release-management-generate-constraints-r5" x="280.6" y="654.4" textLength="951.6" clip-path="url(#breeze-release-management-generate-constraints-line-26)">[default: 3.8 3.9 3.10 3.11]              [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-27)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-27)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="678.8" textLength="61" clip-path="url(#breeze-re [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-28)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-28)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="703.2" textLength="73.2" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="727.6" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-29)">
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="752" textLength="24.4" clip-path="url(#breeze-release-management-generate-constraints-line-30)">â•─</text><text class="breeze-release-management-generate-constraints-r5" x="24.4" y="752" textLength="195.2" clip-path="url(#breeze-release-management-generate-constraints-line-30)"> Common options </text><text class="breeze-release-management-generate-constraints-r5" x="219.6" y="752" textLength="12 [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-31)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-31)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="776.4" textLength="97.6" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-32)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-32)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="800.8" textLength="48.8" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-33)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-33)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="825.2" textLength="85.4" clip-path="url(#breeze- [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-34)">│</text><text class="breeze-release-management-generate-constraints-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-34)">-</text><text class="breeze-release-management-generate-constraints-r4" x="36.6" y="849.6" textLength="61" clip-path="url(#breeze-re [...]
+</text><text class="breeze-release-management-generate-constraints-r5" x="0" y="874" textLength="1464" clip-path="url(#breeze-release-management-generate-constraints-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-generate-constraints-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-release-management-generate-constraints-line-35)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_generate-constraints.txt b/images/breeze/output_release-management_generate-constraints.txt
index 747223f960..89a36cb1b1 100644
--- a/images/breeze/output_release-management_generate-constraints.txt
+++ b/images/breeze/output_release-management_generate-constraints.txt
@@ -1 +1 @@
-8056e81608e5118d616a829c01a8a1e1
+12f58e0c47b7533b91e547f33c79d4cb
diff --git a/images/breeze/output_release-management_install-provider-packages.svg b/images/breeze/output_release-management_install-provider-packages.svg
index e767f998b5..42a8725c29 100644
--- a/images/breeze/output_release-management_install-provider-packages.svg
+++ b/images/breeze/output_release-management_install-provider-packages.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1611.6" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1587.1999999999998" 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-install-provider-packages-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1560.6" />
+ <rect x="0" y="0" width="1463.0" height="1536.1999999999998" />
</clipPath>
<clipPath id="breeze-release-management-install-provider-packages-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -231,12 +231,9 @@
<clipPath id="breeze-release-management-install-provider-packages-line-61">
<rect x="0" y="1489.9" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-install-provider-packages-line-62">
- <rect x="0" y="1514.3" 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="1609.6" rx="8"/><text class="breeze-release-management-install-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management install-provider-packages</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1585.2" rx="8"/><text class="breeze-release-management-install-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management install-provider-packages</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -259,57 +256,56 @@
</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-10)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="329.4" y="264" textLength="1110.2" clip-path="url(#breeze-release-management-install-provider-packages-line-10)">(selected | all | skip | remove)         [...]
</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-11)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="329.4" y="288.4" textLength="1110.2" clip-path="url(#breeze-release-management-install-provider-packages-line-11)">[default: selected]              & [...]
</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-12)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-12)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="312.8" textLength="85.4 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-13)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-13)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="337.2" textLength="73.2 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="361.6" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-14)">
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="386" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-15)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="386" textLength="512.4" clip-path="url(#breeze-release-management-install-provider-packages-line-15)"> Installing packages after entering shell </text><text class="breeze-release-managem [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-16)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-16)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="410.4" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-17)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="434.8" textLength="902.8" clip-path="url(#breeze-release-management-install-provider-packages-line-17)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-18)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-18)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="459.2" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-19)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="483.6" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-19)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class= [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-20)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="508" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-20)">[default: constraints-source-providers]            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="532.4" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">constraints URL). Can be 'default' in which case the de [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="581.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">constraints-reference is used.            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="605.6" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="654.4" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="678.8" textLength="97.6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="475.8" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="488" y="703.2" textLength="48.8 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="727.6" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="752" textLength="97.6" clip [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="776.4" textLength="658.8" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">[default: wheel]                [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="800.8" textLength="122" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="825.2" textLength="927.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">(TEXT)                 &# [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="849.6" textLength="122" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="874" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="bre [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="898.4" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">[default: constraints-source-providers]            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="922.8" textLength="122" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">constraints URL). Can be 'default' in which case the de [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="971.6" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">constraints-reference is used.            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="996" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">(TEXT)                   [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1020.4" textLength="1 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1044.8" textLength="4 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1069.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1093.6" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/) [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1118" textLength="97.6" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">Implies </text><text class="breeze-release-management-install-provider-packages-r4" x="573.4" y="1118" textL [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="1142.4" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">(none | wheel | sdist | <airflow_version>)      [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-47)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-47)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1166.8" textLength="4 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-48)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1191.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-48)">folder when entering breeze.            [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1215.6" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-49)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1240" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-50)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1240" textLength="219.6" clip-path="url(#breeze-release-management-install-provider-packages-line-50)"> Parallel running </text><text class="breeze-release-management-install-provider-packages-r5" x=" [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1264.4" textLength="4 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1288.8" textLength="1 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="378.2" y="1313.2" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">(INTEGER RANGE)                [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="378.2" y="1337.6" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">[default: 4; 1<=x<=8]            & [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1362" textLength="61" cli [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-56)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-56)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1386.4" textLength="9 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-57)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1410.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-57)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1410.8" textLength="7 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1435.2" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1459.6" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-59)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1459.6" textLength="195.2" clip-path="url(#breeze-release-management-install-provider-packages-line-59)"> Common options </text><text class="breeze-release-management-install-provider-packages-r5" x [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1484" textLength="48.8" c [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-61)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-61)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1508.4" textLength="9 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-62)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1532.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-62)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1532.8" textLength="6 [...]
-</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1557.2" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1557.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-13)">
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-14)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="361.6" textLength="512.4" clip-path="url(#breeze-release-management-install-provider-packages-line-14)"> Installing packages after entering shell </text><text class="breeze-release-man [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-15)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="386" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-15)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="386" textLength="97.6" clip [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-16)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="410.4" textLength="902.8" clip-path="url(#breeze-release-management-install-provider-packages-line-16)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-17)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-17)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="434.8" textLength="97.6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-18)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="459.2" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-18)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class= [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-19)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="483.6" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-19)">[default: constraints-source-providers]            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-20)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-20)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="508" textLength="97.6" clip [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="532.4" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-21)">constraints URL). Can be 'default' in which case the de [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-22)">constraints-reference is used.            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="581.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-23)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-24)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="605.6" textLength="97.6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-25)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-26)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="654.4" textLength="97.6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="475.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-27)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="488" y="678.8" textLength="48.8 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="703.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-28)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-29)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="727.6" textLength="97.6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="752" textLength="658.8" clip-path="url(#breeze-release-management-install-provider-packages-line-30)">[default: wheel]                [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-31)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="776.4" textLength="122" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="800.8" textLength="927.2" clip-path="url(#breeze-release-management-install-provider-packages-line-32)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-33)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="825.2" textLength="122" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="849.6" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-34)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class= [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="475.8" y="874" textLength="866.2" clip-path="url(#breeze-release-management-install-provider-packages-line-35)">[default: constraints-source-providers]            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-36)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="898.4" textLength="122" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="922.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-37)">constraints URL). Can be 'default' in which case the de [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-38)">constraints-reference is used.            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="971.6" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-39)">(TEXT)                 &# [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="996" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-40)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="996" textLength="122" clip- [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-41)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1020.4" textLength="4 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1044.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-42)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1069.2" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-43)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/) [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1093.6" textLength="97.6" clip-path="url(#breeze-release-management-install-provider-packages-line-44)">Implies </text><text class="breeze-release-management-install-provider-packages-r4" x="573.4" y="1093.6" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="475.8" y="1118" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-45)">(none | wheel | sdist | <airflow_version>)      [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-46)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1142.4" textLength="4 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-47)">│</text><text class="breeze-release-management-install-provider-packages-r1" x="475.8" y="1166.8" textLength="963.8" clip-path="url(#breeze-release-management-install-provider-packages-line-47)">folder when entering breeze.            [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1191.2" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1215.6" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-49)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1215.6" textLength="219.6" clip-path="url(#breeze-release-management-install-provider-packages-line-49)"> Parallel running </text><text class="breeze-release-management-install-provider-packages-r5" [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-50)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-50)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1240" textLength="48.8" c [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-51)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1264.4" textLength="1 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">│</text><text class="breeze-release-management-install-provider-packages-r7" x="378.2" y="1288.8" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-52)">(INTEGER RANGE)                [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">│</text><text class="breeze-release-management-install-provider-packages-r5" x="378.2" y="1313.2" textLength="915" clip-path="url(#breeze-release-management-install-provider-packages-line-53)">[default: 4; 1<=x<=8]            & [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-54)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1337.6" textLength="6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1362" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-55)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1362" textLength="97.6" c [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-56)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1386.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-56)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1386.4" textLength="7 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1410.8" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1435.2" textLength="24.4" clip-path="url(#breeze-release-management-install-provider-packages-line-58)">â•─</text><text class="breeze-release-management-install-provider-packages-r5" x="24.4" y="1435.2" textLength="195.2" clip-path="url(#breeze-release-management-install-provider-packages-line-58)"> Common options </text><text class="breeze-release-management-install-provider-packages-r5" x [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-59)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1459.6" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-59)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1459.6" textLength="4 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1484" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-60)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1484" textLength="97.6" c [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-61)">│</text><text class="breeze-release-management-install-provider-packages-r4" x="24.4" y="1508.4" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-line-61)">-</text><text class="breeze-release-management-install-provider-packages-r4" x="36.6" y="1508.4" textLength="6 [...]
+</text><text class="breeze-release-management-install-provider-packages-r5" x="0" y="1532.8" textLength="1464" clip-path="url(#breeze-release-management-install-provider-packages-line-62)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-install-provider-packages-r1" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-release-management-install-provider-packages-l [...]
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_install-provider-packages.txt b/images/breeze/output_release-management_install-provider-packages.txt
index 723cd3f280..917fddb9a7 100644
--- a/images/breeze/output_release-management_install-provider-packages.txt
+++ b/images/breeze/output_release-management_install-provider-packages.txt
@@ -1 +1 @@
-de14ceff93da9b803738734dd64281d9
+71725748176f8e86b78433c6ab8fa698
diff --git a/images/breeze/output_release-management_verify-provider-packages.svg b/images/breeze/output_release-management_verify-provider-packages.svg
index 2e5d883d65..b755651de8 100644
--- a/images/breeze/output_release-management_verify-provider-packages.svg
+++ b/images/breeze/output_release-management_verify-provider-packages.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1392.0" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1367.6" 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-verify-provider-packages-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="1341.0" />
+ <rect x="0" y="0" width="1463.0" height="1316.6" />
</clipPath>
<clipPath id="breeze-release-management-verify-provider-packages-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -204,12 +204,9 @@
<clipPath id="breeze-release-management-verify-provider-packages-line-52">
<rect x="0" y="1270.3" width="1464" height="24.65"/>
</clipPath>
-<clipPath id="breeze-release-management-verify-provider-packages-line-53">
- <rect x="0" y="1294.7" 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="1390" rx="8"/><text class="breeze-release-management-verify-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management verify-provider-packages</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1365.6" rx="8"/><text class="breeze-release-management-verify-provider-packages-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command: release-management verify-provider-packages</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -232,48 +229,47 @@
</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-10)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="329.4" y="264" textLength="1110.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-10)">(selected | all | skip | remove)         & [...]
</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-11)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="329.4" y="288.4" textLength="1110.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-11)">[default: selected]                [...]
</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-12)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="312.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-12)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="312.8" textLength="85.4" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-13)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-13)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="337.2" textLength="73.2" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="361.6" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-14)">
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="386" textLength="24.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-15)">â•─</text><text class="breeze-release-management-verify-provider-packages-r5" x="24.4" y="386" textLength="512.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-15)"> Installing packages after entering shell </text><text class="breeze-release-management- [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-16)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-16)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="410.4" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-17)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="434.8" textLength="902.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-17)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-18)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-18)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="459.2" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-19)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="483.6" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-19)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="bre [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-20)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="508" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-20)">[default: constraints-source-providers]            &# [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="532.4" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">constraints URL). Can be 'default' in which case the defaul [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="581.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">constraints-reference is used.            &# [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="605.6" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip-path [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="654.4" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="678.8" textLength="97.6" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="475.8" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="488" y="703.2" textLength="48.8" cli [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="727.6" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="752" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="752" textLength="97.6" clip-path [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="776.4" textLength="658.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">[default: wheel]                [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="800.8" textLength="122" clip [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="825.2" textLength="927.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="849.6" textLength="122" clip [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="874" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze- [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="898.4" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">[default: constraints-source-providers]            [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="922.8" textLength="122" clip [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">constraints URL). Can be 'default' in which case the defaul [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="971.6" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">constraints-reference is used.            &# [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="996" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">(TEXT)                   [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1020.4" textLength="122" c [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1044.8" textLength="48.8" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1069.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1093.6" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</t [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1118" textLength="97.6" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">Implies </text><text class="breeze-release-management-verify-provider-packages-r4" x="573.4" y="1118" textLength [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="1142.4" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">(none | wheel | sdist | <airflow_version>)      [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1166.8" textLength="48.8" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1191.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)">folder when entering breeze.            [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1215.6" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)">
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1240" textLength="24.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)">â•─</text><text class="breeze-release-management-verify-provider-packages-r5" x="24.4" y="1240" textLength="195.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)"> Common options </text><text class="breeze-release-management-verify-provider-packages-r5" x="219.6" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1264.4" textLength="48.8" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1288.8" textLength="97.6" [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-53)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-53)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1313.2" textLength="61" cl [...]
-</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1337.6" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-54)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-54)">
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="337.2" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-13)">
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="361.6" textLength="24.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-14)">â•─</text><text class="breeze-release-management-verify-provider-packages-r5" x="24.4" y="361.6" textLength="512.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-14)"> Installing packages after entering shell </text><text class="breeze-release-managem [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-15)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="386" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-15)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="386" textLength="97.6" clip-path [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-16)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="410.4" textLength="902.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-16)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-17)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="434.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-17)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="434.8" textLength="97.6" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-18)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="459.2" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-18)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="bre [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-19)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="483.6" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-19)">[default: constraints-source-providers]            [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-20)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="508" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-20)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="508" textLength="97.6" clip-path [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="532.4" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-21)">constraints URL). Can be 'default' in which case the defaul [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="556.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-22)">constraints-reference is used.            &# [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="581.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-23)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="605.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-24)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="605.6" textLength="97.6" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="630" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-25)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="630" textLength="97.6" clip-path [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="654.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-26)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="654.4" textLength="97.6" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="475.8" y="678.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-27)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="488" y="678.8" textLength="48.8" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="703.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-28)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="727.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-29)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="727.6" textLength="97.6" cli [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="752" textLength="658.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-30)">[default: wheel]                & [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="776.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-31)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="776.4" textLength="122" clip [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="800.8" textLength="927.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-32)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="825.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-33)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="825.2" textLength="122" clip [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="849.6" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-34)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="bre [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">│</text><text class="breeze-release-management-verify-provider-packages-r5" x="475.8" y="874" textLength="866.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-35)">[default: constraints-source-providers]            &# [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="898.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-36)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="898.4" textLength="122" clip [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="922.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-37)">constraints URL). Can be 'default' in which case the defaul [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="947.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-38)">constraints-reference is used.            &# [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="971.6" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-39)">(TEXT)                   [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="996" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-40)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="996" textLength="122" clip-path= [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1020.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-41)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1020.4" textLength="48.8" [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1044.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-42)">install from PyPI), `none`, `wheel`, or `sdist` to install from [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1069.2" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-43)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</t [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1093.6" textLength="97.6" clip-path="url(#breeze-release-management-verify-provider-packages-line-44)">Implies </text><text class="breeze-release-management-verify-provider-packages-r4" x="573.4" y="1093.6" text [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">│</text><text class="breeze-release-management-verify-provider-packages-r7" x="475.8" y="1118" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-45)">(none | wheel | sdist | <airflow_version>)      &# [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1142.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-46)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1142.4" textLength="48.8" [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">│</text><text class="breeze-release-management-verify-provider-packages-r1" x="475.8" y="1166.8" textLength="963.8" clip-path="url(#breeze-release-management-verify-provider-packages-line-47)">folder when entering breeze.            [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1191.2" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-48)">
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1215.6" textLength="24.4" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)">â•─</text><text class="breeze-release-management-verify-provider-packages-r5" x="24.4" y="1215.6" textLength="195.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-49)"> Common options </text><text class="breeze-release-management-verify-provider-packages-r5" x="219 [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1240" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-50)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1240" textLength="48.8" clip-p [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1264.4" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-51)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1264.4" textLength="97.6" [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">│</text><text class="breeze-release-management-verify-provider-packages-r4" x="24.4" y="1288.8" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-52)">-</text><text class="breeze-release-management-verify-provider-packages-r4" x="36.6" y="1288.8" textLength="61" cl [...]
+</text><text class="breeze-release-management-verify-provider-packages-r5" x="0" y="1313.2" textLength="1464" clip-path="url(#breeze-release-management-verify-provider-packages-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-release-management-verify-provider-packages-r1" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-release-management-verify-provider-packages-line-53)">
</text>
</g>
</g>
diff --git a/images/breeze/output_release-management_verify-provider-packages.txt b/images/breeze/output_release-management_verify-provider-packages.txt
index 0907858867..1ab9de67fc 100644
--- a/images/breeze/output_release-management_verify-provider-packages.txt
+++ b/images/breeze/output_release-management_verify-provider-packages.txt
@@ -1 +1 @@
-2e0110b5d8b7ee154ce1410455da175b
+505041dc3cf367fe381126db0b62c4a5
diff --git a/images/breeze/output_shell.svg b/images/breeze/output_shell.svg
index e7864d2fe1..8027ed2fe2 100644
--- a/images/breeze/output_shell.svg
+++ b/images/breeze/output_shell.svg
@@ -502,49 +502,49 @@
</text><text class="breeze-shell-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-shell-line-76)">│</text><text class="breeze-shell-r1" x="475.8" y="1874.4" textLength="963.8" clip-path="url(#breeze-shell-line-76)">constraints-reference is used.                                     &# [...]
</text><text class="breeze-shell-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-shell-line-77)">│</text><text class="breeze-shell-r7" x="475.8" y="1898.8" textLength="963.8" clip-path="url(#breeze-shell-line-77)">(TEXT)                                            [...]
</text><text class="breeze-shell-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">│</text><text class="breeze-shell-r4" x="24.4" y="1923.2" textLength="12.2" clip-path="url(#breeze-shell-line-78)">-</text><text class="breeze-shell-r4" x="36.6" y="1923.2" textLength="97.6" clip-path="url(#breeze-shell-line-78)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="1923.2" textLength="85.4" clip-path="url(#breeze-shell-line-78)">-extras</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r4" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">-</text><text class="breeze-shell-r4" x="36.6" y="1947.6" textLength="97.6" clip-path="url(#breeze-shell-line-79)">-install</text><text class="breeze-shell-r4" x="134.2" y="1947.6" textLength="231.8" clip-path="url(#breeze-shell-line-79)">-selected-providers</text>< [...]
-</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r4" x="475.8" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">-</text><text class="breeze-shell-r4" x="488" y="1972" textLength="48.8" clip-path="url(#breeze-shell-line-80)">-use</text><text class="breeze-shell-r4" x="536.8" y="1972" textLength="231.8" clip-path="url(#breeze-shell-line-80)">-packages-from-dist</text><text class=" [...]
-</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">│</text><text class="breeze-shell-r7" x="475.8" y="1996.4" textLength="963.8" clip-path="url(#breeze-shell-line-81)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">│</text><text class="breeze-shell-r4" x="24.4" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">-</text><text class="breeze-shell-r4" x="36.6" y="2020.8" textLength="97.6" clip-path="url(#breeze-shell-line-82)">-package</text><text class="breeze-shell-r4" x="134.2" y="2020.8" textLength="85.4" clip-path="url(#breeze-shell-line-82)">-format</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">│</text><text class="breeze-shell-r5" x="475.8" y="2045.2" textLength="658.8" clip-path="url(#breeze-shell-line-83)">[default: wheel]                                      </text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">│</text><text class="breeze-shell-r4" x="24.4" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">-</text><text class="breeze-shell-r4" x="36.6" y="2069.6" textLength="122" clip-path="url(#breeze-shell-line-84)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2069.6" textLength="256.2" clip-path="url(#breeze-shell-line-84)">-constraints-location</tex [...]
-</text><text class="breeze-shell-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">│</text><text class="breeze-shell-r7" x="475.8" y="2094" textLength="927.2" clip-path="url(#breeze-shell-line-85)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">│</text><text class="breeze-shell-r4" x="24.4" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">-</text><text class="breeze-shell-r4" x="36.6" y="2118.4" textLength="122" clip-path="url(#breeze-shell-line-86)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2118.4" textLength="207.4" clip-path="url(#breeze-shell-line-86)">-constraints-mode</text><t [...]
-</text><text class="breeze-shell-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r7" x="475.8" y="2142.8" textLength="866.2" clip-path="url(#breeze-shell-line-87)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-shell-r5" x="1451.8" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r1" x="1464" y="2142.8" [...]
-</text><text class="breeze-shell-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r5" x="475.8" y="2167.2" textLength="866.2" clip-path="url(#breeze-shell-line-88)">[default: constraints-source-providers]                                </text><text class="breeze-s [...]
-</text><text class="breeze-shell-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">│</text><text class="breeze-shell-r4" x="24.4" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">-</text><text class="breeze-shell-r4" x="36.6" y="2191.6" textLength="122" clip-path="url(#breeze-shell-line-89)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2191.6" textLength="268.4" clip-path="url(#breeze-shell-line-89)">-constraints-reference</te [...]
-</text><text class="breeze-shell-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">│</text><text class="breeze-shell-r1" x="475.8" y="2216" textLength="963.8" clip-path="url(#breeze-shell-line-90)">constraints URL). Can be 'default' in which case the default                   </text><text class="breeze-shell-r5" x= [...]
-</text><text class="breeze-shell-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-shell-line-91)">│</text><text class="breeze-shell-r1" x="475.8" y="2240.4" textLength="963.8" clip-path="url(#breeze-shell-line-91)">constraints-reference is used.                                     &# [...]
-</text><text class="breeze-shell-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-shell-line-92)">│</text><text class="breeze-shell-r7" x="475.8" y="2264.8" textLength="963.8" clip-path="url(#breeze-shell-line-92)">(TEXT)                                            [...]
-</text><text class="breeze-shell-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">│</text><text class="breeze-shell-r4" x="24.4" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">-</text><text class="breeze-shell-r4" x="36.6" y="2289.2" textLength="48.8" clip-path="url(#breeze-shell-line-93)">-use</text><text class="breeze-shell-r4" x="85.4" y="2289.2" textLength="195.2" clip-path="url(#breeze-shell-line-93)">-airflow-version</text><text cla [...]
-</text><text class="breeze-shell-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">│</text><text class="breeze-shell-r1" x="475.8" y="2313.6" textLength="963.8" clip-path="url(#breeze-shell-line-94)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-shell-r5" x="1451.8" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">│</text>< [...]
-</text><text class="breeze-shell-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r1" x="475.8" y="2338" textLength="963.8" clip-path="url(#breeze-shell-line-95)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-shell-r5" x="1451.8" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r1" x="1464 [...]
-</text><text class="breeze-shell-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text><text class="breeze-shell-r1" x="475.8" y="2362.4" textLength="97.6" clip-path="url(#breeze-shell-line-96)">Implies </text><text class="breeze-shell-r4" x="573.4" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">-</text><text class="breeze-shell-r4" x="585.6" y="2362.4" textLength="73.2" clip-path="url(#breeze-shell-line-96)">-mount</text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r7" x="475.8" y="2386.8" textLength="963.8" clip-path="url(#breeze-shell-line-97)">(none | wheel | sdist | <airflow_version>)                                [...]
-</text><text class="breeze-shell-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">│</text><text class="breeze-shell-r4" x="24.4" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">-</text><text class="breeze-shell-r4" x="36.6" y="2411.2" textLength="48.8" clip-path="url(#breeze-shell-line-98)">-use</text><text class="breeze-shell-r4" x="85.4" y="2411.2" textLength="231.8" clip-path="url(#breeze-shell-line-98)">-packages-from-dist</text><text [...]
-</text><text class="breeze-shell-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">│</text><text class="breeze-shell-r1" x="475.8" y="2435.6" textLength="963.8" clip-path="url(#breeze-shell-line-99)">folder when entering breeze.                                      [...]
-</text><text class="breeze-shell-r5" x="0" y="2460" textLength="1464" clip-path="url(#breeze-shell-line-100)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">
-</text><text class="breeze-shell-r5" x="0" y="2484.4" textLength="24.4" clip-path="url(#breeze-shell-line-101)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2484.4" textLength="500.2" clip-path="url(#breeze-shell-line-101)"> Upgrading/downgrading selected packages </text><text class="breeze-shell-r5" x="524.6" y="2484.4" textLength="915" clip-path="url(#breeze-shell-line-101)">───────────────────────────────────────────────────────────────────────────</text><tex [...]
-</text><text class="breeze-shell-r5" x="0" y="2508.8" textLength="12.2" clip-path="url(#breeze-shell-line-102)">│</text><text class="breeze-shell-r4" x="24.4" y="2508.8" textLength="12.2" clip-path="url(#breeze-shell-line-102)">-</text><text class="breeze-shell-r4" x="36.6" y="2508.8" textLength="97.6" clip-path="url(#breeze-shell-line-102)">-upgrade</text><text class="breeze-shell-r4" x="134.2" y="2508.8" textLength="61" clip-path="url(#breeze-shell-line-102)">-boto</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="2533.2" textLength="12.2" clip-path="url(#breeze-shell-line-103)">│</text><text class="breeze-shell-r4" x="24.4" y="2533.2" textLength="12.2" clip-path="url(#breeze-shell-line-103)">-</text><text class="breeze-shell-r4" x="36.6" y="2533.2" textLength="122" clip-path="url(#breeze-shell-line-103)">-downgrade</text><text class="breeze-shell-r4" x="158.6" y="2533.2" textLength="134.2" clip-path="url(#breeze-shell-line-103)">-sqlalchemy</text><tex [...]
-</text><text class="breeze-shell-r5" x="0" y="2557.6" textLength="1464" clip-path="url(#breeze-shell-line-104)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">
-</text><text class="breeze-shell-r5" x="0" y="2582" textLength="24.4" clip-path="url(#breeze-shell-line-105)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2582" textLength="183" clip-path="url(#breeze-shell-line-105)"> DB test flags </text><text class="breeze-shell-r5" x="207.4" y="2582" textLength="1232.2" clip-path="url(#breeze-shell-line-105)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cla [...]
-</text><text class="breeze-shell-r5" x="0" y="2606.4" textLength="12.2" clip-path="url(#breeze-shell-line-106)">│</text><text class="breeze-shell-r4" x="24.4" y="2606.4" textLength="12.2" clip-path="url(#breeze-shell-line-106)">-</text><text class="breeze-shell-r4" x="36.6" y="2606.4" textLength="48.8" clip-path="url(#breeze-shell-line-106)">-run</text><text class="breeze-shell-r4" x="85.4" y="2606.4" textLength="170.8" clip-path="url(#breeze-shell-line-106)">-db-tests-only</text><text c [...]
-</text><text class="breeze-shell-r5" x="0" y="2630.8" textLength="12.2" clip-path="url(#breeze-shell-line-107)">│</text><text class="breeze-shell-r4" x="24.4" y="2630.8" textLength="12.2" clip-path="url(#breeze-shell-line-107)">-</text><text class="breeze-shell-r4" x="36.6" y="2630.8" textLength="61" clip-path="url(#breeze-shell-line-107)">-skip</text><text class="breeze-shell-r4" x="97.6" y="2630.8" textLength="109.8" clip-path="url(#breeze-shell-line-107)">-db-tests</text><text class=" [...]
-</text><text class="breeze-shell-r5" x="0" y="2655.2" textLength="1464" clip-path="url(#breeze-shell-line-108)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">
-</text><text class="breeze-shell-r5" x="0" y="2679.6" textLength="24.4" clip-path="url(#breeze-shell-line-109)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2679.6" textLength="183" clip-path="url(#breeze-shell-line-109)"> Other options </text><text class="breeze-shell-r5" x="207.4" y="2679.6" textLength="1232.2" clip-path="url(#breeze-shell-line-109)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
-</text><text class="breeze-shell-r5" x="0" y="2704" textLength="12.2" clip-path="url(#breeze-shell-line-110)">│</text><text class="breeze-shell-r4" x="24.4" y="2704" textLength="12.2" clip-path="url(#breeze-shell-line-110)">-</text><text class="breeze-shell-r4" x="36.6" y="2704" textLength="97.6" clip-path="url(#breeze-shell-line-110)">-forward</text><text class="breeze-shell-r4" x="134.2" y="2704" textLength="146.4" clip-path="url(#breeze-shell-line-110)">-credentials</text><text class= [...]
-</text><text class="breeze-shell-r5" x="0" y="2728.4" textLength="12.2" clip-path="url(#breeze-shell-line-111)">│</text><text class="breeze-shell-r4" x="24.4" y="2728.4" textLength="12.2" clip-path="url(#breeze-shell-line-111)">-</text><text class="breeze-shell-r4" x="36.6" y="2728.4" textLength="48.8" clip-path="url(#breeze-shell-line-111)">-max</text><text class="breeze-shell-r4" x="85.4" y="2728.4" textLength="61" clip-path="url(#breeze-shell-line-111)">-time</text><text class="breeze [...]
-</text><text class="breeze-shell-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">│</text><text class="breeze-shell-r7" x="353.8" y="2752.8" textLength="1049.2" clip-path="url(#breeze-shell-line-112)">(INTEGER RANGE)                                        & [...]
-</text><text class="breeze-shell-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">│</text><text class="breeze-shell-r4" x="24.4" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">-</text><text class="breeze-shell-r4" x="36.6" y="2777.2" textLength="97.6" clip-path="url(#breeze-shell-line-113)">-verbose</text><text class="breeze-shell-r4" x="134.2" y="2777.2" textLength="109.8" clip-path="url(#breeze-shell-line-113)">-commands</text><text c [...]
-</text><text class="breeze-shell-r5" x="0" y="2801.6" textLength="1464" clip-path="url(#breeze-shell-line-114)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">
-</text><text class="breeze-shell-r5" x="0" y="2826" textLength="24.4" clip-path="url(#breeze-shell-line-115)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2826" textLength="195.2" clip-path="url(#breeze-shell-line-115)"> Common options </text><text class="breeze-shell-r5" x="219.6" y="2826" textLength="1220" clip-path="url(#breeze-shell-line-115)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="b [...]
-</text><text class="breeze-shell-r5" x="0" y="2850.4" textLength="12.2" clip-path="url(#breeze-shell-line-116)">│</text><text class="breeze-shell-r4" x="24.4" y="2850.4" textLength="12.2" clip-path="url(#breeze-shell-line-116)">-</text><text class="breeze-shell-r4" x="36.6" y="2850.4" textLength="97.6" clip-path="url(#breeze-shell-line-116)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="2850.4" textLength="207.4" clip-path="url(#breeze-shell-line-116)">-skip-constraints</text [...]
-</text><text class="breeze-shell-r5" x="0" y="2874.8" textLength="12.2" clip-path="url(#breeze-shell-line-117)">│</text><text class="breeze-shell-r4" x="24.4" y="2874.8" textLength="12.2" clip-path="url(#breeze-shell-line-117)">-</text><text class="breeze-shell-r4" x="36.6" y="2874.8" textLength="85.4" clip-path="url(#breeze-shell-line-117)">-answer</text><text class="breeze-shell-r6" x="390.4" y="2874.8" textLength="24.4" clip-path="url(#breeze-shell-line-117)">-a</text><text class="bre [...]
-</text><text class="breeze-shell-r5" x="0" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">│</text><text class="breeze-shell-r4" x="24.4" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">-</text><text class="breeze-shell-r4" x="36.6" y="2899.2" textLength="48.8" clip-path="url(#breeze-shell-line-118)">-dry</text><text class="breeze-shell-r4" x="85.4" y="2899.2" textLength="48.8" clip-path="url(#breeze-shell-line-118)">-run</text><text class="breez [...]
-</text><text class="breeze-shell-r5" x="0" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">│</text><text class="breeze-shell-r4" x="24.4" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">-</text><text class="breeze-shell-r4" x="36.6" y="2923.6" textLength="122" clip-path="url(#breeze-shell-line-119)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2923.6" textLength="207.4" clip-path="url(#breeze-shell-line-119)">-skip-constraints</tex [...]
-</text><text class="breeze-shell-r5" x="0" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">│</text><text class="breeze-shell-r4" x="24.4" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">-</text><text class="breeze-shell-r4" x="36.6" y="2948" textLength="97.6" clip-path="url(#breeze-shell-line-120)">-verbose</text><text class="breeze-shell-r6" x="390.4" y="2948" textLength="24.4" clip-path="url(#breeze-shell-line-120)">-v</text><text class="breeze-she [...]
-</text><text class="breeze-shell-r5" x="0" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">│</text><text class="breeze-shell-r4" x="24.4" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">-</text><text class="breeze-shell-r4" x="36.6" y="2972.4" textLength="61" clip-path="url(#breeze-shell-line-121)">-help</text><text class="breeze-shell-r6" x="390.4" y="2972.4" textLength="24.4" clip-path="url(#breeze-shell-line-121)">-h</text><text class="breeze- [...]
+</text><text class="breeze-shell-r5" x="0" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">│</text><text class="breeze-shell-r4" x="24.4" y="1947.6" textLength="12.2" clip-path="url(#breeze-shell-line-79)">-</text><text class="breeze-shell-r4" x="36.6" y="1947.6" textLength="97.6" clip-path="url(#breeze-shell-line-79)">-airflow</text><text class="breeze-shell-r4" x="134.2" y="1947.6" textLength="207.4" clip-path="url(#breeze-shell-line-79)">-skip-constraints</text><te [...]
+</text><text class="breeze-shell-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">│</text><text class="breeze-shell-r4" x="24.4" y="1972" textLength="12.2" clip-path="url(#breeze-shell-line-80)">-</text><text class="breeze-shell-r4" x="36.6" y="1972" textLength="97.6" clip-path="url(#breeze-shell-line-80)">-install</text><text class="breeze-shell-r4" x="134.2" y="1972" textLength="231.8" clip-path="url(#breeze-shell-line-80)">-selected-providers</text><text cla [...]
+</text><text class="breeze-shell-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">│</text><text class="breeze-shell-r4" x="475.8" y="1996.4" textLength="12.2" clip-path="url(#breeze-shell-line-81)">-</text><text class="breeze-shell-r4" x="488" y="1996.4" textLength="48.8" clip-path="url(#breeze-shell-line-81)">-use</text><text class="breeze-shell-r4" x="536.8" y="1996.4" textLength="231.8" clip-path="url(#breeze-shell-line-81)">-packages-from-dist</text><text [...]
+</text><text class="breeze-shell-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-shell-line-82)">│</text><text class="breeze-shell-r7" x="475.8" y="2020.8" textLength="963.8" clip-path="url(#breeze-shell-line-82)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">│</text><text class="breeze-shell-r4" x="24.4" y="2045.2" textLength="12.2" clip-path="url(#breeze-shell-line-83)">-</text><text class="breeze-shell-r4" x="36.6" y="2045.2" textLength="97.6" clip-path="url(#breeze-shell-line-83)">-package</text><text class="breeze-shell-r4" x="134.2" y="2045.2" textLength="85.4" clip-path="url(#breeze-shell-line-83)">-format</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-shell-line-84)">│</text><text class="breeze-shell-r5" x="475.8" y="2069.6" textLength="658.8" clip-path="url(#breeze-shell-line-84)">[default: wheel]                                      </text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">│</text><text class="breeze-shell-r4" x="24.4" y="2094" textLength="12.2" clip-path="url(#breeze-shell-line-85)">-</text><text class="breeze-shell-r4" x="36.6" y="2094" textLength="122" clip-path="url(#breeze-shell-line-85)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2094" textLength="256.2" clip-path="url(#breeze-shell-line-85)">-constraints-location</text><text [...]
+</text><text class="breeze-shell-r5" x="0" y="2118.4" textLength="12.2" clip-path="url(#breeze-shell-line-86)">│</text><text class="breeze-shell-r7" x="475.8" y="2118.4" textLength="927.2" clip-path="url(#breeze-shell-line-86)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">│</text><text class="breeze-shell-r4" x="24.4" y="2142.8" textLength="12.2" clip-path="url(#breeze-shell-line-87)">-</text><text class="breeze-shell-r4" x="36.6" y="2142.8" textLength="122" clip-path="url(#breeze-shell-line-87)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2142.8" textLength="207.4" clip-path="url(#breeze-shell-line-87)">-constraints-mode</text><t [...]
+</text><text class="breeze-shell-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r7" x="475.8" y="2167.2" textLength="866.2" clip-path="url(#breeze-shell-line-88)">(constraints-source-providers | constraints | constraints-no-providers)</text><text class="breeze-shell-r5" x="1451.8" y="2167.2" textLength="12.2" clip-path="url(#breeze-shell-line-88)">│</text><text class="breeze-shell-r1" x="1464" y="2167.2" [...]
+</text><text class="breeze-shell-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-shell-line-89)">│</text><text class="breeze-shell-r5" x="475.8" y="2191.6" textLength="866.2" clip-path="url(#breeze-shell-line-89)">[default: constraints-source-providers]                                </text><text class="breeze-s [...]
+</text><text class="breeze-shell-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">│</text><text class="breeze-shell-r4" x="24.4" y="2216" textLength="12.2" clip-path="url(#breeze-shell-line-90)">-</text><text class="breeze-shell-r4" x="36.6" y="2216" textLength="122" clip-path="url(#breeze-shell-line-90)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2216" textLength="268.4" clip-path="url(#breeze-shell-line-90)">-constraints-reference</text><text [...]
+</text><text class="breeze-shell-r5" x="0" y="2240.4" textLength="12.2" clip-path="url(#breeze-shell-line-91)">│</text><text class="breeze-shell-r1" x="475.8" y="2240.4" textLength="963.8" clip-path="url(#breeze-shell-line-91)">constraints URL). Can be 'default' in which case the default                   </text><text class="breeze-shell-r5 [...]
+</text><text class="breeze-shell-r5" x="0" y="2264.8" textLength="12.2" clip-path="url(#breeze-shell-line-92)">│</text><text class="breeze-shell-r1" x="475.8" y="2264.8" textLength="963.8" clip-path="url(#breeze-shell-line-92)">constraints-reference is used.                                     &# [...]
+</text><text class="breeze-shell-r5" x="0" y="2289.2" textLength="12.2" clip-path="url(#breeze-shell-line-93)">│</text><text class="breeze-shell-r7" x="475.8" y="2289.2" textLength="963.8" clip-path="url(#breeze-shell-line-93)">(TEXT)                                            [...]
+</text><text class="breeze-shell-r5" x="0" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">│</text><text class="breeze-shell-r4" x="24.4" y="2313.6" textLength="12.2" clip-path="url(#breeze-shell-line-94)">-</text><text class="breeze-shell-r4" x="36.6" y="2313.6" textLength="122" clip-path="url(#breeze-shell-line-94)">-providers</text><text class="breeze-shell-r4" x="158.6" y="2313.6" textLength="207.4" clip-path="url(#breeze-shell-line-94)">-skip-constraints</text><t [...]
+</text><text class="breeze-shell-r5" x="0" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">│</text><text class="breeze-shell-r4" x="24.4" y="2338" textLength="12.2" clip-path="url(#breeze-shell-line-95)">-</text><text class="breeze-shell-r4" x="36.6" y="2338" textLength="48.8" clip-path="url(#breeze-shell-line-95)">-use</text><text class="breeze-shell-r4" x="85.4" y="2338" textLength="195.2" clip-path="url(#breeze-shell-line-95)">-airflow-version</text><text class="bree [...]
+</text><text class="breeze-shell-r5" x="0" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text><text class="breeze-shell-r1" x="475.8" y="2362.4" textLength="963.8" clip-path="url(#breeze-shell-line-96)">install from PyPI), `none`, `wheel`, or `sdist` to install from `dist` folder, </text><text class="breeze-shell-r5" x="1451.8" y="2362.4" textLength="12.2" clip-path="url(#breeze-shell-line-96)">│</text>< [...]
+</text><text class="breeze-shell-r5" x="0" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r1" x="475.8" y="2386.8" textLength="963.8" clip-path="url(#breeze-shell-line-97)">or VCS URL to install from (https://pip.pypa.io/en/stable/topics/vcs-support/).</text><text class="breeze-shell-r5" x="1451.8" y="2386.8" textLength="12.2" clip-path="url(#breeze-shell-line-97)">│</text><text class="breeze-shell-r1" x [...]
+</text><text class="breeze-shell-r5" x="0" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">│</text><text class="breeze-shell-r1" x="475.8" y="2411.2" textLength="97.6" clip-path="url(#breeze-shell-line-98)">Implies </text><text class="breeze-shell-r4" x="573.4" y="2411.2" textLength="12.2" clip-path="url(#breeze-shell-line-98)">-</text><text class="breeze-shell-r4" x="585.6" y="2411.2" textLength="73.2" clip-path="url(#breeze-shell-line-98)">-mount</text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="2435.6" textLength="12.2" clip-path="url(#breeze-shell-line-99)">│</text><text class="breeze-shell-r7" x="475.8" y="2435.6" textLength="963.8" clip-path="url(#breeze-shell-line-99)">(none | wheel | sdist | <airflow_version>)                                [...]
+</text><text class="breeze-shell-r5" x="0" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">│</text><text class="breeze-shell-r4" x="24.4" y="2460" textLength="12.2" clip-path="url(#breeze-shell-line-100)">-</text><text class="breeze-shell-r4" x="36.6" y="2460" textLength="48.8" clip-path="url(#breeze-shell-line-100)">-use</text><text class="breeze-shell-r4" x="85.4" y="2460" textLength="231.8" clip-path="url(#breeze-shell-line-100)">-packages-from-dist</text><text clas [...]
+</text><text class="breeze-shell-r5" x="0" y="2484.4" textLength="12.2" clip-path="url(#breeze-shell-line-101)">│</text><text class="breeze-shell-r1" x="475.8" y="2484.4" textLength="963.8" clip-path="url(#breeze-shell-line-101)">folder when entering breeze.                                     [...]
+</text><text class="breeze-shell-r5" x="0" y="2508.8" textLength="1464" clip-path="url(#breeze-shell-line-102)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2508.8" textLength="12.2" clip-path="url(#breeze-shell-line-102)">
+</text><text class="breeze-shell-r5" x="0" y="2533.2" textLength="24.4" clip-path="url(#breeze-shell-line-103)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2533.2" textLength="500.2" clip-path="url(#breeze-shell-line-103)"> Upgrading/downgrading selected packages </text><text class="breeze-shell-r5" x="524.6" y="2533.2" textLength="915" clip-path="url(#breeze-shell-line-103)">───────────────────────────────────────────────────────────────────────────</text><tex [...]
+</text><text class="breeze-shell-r5" x="0" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">│</text><text class="breeze-shell-r4" x="24.4" y="2557.6" textLength="12.2" clip-path="url(#breeze-shell-line-104)">-</text><text class="breeze-shell-r4" x="36.6" y="2557.6" textLength="97.6" clip-path="url(#breeze-shell-line-104)">-upgrade</text><text class="breeze-shell-r4" x="134.2" y="2557.6" textLength="61" clip-path="url(#breeze-shell-line-104)">-boto</text><text class="b [...]
+</text><text class="breeze-shell-r5" x="0" y="2582" textLength="12.2" clip-path="url(#breeze-shell-line-105)">│</text><text class="breeze-shell-r4" x="24.4" y="2582" textLength="12.2" clip-path="url(#breeze-shell-line-105)">-</text><text class="breeze-shell-r4" x="36.6" y="2582" textLength="122" clip-path="url(#breeze-shell-line-105)">-downgrade</text><text class="breeze-shell-r4" x="158.6" y="2582" textLength="134.2" clip-path="url(#breeze-shell-line-105)">-sqlalchemy</text><text class= [...]
+</text><text class="breeze-shell-r5" x="0" y="2606.4" textLength="1464" clip-path="url(#breeze-shell-line-106)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2606.4" textLength="12.2" clip-path="url(#breeze-shell-line-106)">
+</text><text class="breeze-shell-r5" x="0" y="2630.8" textLength="24.4" clip-path="url(#breeze-shell-line-107)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2630.8" textLength="183" clip-path="url(#breeze-shell-line-107)"> DB test flags </text><text class="breeze-shell-r5" x="207.4" y="2630.8" textLength="1232.2" clip-path="url(#breeze-shell-line-107)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><te [...]
+</text><text class="breeze-shell-r5" x="0" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">│</text><text class="breeze-shell-r4" x="24.4" y="2655.2" textLength="12.2" clip-path="url(#breeze-shell-line-108)">-</text><text class="breeze-shell-r4" x="36.6" y="2655.2" textLength="48.8" clip-path="url(#breeze-shell-line-108)">-run</text><text class="breeze-shell-r4" x="85.4" y="2655.2" textLength="170.8" clip-path="url(#breeze-shell-line-108)">-db-tests-only</text><text c [...]
+</text><text class="breeze-shell-r5" x="0" y="2679.6" textLength="12.2" clip-path="url(#breeze-shell-line-109)">│</text><text class="breeze-shell-r4" x="24.4" y="2679.6" textLength="12.2" clip-path="url(#breeze-shell-line-109)">-</text><text class="breeze-shell-r4" x="36.6" y="2679.6" textLength="61" clip-path="url(#breeze-shell-line-109)">-skip</text><text class="breeze-shell-r4" x="97.6" y="2679.6" textLength="109.8" clip-path="url(#breeze-shell-line-109)">-db-tests</text><text class=" [...]
+</text><text class="breeze-shell-r5" x="0" y="2704" textLength="1464" clip-path="url(#breeze-shell-line-110)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2704" textLength="12.2" clip-path="url(#breeze-shell-line-110)">
+</text><text class="breeze-shell-r5" x="0" y="2728.4" textLength="24.4" clip-path="url(#breeze-shell-line-111)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2728.4" textLength="183" clip-path="url(#breeze-shell-line-111)"> Other options </text><text class="breeze-shell-r5" x="207.4" y="2728.4" textLength="1232.2" clip-path="url(#breeze-shell-line-111)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">│</text><text class="breeze-shell-r4" x="24.4" y="2752.8" textLength="12.2" clip-path="url(#breeze-shell-line-112)">-</text><text class="breeze-shell-r4" x="36.6" y="2752.8" textLength="97.6" clip-path="url(#breeze-shell-line-112)">-forward</text><text class="breeze-shell-r4" x="134.2" y="2752.8" textLength="146.4" clip-path="url(#breeze-shell-line-112)">-credentials</text><tex [...]
+</text><text class="breeze-shell-r5" x="0" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">│</text><text class="breeze-shell-r4" x="24.4" y="2777.2" textLength="12.2" clip-path="url(#breeze-shell-line-113)">-</text><text class="breeze-shell-r4" x="36.6" y="2777.2" textLength="48.8" clip-path="url(#breeze-shell-line-113)">-max</text><text class="breeze-shell-r4" x="85.4" y="2777.2" textLength="61" clip-path="url(#breeze-shell-line-113)">-time</text><text class="breeze [...]
+</text><text class="breeze-shell-r5" x="0" y="2801.6" textLength="12.2" clip-path="url(#breeze-shell-line-114)">│</text><text class="breeze-shell-r7" x="353.8" y="2801.6" textLength="1049.2" clip-path="url(#breeze-shell-line-114)">(INTEGER RANGE)                                        & [...]
+</text><text class="breeze-shell-r5" x="0" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">│</text><text class="breeze-shell-r4" x="24.4" y="2826" textLength="12.2" clip-path="url(#breeze-shell-line-115)">-</text><text class="breeze-shell-r4" x="36.6" y="2826" textLength="97.6" clip-path="url(#breeze-shell-line-115)">-verbose</text><text class="breeze-shell-r4" x="134.2" y="2826" textLength="109.8" clip-path="url(#breeze-shell-line-115)">-commands</text><text class="br [...]
+</text><text class="breeze-shell-r5" x="0" y="2850.4" textLength="1464" clip-path="url(#breeze-shell-line-116)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2850.4" textLength="12.2" clip-path="url(#breeze-shell-line-116)">
+</text><text class="breeze-shell-r5" x="0" y="2874.8" textLength="24.4" clip-path="url(#breeze-shell-line-117)">â•─</text><text class="breeze-shell-r5" x="24.4" y="2874.8" textLength="195.2" clip-path="url(#breeze-shell-line-117)"> Common options </text><text class="breeze-shell-r5" x="219.6" y="2874.8" textLength="1220" clip-path="url(#breeze-shell-line-117)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text cl [...]
+</text><text class="breeze-shell-r5" x="0" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">│</text><text class="breeze-shell-r4" x="24.4" y="2899.2" textLength="12.2" clip-path="url(#breeze-shell-line-118)">-</text><text class="breeze-shell-r4" x="36.6" y="2899.2" textLength="85.4" clip-path="url(#breeze-shell-line-118)">-answer</text><text class="breeze-shell-r6" x="158.6" y="2899.2" textLength="24.4" clip-path="url(#breeze-shell-line-118)">-a</text><text class="bre [...]
+</text><text class="breeze-shell-r5" x="0" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">│</text><text class="breeze-shell-r4" x="24.4" y="2923.6" textLength="12.2" clip-path="url(#breeze-shell-line-119)">-</text><text class="breeze-shell-r4" x="36.6" y="2923.6" textLength="48.8" clip-path="url(#breeze-shell-line-119)">-dry</text><text class="breeze-shell-r4" x="85.4" y="2923.6" textLength="48.8" clip-path="url(#breeze-shell-line-119)">-run</text><text class="breez [...]
+</text><text class="breeze-shell-r5" x="0" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">│</text><text class="breeze-shell-r4" x="24.4" y="2948" textLength="12.2" clip-path="url(#breeze-shell-line-120)">-</text><text class="breeze-shell-r4" x="36.6" y="2948" textLength="97.6" clip-path="url(#breeze-shell-line-120)">-verbose</text><text class="breeze-shell-r6" x="158.6" y="2948" textLength="24.4" clip-path="url(#breeze-shell-line-120)">-v</text><text class="breeze-she [...]
+</text><text class="breeze-shell-r5" x="0" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">│</text><text class="breeze-shell-r4" x="24.4" y="2972.4" textLength="12.2" clip-path="url(#breeze-shell-line-121)">-</text><text class="breeze-shell-r4" x="36.6" y="2972.4" textLength="61" clip-path="url(#breeze-shell-line-121)">-help</text><text class="breeze-shell-r6" x="158.6" y="2972.4" textLength="24.4" clip-path="url(#breeze-shell-line-121)">-h</text><text class="breeze- [...]
</text><text class="breeze-shell-r5" x="0" y="2996.8" textLength="1464" clip-path="url(#breeze-shell-line-122)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-shell-r1" x="1464" y="2996.8" textLength="12.2" clip-path="url(#breeze-shell-line-122)">
</text>
</g>
diff --git a/images/breeze/output_shell.txt b/images/breeze/output_shell.txt
index 8e22d7dc42..5c0110a800 100644
--- a/images/breeze/output_shell.txt
+++ b/images/breeze/output_shell.txt
@@ -1 +1 @@
-1b9d3c8dc407a6efbb7983a90443a86a
+1721fbbc6f8794c0d671be243bcb6f50
diff --git a/images/breeze/output_start-airflow.txt b/images/breeze/output_start-airflow.txt
index cdfea97c9a..0d27e6d4a1 100644
--- a/images/breeze/output_start-airflow.txt
+++ b/images/breeze/output_start-airflow.txt
@@ -1 +1 @@
-397ee08bb4b0bfa78892370a1d276b4b
+f08786008dc6552dd92880a45ed5771a
diff --git a/scripts/ci/docker-compose/remove-sources.yml b/scripts/ci/docker-compose/backend-sqlite-no-volume.yml
similarity index 64%
copy from scripts/ci/docker-compose/remove-sources.yml
copy to scripts/ci/docker-compose/backend-sqlite-no-volume.yml
index f4f49e480e..10fa2b82dd 100644
--- a/scripts/ci/docker-compose/remove-sources.yml
+++ b/scripts/ci/docker-compose/backend-sqlite-no-volume.yml
@@ -17,13 +17,8 @@
---
services:
airflow:
+ environment:
+ - BACKEND=sqlite
+ - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=${SQLITE_URL}
volumes:
- # Removes airflow sources from container
- - type: bind
- source: ./empty
- target: /opt/airflow/airflow:cached
- # However we keep in_container scripts in order to be able to debug easily the scripts that
- # are run with --mount-sources removed flag - such as installing airflow and providers
- - type: bind
- source: ../../../scripts/in_container
- target: /opt/airflow/scripts/in_container:cached
+ - /dev/urandom:/dev/random # Required to get non-blocking entropy source
diff --git a/scripts/ci/docker-compose/remove-sources.yml b/scripts/ci/docker-compose/remove-sources.yml
index f4f49e480e..14f9bc7a3a 100644
--- a/scripts/ci/docker-compose/remove-sources.yml
+++ b/scripts/ci/docker-compose/remove-sources.yml
@@ -21,9 +21,9 @@ services:
# Removes airflow sources from container
- type: bind
source: ./empty
- target: /opt/airflow/airflow:cached
+ target: /opt/airflow/airflow
# However we keep in_container scripts in order to be able to debug easily the scripts that
# are run with --mount-sources removed flag - such as installing airflow and providers
- type: bind
source: ../../../scripts/in_container
- target: /opt/airflow/scripts/in_container:cached
+ target: /opt/airflow/scripts/in_container
diff --git a/scripts/docker/entrypoint_ci.sh b/scripts/docker/entrypoint_ci.sh
index 896f11e75e..cf0ee85bab 100755
--- a/scripts/docker/entrypoint_ci.sh
+++ b/scripts/docker/entrypoint_ci.sh
@@ -44,10 +44,13 @@ PYTHON_MAJOR_MINOR_VERSION=${PYTHON_MAJOR_MINOR_VERSION:=3.8}
export AIRFLOW_HOME=${AIRFLOW_HOME:=${HOME}}
-: "${AIRFLOW_SOURCES:?"ERROR: AIRFLOW_SOURCES not set !!!!"}"
+# Create folder where sqlite database file will be stored if it does not exist (which happens when
+# scripts are running rather than breeze shell)
+mkdir "${AIRFLOW_HOME}/sqlite" -p || true
ASSET_COMPILATION_WAIT_MULTIPLIER=${ASSET_COMPILATION_WAIT_MULTIPLIER:=1}
+# Make sure that asset compilation is completed before we proceed
function wait_for_asset_compilation() {
if [[ -f "${AIRFLOW_SOURCES}/.build/www/.asset_compile.lock" ]]; then
echo
@@ -89,8 +92,12 @@ If it does not complete soon, you might want to stop it and remove file lock:
fi
}
-if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
-
+# Initialize environment variables to their default values that are used for running tests and
+# interactive shell.
+function environment_initialization() {
+ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} == "true" ]]; then
+ return
+ fi
if [[ $(uname -m) == "arm64" || $(uname -m) == "aarch64" ]]; then
if [[ ${BACKEND:=} == "mssql" ]]; then
echo "${COLOR_RED}ARM platform is not supported for ${BACKEND} backend. Exiting.${COLOR_RESET}"
@@ -112,6 +119,7 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
echo
export AIRFLOW__SCHEDULER__STANDALONE_DAG_PROCESSOR=True
fi
+
if [[ ${DATABASE_ISOLATION=} == "true" ]]; then
echo "${COLOR_BLUE}Force database isolation configuration:${COLOR_RESET}"
export AIRFLOW__CORE__DATABASE_ACCESS_ISOLATION=True
@@ -121,33 +129,10 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
RUN_TESTS=${RUN_TESTS:="false"}
CI=${CI:="false"}
- USE_AIRFLOW_VERSION="${USE_AIRFLOW_VERSION:=""}"
-
- if [[ ${USE_AIRFLOW_VERSION} == "" && ${USE_PACKAGES_FROM_DIST=} != "true" ]]; then
- export PYTHONPATH=${AIRFLOW_SOURCES}
- echo
- echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
- echo
- # Cleanup the logs, tmp when entering the environment
- sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
- sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
- mkdir -p "${AIRFLOW_SOURCES}"/logs/
- mkdir -p "${AIRFLOW_SOURCES}"/tmp/
- else
- python "${IN_CONTAINER_DIR}/install_airflow_and_providers.py"
- fi
-
- if [[ "${USE_AIRFLOW_VERSION}" =~ ^2\.2\..*|^2\.1\..*|^2\.0\..* && "${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=}" != "" ]]; then
- # make sure old variable is used for older airflow versions
- export AIRFLOW__CORE__SQL_ALCHEMY_CONN="${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN}"
- fi
# Added to have run-tests on path
export PATH=${PATH}:${AIRFLOW_SOURCES}
- # This is now set in conftest.py - only for pytest tests
- unset AIRFLOW__CORE__UNIT_TEST_MODE
-
mkdir -pv "${AIRFLOW_HOME}/logs/"
# Change the default worker_concurrency for tests
@@ -203,55 +188,88 @@ if [[ ${SKIP_ENVIRONMENT_INITIALIZATION=} != "true" ]]; then
# shellcheck source=scripts/in_container/bin/run_tmux
exec run_tmux
fi
-fi
+}
+
+# Determine which airflow version to use
+function determine_airflow_to_use() {
+ USE_AIRFLOW_VERSION="${USE_AIRFLOW_VERSION:=""}"
+ if [[ ${USE_AIRFLOW_VERSION} == "" && ${USE_PACKAGES_FROM_DIST=} != "true" ]]; then
+ export PYTHONPATH=${AIRFLOW_SOURCES}
+ echo
+ echo "${COLOR_BLUE}Using airflow version from current sources${COLOR_RESET}"
+ echo
+ # Cleanup the logs, tmp when entering the environment
+ sudo rm -rf "${AIRFLOW_SOURCES}"/logs/*
+ sudo rm -rf "${AIRFLOW_SOURCES}"/tmp/*
+ mkdir -p "${AIRFLOW_SOURCES}"/logs/
+ mkdir -p "${AIRFLOW_SOURCES}"/tmp/
+ else
+ python "${IN_CONTAINER_DIR}/install_airflow_and_providers.py"
+ fi
-# Remove pytest.ini and .coveragerc from the current directory if it exists. It has been removed from the source tree
-# but may still be present in the local directory if the user has old breeze image
-rm -f "${AIRFLOW_SOURCES}/pytest.ini"
-rm -f "${AIRFLOW_SOURCES}/.coveragerc"
+ if [[ "${USE_AIRFLOW_VERSION}" =~ ^2\.2\..*|^2\.1\..*|^2\.0\..* && "${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=}" != "" ]]; then
+ # make sure old variable is used for older airflow versions
+ export AIRFLOW__CORE__SQL_ALCHEMY_CONN="${AIRFLOW__DATABASE__SQL_ALCHEMY_CONN}"
+ fi
+}
-if [[ ${UPGRADE_BOTO=} == "true" ]]; then
+# Upgrade boto3 and botocore to latest version to run Amazon tests with them
+function check_boto_upgrade() {
+ if [[ ${UPGRADE_BOTO=} != "true" ]]; then
+ return
+ fi
echo
echo "${COLOR_BLUE}Upgrading boto3, botocore to latest version to run Amazon tests with them${COLOR_RESET}"
echo
pip uninstall --root-user-action ignore aiobotocore s3fs -y || true
pip install --root-user-action ignore --upgrade boto3 botocore
pip check
-fi
-if [[ ${DOWNGRADE_SQLALCHEMY=} == "true" ]]; then
+}
+
+# Download minimum supported version of sqlalchemy to run tests with it
+function check_download_sqlalchemy() {
+ if [[ ${DOWNGRADE_SQLALCHEMY=} != "true" ]]; then
+ return
+ fi
min_sqlalchemy_version=$(grep "sqlalchemy>=" setup.cfg | sed "s/.*>=\([0-9\.]*\).*/\1/")
echo
echo "${COLOR_BLUE}Downgrading sqlalchemy to minimum supported version: ${min_sqlalchemy_version}${COLOR_RESET}"
echo
pip install --root-user-action ignore "sqlalchemy==${min_sqlalchemy_version}"
pip check
-fi
+}
-# Just in case uninstall the pytest-capture-warning which we vendored-in
-pip uninstall --root-user-action ignore "pytest-capture-warnings" -y >/dev/null 2>&1 || true
+# Check if we should run tests and run them if needed
+function check_run_tests() {
+ if [[ ${RUN_TESTS=} != "true" ]]; then
+ return
+ fi
-set +u
-# If we do not want to run tests, we simply drop into bash
-if [[ "${RUN_TESTS}" != "true" ]]; then
- exec /bin/bash "${@}"
-fi
-set -u
+ if [[ ${REMOVE_ARM_PACKAGES:="false"} == "true" ]]; then
+ # Test what happens if we do not have ARM packages installed.
+ # This is useful to see if pytest collection works without ARM packages which is important
+ # for the MacOS M1 users running tests in their ARM machines with `breeze testing tests` command
+ python "${IN_CONTAINER_DIR}/remove_arm_packages.py"
+ fi
-if [[ ${REMOVE_ARM_PACKAGES:="false"} == "true" ]]; then
- # Test what happens if we do not have ARM packages installed.
- # This is useful to see if pytest collection works without ARM packages which is important
- # for the MacOS M1 users running tests in their ARM machines with `breeze testing tests` command
- python "${IN_CONTAINER_DIR}/remove_arm_packages.py"
-fi
+ if [[ ${TEST_TYPE} == "PlainAsserts" ]]; then
+ # Plain asserts should be converted to env variable to make sure they are taken into account
+ # otherwise they will not be effective during test collection when plain assert is breaking collection
+ export PYTEST_PLAIN_ASSERTS="true"
+ fi
-if [[ ${TEST_TYPE} == "PlainAsserts" ]]; then
- # Plain asserts should be converted to env variable to make sure they are taken into account
- # otherwise they will not be effective during test collection when plain assert is breaking collection
- export PYTEST_PLAIN_ASSERTS="true"
-fi
+ if [[ ${RUN_SYSTEM_TESTS:="false"} == "true" ]]; then
+ exec "${IN_CONTAINER_DIR}/run_system_tests.sh" "${@}"
+ else
+ exec "${IN_CONTAINER_DIR}/run_ci_tests.sh" "${@}"
+ fi
+}
-if [[ ${RUN_SYSTEM_TESTS:="false"} == "true" ]]; then
- "${IN_CONTAINER_DIR}/run_system_tests.sh" "${@}"
-else
- "${IN_CONTAINER_DIR}/run_ci_tests.sh" "${@}"
-fi
+determine_airflow_to_use
+environment_initialization
+check_boto_upgrade
+check_download_sqlalchemy
+check_run_tests "${@}"
+
+# If we are not running tests - just exec to bash shell
+exec /bin/bash "${@}"
diff --git a/scripts/in_container/install_airflow_and_providers.py b/scripts/in_container/install_airflow_and_providers.py
index 6cb05ad6e6..b434de53a0 100755
--- a/scripts/in_container/install_airflow_and_providers.py
+++ b/scripts/in_container/install_airflow_and_providers.py
@@ -87,15 +87,18 @@ def find_airflow_package(extension: str) -> str | None:
def find_provider_packages(extension: str, selected_providers: list[str]) -> list[str]:
candidates = list(DIST_FOLDER.glob(f"apache_airflow_providers_*.{extension}"))
- console.print(
- f"\n[bright_blue]Found the following provider packages: "
- f"{[candidate.as_posix() for candidate in candidates]}\n"
- )
+ console.print("\n[bright_blue]Found the following provider packages: ")
+ for candidate in sorted(candidates):
+ console.print(f" {candidate.as_posix()}")
+ console.print()
if selected_providers:
candidates = [
candidate for candidate in candidates if get_provider_name(candidate.name) in selected_providers
]
- console.print(f"[bright_blue]Selected provider packages: {candidates}\n")
+ console.print("[bright_blue]Selected provider packages:")
+ for candidate in sorted(candidates):
+ console.print(f" {candidate.as_posix()}")
+ console.print()
return [candidate.as_posix() for candidate in candidates]
@@ -233,7 +236,6 @@ def find_installation_spec(
console.print(
f"[red]The airflow source folder exists in {AIRFLOW_SOURCE_DIR}, but you are "
f"removing it and installing airflow from {use_airflow_version}."
- f"removing it and installing airflow from {use_airflow_version}."
)
console.print("[red]This is not supported. Please use --mount-sources=remove flag in breeze.")
sys.exit(1)
@@ -501,7 +503,10 @@ def install_airflow_and_providers(
run_command(install_airflow_cmd, github_actions=github_actions, check=True)
if installation_spec.provider_packages:
install_providers_cmd = ["pip", "install", "--root-user-action", "ignore"]
- console.print(f"\n[bright_blue]Installing provider packages: {installation_spec.provider_packages}")
+ console.print("\n[bright_blue]Installing provider packages:")
+ for provider_package in sorted(installation_spec.provider_packages):
+ console.print(f" {provider_package}")
+ console.print()
for provider_package in installation_spec.provider_packages:
install_providers_cmd.append(provider_package)
if installation_spec.provider_constraints_location: