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

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

commit 012b88d96c45ad7ceade25a5d4273aa776802486
Author: Jarek Potiuk <jarek.pot...@polidea.com>
AuthorDate: Sun May 29 10:33:40 2022 +0200

    Add better diagnostics capabilities for pre-commits run via CI image 
(#23980)
    
    The pre-commits that require CI image run docker command under
    the hood that is highly optimized for performance (only mounts
    files that are necessary to be mounted) - in order to improve
    performance on Mac OS and make sure that artifacts are not left
    in the source code of Airflow.
    
    However that makes the command slightly more difficult to debug
    because they generate dynamically the docker command used,
    including the volumens that should be mounted when the docker
    command is run.
    
    This PR adds better diagnostics to the pre-commit scripts
    allowing VERBOSE="true" and DRY_RUN="true" variables that can
    help with diagnosing problems such as running the scripts on
    WSL2.
    
    It also fixes a few documentation bugs that have been missed
    after changing names of the image-related static checks and
    thanks to separating the common code to utility function
    it allows to set SKIP_IMAGE_PRE_COMMITS variable to true
    which will skip running all pre-commit checks that require
    breeze image to be available locally.
    
    (cherry picked from commit 5af83ce736b92f651f75d5d00c2043be59ab91f5)
---
 .github/workflows/ci.yml                           |  11 +-
 STATIC_CODE_CHECKS.rst                             |  52 ++++++---
 .../airflow_breeze/commands/developer_commands.py  |   2 +-
 dev/breeze/src/airflow_breeze/utils/path_utils.py  |   8 +-
 dev/breeze/src/airflow_breeze/utils/run_utils.py   |  30 ++++++
 images/breeze/output-commands-hash.txt             |   2 +-
 images/breeze/output-static-checks.svg             | 120 ++++++++++-----------
 .../pre_commit_check_pre_commit_hooks.py           |   2 +-
 scripts/ci/pre_commit/pre_commit_flake8.py         |  28 +++--
 .../pre_commit/pre_commit_migration_reference.py   |  34 +++---
 scripts/ci/pre_commit/pre_commit_mypy.py           |  28 +++--
 scripts/ci/pre_commit/pre_commit_ui_lint.py        |  36 +++----
 scripts/ci/pre_commit/pre_commit_www_lint.py       |  35 +++---
 13 files changed, 215 insertions(+), 173 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5488b765be..e8de7a7f9b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -637,9 +637,9 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
       - name: "Static checks"
         run: breeze static-checks --all-files --show-diff-on-failure --color 
always
         env:
-          VERBOSE: false
+          VERBOSE: "false"
           SKIP: "identity"
-          COLUMNS: 250
+          COLUMNS: "250"
       - name: "Fix ownership"
         run: breeze fix-ownership
         if: always()
@@ -654,8 +654,6 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
     needs: [build-info]
     env:
       RUNS_ON: ${{ fromJson(needs.build-info.outputs.runsOn) }}
-      SKIP: 
"build,run-mypy,run-flake8,lint-javascript,update-migration-references,identity"
-      MOUNT_SELECTED_LOCAL_SOURCES: "true"
     if: needs.build-info.outputs.basic-checks-only == 'true'
     steps:
       - name: Cleanup repo
@@ -695,7 +693,10 @@ ${{ hashFiles('.pre-commit-config.yaml') }}"
           breeze static-checks --all-files --show-diff-on-failure --color 
always
           --commit-ref "${{ github.sha }}"
         env:
-          VERBOSE: false
+          VERBOSE: "false"
+          SKIP_IMAGE_PRE_COMMITS: "true"
+          SKIP: "identity"
+          COLUMNS: "250"
       - name: "Fix ownership"
         run: breeze fix-ownership
         if: always()
diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst
index 71f132e7d5..e2b57eae6c 100644
--- a/STATIC_CODE_CHECKS.rst
+++ b/STATIC_CODE_CHECKS.rst
@@ -111,8 +111,8 @@ For details on advanced usage of the install method, use:
 Available pre-commit checks
 ...........................
 
-This table lists pre-commit hooks used by Airflow. The ``Breeze`` column 
indicates which hooks
-require Breeze Docker images to be installed locally.
+This table lists pre-commit hooks used by Airflow. The ``Image`` column 
indicates which hooks
+require Breeze Docker image to be build locally.
 
 .. note:: Disabling particular checks
 
@@ -123,6 +123,10 @@ require Breeze Docker images to be installed locally.
   ``export SKIP=run-flake8,run-mypy``. You can also add this to your 
``.bashrc`` or ``.zshrc`` if you
   do not want to set it manually every time you enter the terminal.
 
+  In case you do not have breeze image configured locally, you can also 
disable all checks that require
+  the image by setting ``SKIP_IMAGE_PRE_COMMITS`` to "true". This will mark 
the tests as "green" automatically
+  when run locally (note that those checks will anyway run in CI).
+
   .. BEGIN AUTO-GENERATED STATIC CHECK LIST
 
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
@@ -242,7 +246,7 @@ require Breeze Docker images to be installed locally.
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
 | lint-helm-chart                                        | Lint Helm Chart     
                                             |         |
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
-| lint-javascript                                        | * ESLint against 
airflow/ui                                      |         |
+| lint-javascript                                        | * ESLint against 
airflow/ui                                      | *       |
 |                                                        | * ESLint against 
current UI JavaScript files                     |         |
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
 | lint-json-schema                                       | * Lint JSON Schema 
files with JSON Schema                        |         |
@@ -269,9 +273,9 @@ require Breeze Docker images to be installed locally.
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
 | rst-backticks                                          | Check if RST files 
use double backticks for code                 |         |
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
-| run-flake8                                             | Run flake8          
                                             |         |
+| run-flake8                                             | Run flake8          
                                             | *       |
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
-| run-mypy                                               | * Run mypy for dev  
                                             |         |
+| run-mypy                                               | * Run mypy for dev  
                                             | *       |
 |                                                        | * Run mypy for core 
                                             |         |
 |                                                        | * Run mypy for 
providers                                         |         |
 |                                                        | * Run mypy for 
/docs/ folder                                     |         |
@@ -294,7 +298,7 @@ require Breeze Docker images to be installed locally.
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
 | update-local-yml-file                                  | Update mounts in 
the local yml file                              |         |
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
-| update-migration-references                            | Update migration 
ref doc                                         |         |
+| update-migration-references                            | Update migration 
ref doc                                         | *       |
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
 | update-providers-dependencies                          | Update 
cross-dependencies for providers packages                 |         |
 
+--------------------------------------------------------+------------------------------------------------------------------+---------+
@@ -387,49 +391,63 @@ Run the ``mypy`` check for the currently staged changes:
 
 .. code-block:: bash
 
-     breeze static-check --type run-mypy
+     breeze static-checks --type run-mypy
 
 Run the ``mypy`` check for all files:
 
 .. code-block:: bash
 
-     breeze static-check --type run-mypy --all-files
+     breeze static-checks --type run-mypy --all-files
 
 Run the ``flake8`` check for the ``tests.core.py`` file with verbose output:
 
 .. code-block:: bash
 
-     breeze static-check --type run-flake8 --file tests/core.py --verbose
+     breeze static-checks --type run-flake8 --file tests/core.py --verbose
 
 Run the ``flake8`` check for the ``tests.core`` package with verbose output:
 
 .. code-block:: bash
 
-     breeze static-check --type run-flake8 --file tests/core/* --verbose
+     breeze static-checks --type run-flake8 --file tests/core/* --verbose
 
 Run all tests for the currently staged files:
 
 .. code-block:: bash
 
-     breeze static-check --type all
+     breeze static-checks --type all
 
 Run all tests for all files:
 
 .. code-block:: bash
 
-    breeze static-check --type all --all-files
+    breeze static-checks --type all --all-files
 
 Run all tests for last commit :
 
 .. code-block:: bash
 
-     breeze static-check --type all --last-commit
+     breeze static-checks -type all --last-commit
+
+Debugging pre-commit check scripts requiring image
+--------------------------------------------------
+
+Those commits that use Breeze docker image might sometimes fail, depending on 
your operating system and
+docker setup, so sometimes it might be required to run debugging with the 
commands. This is done via
+two environment variables ``VERBOSE`` and ``DRY_RUN``. Setting them to "true" 
will respectively show the
+commands to run before running them or skip running the commands.
+
+Note that you need to run pre-commit with --verbose command to get the output 
regardless of the status
+of the static check (normally it will only show output on failure).
+
+Printing the commands while executing:
+
+.. code-block:: bash
 
+     VERBOSE="true" pre-commit run --verbose run-flake8
 
-The ``license`` check is run via a separate script and a separate Docker image 
containing the
-Apache RAT verification tool that checks for Apache-compatibility of licenses 
within the codebase.
-It does not take pre-commit parameters as extra arguments.
+Just performing dry run:
 
 .. code-block:: bash
 
-     breeze static-check licenses
+     DRY_RUN="true" pre-commit run --verbose run-flake8
diff --git a/dev/breeze/src/airflow_breeze/commands/developer_commands.py 
b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
index bb1d974e7c..1719bab5fc 100644
--- a/dev/breeze/src/airflow_breeze/commands/developer_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/developer_commands.py
@@ -438,7 +438,7 @@ def build_docs(
     type=BetterChoice(PRE_COMMIT_LIST),
     multiple=True,
 )
-@click.option('-a', '--all-files', help="Run checks on all files.")
+@click.option('-a', '--all-files', help="Run checks on all files.", 
is_flag=True)
 @click.option('-f', '--file', help="List of files to run the checks on.", 
type=click.Path(), multiple=True)
 @click.option(
     '-s', '--show-diff-on-failure', help="Show diff for files modified by the 
checks.", is_flag=True
diff --git a/dev/breeze/src/airflow_breeze/utils/path_utils.py 
b/dev/breeze/src/airflow_breeze/utils/path_utils.py
index 49d9d3bf9c..759c3e09a7 100644
--- a/dev/breeze/src/airflow_breeze/utils/path_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/path_utils.py
@@ -62,13 +62,7 @@ def in_help() -> bool:
 
 
 def skip_upgrade_check():
-    return (
-        in_self_upgrade()
-        or in_autocomplete()
-        or in_help()
-        or hasattr(sys, '_called_from_test')
-        or os.environ.get('SKIP_BREEZE_UPGRADE_CHECK')
-    )
+    return in_self_upgrade() or in_autocomplete() or in_help() or hasattr(sys, 
'_called_from_test')
 
 
 def get_package_setup_metadata_hash() -> str:
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py 
b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index bbfdfcb432..86b84be4c0 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -27,6 +27,7 @@ from pathlib import Path
 from re import match
 from typing import Dict, List, Mapping, Optional, Union
 
+from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
 from airflow_breeze.params._common_build_params import _CommonBuildParams
 from airflow_breeze.utils.ci_group import ci_group
 from airflow_breeze.utils.console import get_console
@@ -375,3 +376,32 @@ def filter_out_none(**kwargs) -> dict:
         if kwargs[key] is None:
             kwargs.pop(key)
     return kwargs
+
+
+def fail_if_image_missing(image: str, verbose: bool, dry_run: bool, 
instruction: str) -> None:
+    skip_image_pre_commits = os.environ.get('SKIP_IMAGE_PRE_COMMITS', "false")
+    if skip_image_pre_commits[0].lower() == "t":
+        get_console().print(
+            f"[info]Skipping image check as SKIP_IMAGE_PRE_COMMITS is set to 
{skip_image_pre_commits}[/]"
+        )
+        sys.exit(0)
+    cmd_result = run_command(
+        ["docker", "inspect", image], stdout=subprocess.DEVNULL, check=False, 
verbose=verbose, dry_run=dry_run
+    )
+    if cmd_result.returncode != 0:
+        print(f'[red]The image {image} is not available.[/]\n')
+        print(f"\n[yellow]Please run at the earliest 
convenience:[/]\n\n{instruction}\n\n")
+        sys.exit(1)
+
+
+def get_runnable_ci_image(verbose: bool, dry_run: bool) -> str:
+    github_repository = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
+    python_version = "3.7"
+    airflow_image = 
f"ghcr.io/{github_repository}/{AIRFLOW_BRANCH}/ci/python{python_version}"
+    fail_if_image_missing(
+        image=airflow_image,
+        verbose=verbose,
+        dry_run=dry_run,
+        instruction=f"breeze build-image --python {python_version}",
+    )
+    return airflow_image
diff --git a/images/breeze/output-commands-hash.txt 
b/images/breeze/output-commands-hash.txt
index 8a3bf0f004..fe6d5cdba6 100644
--- a/images/breeze/output-commands-hash.txt
+++ b/images/breeze/output-commands-hash.txt
@@ -1 +1 @@
-e275b745e83c5e5f4fc2a54677ab7e0d
+4538f69421a320083444736d334314b7
diff --git a/images/breeze/output-static-checks.svg 
b/images/breeze/output-static-checks.svg
index d9188e5fe8..e76f1a3f27 100644
--- a/images/breeze/output-static-checks.svg
+++ b/images/breeze/output-static-checks.svg
@@ -19,85 +19,85 @@
         font-weight: 700;
     }
 
-    .terminal-2026671122-matrix {
+    .terminal-158108476-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 26.400000000000002px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-2026671122-title {
+    .terminal-158108476-title {
         font-size: 18px;
 
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-2026671122-r1 { fill: #c5c8c6;font-weight: bold }
-.terminal-2026671122-r2 { fill: #c5c8c6 }
-.terminal-2026671122-r3 { fill: #d0b344;font-weight: bold }
-.terminal-2026671122-r4 { fill: #868887 }
-.terminal-2026671122-r5 { fill: #68a0b3;font-weight: bold }
-.terminal-2026671122-r6 { fill: #98a84b;font-weight: bold }
-.terminal-2026671122-r7 { fill: #8d7b39 }
+    .terminal-158108476-r1 { fill: #c5c8c6;font-weight: bold }
+.terminal-158108476-r2 { fill: #c5c8c6 }
+.terminal-158108476-r3 { fill: #d0b344;font-weight: bold }
+.terminal-158108476-r4 { fill: #868887 }
+.terminal-158108476-r5 { fill: #68a0b3;font-weight: bold }
+.terminal-158108476-r6 { fill: #98a84b;font-weight: bold }
+.terminal-158108476-r7 { fill: #8d7b39 }
     </style>
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="16" y="20" width="1512" height="1372" rx="12"/><text 
class="terminal-2026671122-title" fill="#c5c8c6" text-anchor="middle" x="756" 
y="46">Command: static-checks</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="16" y="20" width="1512" height="1372" rx="12"/><text 
class="terminal-158108476-title" fill="#c5c8c6" text-anchor="middle" x="756" 
y="46">Command: static-checks</text>
             <circle cx="40" cy="40" r="7" fill="#ff5f57"/>
             <circle cx="62" cy="40" r="7" fill="#febc2e"/>
             <circle cx="84" cy="40" r="7" fill="#28c840"/>
         
     <g transform="translate(28, 60)">
     
-    <text alignment-baseline="baseline" class="terminal-2026671122-matrix" 
font-variant="east-asian-width-values"><tspan class="terminal-2026671122-r1" 
x="0" y="20" 
textLength="1488">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</tspan><tspan class="terminal-2026671122-r1" x="0" y="46.4" 
textLength="12.4">&#160;</tspan><tspan class="terminal-2026671122-r3" x="12.4" 
y="46.4" textLength="86.8">Usage:&#160;</tspan><tspan 
class="terminal-2026671122-r1" x="99.2" y="46.4" 
textLength="1388.8">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</tspan><tspan class="terminal-2026671122-r1" x="0" y="72.8" 
textLength="1488">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</tspan><tspan class="terminal-2026671122-r2" x="0" y="99.2" 
textLength="12.4">&#160;</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="99.2" 
textLength="1463.2">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</tspan><tspan class="terminal-2026671122-r2" x="0" y="125.6" 
textLength="1488">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="152" 
textLength="1488">╭─&#160;Pre-commit&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────────╮</tspan><tspan
 class="terminal-2026671122-r2" x="1488" y="152" textLength="12.4">
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="178.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="178.4" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="178.4" 
textLength="74.4">--type</tspan><tspan class="terminal-2026671122-r2" x="111.6" 
y="178.4" 
textLength="223.2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-202 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="204.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="204.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="204.8" 
textLength="1066.4">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;che
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="231.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="231.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="231.2" 
textLength="1066.4">check-airflow-config-yaml-consistent&#160;|&#160;check-airflow-
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="257.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="257.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="257.6" 
textLength="1066.4">check-apache-license-rat&#160;|&#160;check-base-operator-usage&
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="284" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="284" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="284" 
textLength="1066.4">check-boring-cyborg-configuration&#160;|&#160;check-breeze-top-depend
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="310.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="310.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="310.4" 
textLength="1066.4">check-builtin-literals&#160;|&#160;check-changelog-has-no-dupli
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="336.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="336.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="336.8" 
textLength="1066.4">check-daysago-import-from-utils&#160;|&#160;check-docstring-par
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="363.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="363.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="363.2" 
textLength="1066.4">check-executables-have-shebangs&#160;|&#160;check-extra-package
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="389.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="389.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="389.6" 
textLength="1066.4">|&#160;check-for-inclusive-language&#160;|&#160;check-hooks-app
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="416" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="416" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="416" 
textLength="1066.4">check-incorrect-use-of-LoggingMixin&#160;|&#160;check-integrations-ar
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="442.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="442.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="442.4" 
textLength="1066.4">check-merge-conflict&#160;|&#160;check-newsfragments-are-valid&
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="468.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="468.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="468.8" 
textLength="1066.4">check-no-providers-in-core-examples&#160;|&#160;check-no-relati
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="495.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="495.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="495.2" 
textLength="1066.4">check-persist-credentials-disabled-in-github-workflows&#160;|&#
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="521.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="521.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="521.6" 
textLength="1066.4">check-pre-commit-information-consistent&#160;|&#160;check-provi
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="548" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="548" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="548" 
textLength="1066.4">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missi
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="574.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="574.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="574.4" 
textLength="1066.4">check-providers-subpackages-init-file-exist&#160;|&#160;check-p
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="600.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="600.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="600.8" 
textLength="1066.4">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="627.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="627.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="627.2" 
textLength="1066.4">check-start-date-not-used-in-defaults&#160;|&#160;check-system-
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="653.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="653.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="653.6" 
textLength="1066.4">codespell&#160;|&#160;debug-statements&#160;|&#160;detect-priva
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="680" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="680" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="680" 
textLength="1066.4">fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;forbid-tabs&#160;|&
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="706.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="706.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="706.4" 
textLength="1066.4">lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;lint-dockerf
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="732.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="732.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="732.8" 
textLength="1066.4">lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;lint-ope
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="759.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="759.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="759.2" 
textLength="1066.4">pretty-format-json&#160;|&#160;pydocstyle&#160;|&#160;python-no
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="785.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="785.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="785.6" 
textLength="1066.4">run-flake8&#160;|&#160;run-mypy&#160;|&#160;run-shellcheck&#160
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="812" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="812" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="812" 
textLength="1066.4">|&#160;update-breeze-file&#160;|&#160;update-breeze-readme-config-has
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="838.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="838.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="838.4" 
textLength="1066.4">update-in-the-wild-to-be-sorted&#160;|&#160;update-inlined-dock
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="864.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="864.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="864.8" 
textLength="1066.4">update-local-yml-file&#160;|&#160;update-migration-references&#
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="891.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="891.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="891.2" 
textLength="1066.4">update-setup-cfg-file&#160;|&#160;update-spelling-wordlist-to-b
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="917.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="917.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="917.6" 
textLength="1066.4">update-supported-versions&#160;|&#160;update-vendored-in-k8s-js
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="944" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="944" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="384.4" y="944" 
textLength="1066.4">yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="970.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="970.4" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="970.4" 
textLength="74.4">--file</tspan><tspan class="terminal-2026671122-r2" x="111.6" 
y="970.4" 
textLength="223.2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-202 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="996.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="996.8" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="996.8" 
textLength="136.4">--all-files</tspan><tspan class="terminal-2026671122-r2" 
x="173.6" y="996.8" 
textLength="161.2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r6" x="334.8" y= [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1023.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1023.2" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="1023.2" 
textLength="272.8">--show-diff-on-failure</tspan><tspan 
class="terminal-2026671122-r2" x="310" y="1023.2" 
textLength="24.8">&#160;&#160;</tspan><tspan class="terminal-2026671122-r6" 
x="334.8" y="1023.2" textLength="24.8">-s</tspan><tspan class="ter [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1049.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1049.6" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="1049.6" 
textLength="161.2">--last-commit</tspan><tspan class="terminal-2026671122-r2" 
x="198.4" y="1049.6" 
textLength="136.4">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r6" x="334.8" y="1049. [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1076" 
textLength="1488">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</tspan><tspan
 class="terminal-2026671122-r2" x="1488" y="1076" textLength="12.4">
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1102.4" 
textLength="1488">╭─&#160;Options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────────────╮</tspan><tspan
 class="terminal-2026671122-r2" x="1488" y="1102.4" textLength="12.4">
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1128.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1128.8" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="1128.8" 
textLength="148.8">--commit-ref</tspan><tspan class="terminal-2026671122-r2" 
x="186" y="1128.8" 
textLength="111.6">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r6" x="297.6" y="1128.8" textLength=" [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1155.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1155.2" 
textLength="520.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exclusive&#160;with&#160;</tspan><tspan
 class="terminal-2026671122-r5" x="533.2" y="1155.2" 
textLength="161.2">--last-commit</tspan><tspan class="terminal-20266711 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1181.6" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1181.6" 
textLength="334.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r7" x="347.2" y="1181.6" 
textLength="1103.6">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1208" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1208" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="1208" 
textLength="111.6">--verbose</tspan><tspan class="terminal-2026671122-r2" 
x="148.8" y="1208" 
textLength="148.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r6" x="297.6" y="1208" textL [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1234.4" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1234.4" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="1234.4" 
textLength="111.6">--dry-run</tspan><tspan class="terminal-2026671122-r2" 
x="148.8" y="1234.4" 
textLength="148.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r6" x="297.6" y="123 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1260.8" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1260.8" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="1260.8" 
textLength="235.6">--github-repository</tspan><tspan 
class="terminal-2026671122-r2" x="272.8" y="1260.8" 
textLength="24.8">&#160;&#160;</tspan><tspan class="terminal-2026671122-r6" 
x="297.6" y="1260.8" textLength="24.8">-g</tspan><tspan class="term [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1287.2" 
textLength="12.4">│</tspan><tspan class="terminal-2026671122-r2" x="12.4" 
y="1287.2" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-2026671122-r5" x="37.2" y="1287.2" 
textLength="74.4">--help</tspan><tspan class="terminal-2026671122-r2" x="111.6" 
y="1287.2" 
textLength="186">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-2026671122-r6" x="2 [...]
-</tspan><tspan class="terminal-2026671122-r4" x="0" y="1313.6" 
textLength="1488">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</tspan><tspan
 class="terminal-2026671122-r2" x="1488" y="1313.6" textLength="12.4">
+    <text alignment-baseline="baseline" class="terminal-158108476-matrix" 
font-variant="east-asian-width-values"><tspan class="terminal-158108476-r1" 
x="0" y="20" 
textLength="1488">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</tspan><tspan class="terminal-158108476-r1" x="0" y="46.4" 
textLength="12.4">&#160;</tspan><tspan class="terminal-158108476-r3" x="12.4" 
y="46.4" textLength="86.8">Usage:&#160;</tspan><tspan 
class="terminal-158108476-r1" x="99.2" y="46.4" 
textLength="1388.8">breeze&#160;static-checks&#160;[OPTIONS]&#160;[PRECOMMIT_ARGS]...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</tspan><tspan class="terminal-158108476-r1" x="0" y="72.8" 
textLength="1488">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</tspan><tspan class="terminal-158108476-r2" x="0" y="99.2" 
textLength="12.4">&#160;</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="99.2" 
textLength="1463.2">Run&#160;static&#160;checks.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</tspan><tspan class="terminal-158108476-r2" x="0" y="125.6" 
textLength="1488">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="152" 
textLength="1488">╭─&#160;Pre-commit&#160;flags&#160;───────────────────────────────────────────────────────────────────────────────────────────────────╮</tspan><tspan
 class="terminal-158108476-r2" x="1488" y="152" textLength="12.4">
+</tspan><tspan class="terminal-158108476-r4" x="0" y="178.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="178.4" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="178.4" 
textLength="74.4">--type</tspan><tspan class="terminal-158108476-r2" x="111.6" 
y="178.4" 
textLength="223.2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-1581084 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="204.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="204.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="204.8" 
textLength="1066.4">(all&#160;|&#160;black&#160;|&#160;blacken-docs&#160;|&#160;check-
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="231.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="231.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="231.2" 
textLength="1066.4">check-airflow-config-yaml-consistent&#160;|&#160;check-airflow-pro
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="257.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="257.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="257.6" 
textLength="1066.4">check-apache-license-rat&#160;|&#160;check-base-operator-usage&#16
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="284" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="284" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="284" 
textLength="1066.4">check-boring-cyborg-configuration&#160;|&#160;check-breeze-top-dependenc
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="310.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="310.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="310.4" 
textLength="1066.4">check-builtin-literals&#160;|&#160;check-changelog-has-no-duplicat
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="336.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="336.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="336.8" 
textLength="1066.4">check-daysago-import-from-utils&#160;|&#160;check-docstring-param-
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="363.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="363.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="363.2" 
textLength="1066.4">check-executables-have-shebangs&#160;|&#160;check-extra-packages-r
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="389.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="389.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="389.6" 
textLength="1066.4">|&#160;check-for-inclusive-language&#160;|&#160;check-hooks-apply&
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="416" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="416" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="416" 
textLength="1066.4">check-incorrect-use-of-LoggingMixin&#160;|&#160;check-integrations-are-c
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="442.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="442.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="442.4" 
textLength="1066.4">check-merge-conflict&#160;|&#160;check-newsfragments-are-valid&#16
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="468.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="468.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="468.8" 
textLength="1066.4">check-no-providers-in-core-examples&#160;|&#160;check-no-relative-
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="495.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="495.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="495.2" 
textLength="1066.4">check-persist-credentials-disabled-in-github-workflows&#160;|&#160
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="521.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="521.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="521.6" 
textLength="1066.4">check-pre-commit-information-consistent&#160;|&#160;check-provide-
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="548" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="548" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="548" 
textLength="1066.4">check-provider-yaml-valid&#160;|&#160;check-providers-init-file-missing&
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="574.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="574.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="574.4" 
textLength="1066.4">check-providers-subpackages-init-file-exist&#160;|&#160;check-pyde
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="600.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="600.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="600.8" 
textLength="1066.4">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-ht
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="627.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="627.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="627.2" 
textLength="1066.4">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tes
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="653.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="653.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="653.6" 
textLength="1066.4">codespell&#160;|&#160;debug-statements&#160;|&#160;detect-private-
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="680" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="680" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="680" 
textLength="1066.4">fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;forbid-tabs&#160;|&#16
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="706.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="706.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="706.4" 
textLength="1066.4">lint-chart-schema&#160;|&#160;lint-css&#160;|&#160;lint-dockerfile
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="732.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="732.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="732.8" 
textLength="1066.4">lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;lint-openap
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="759.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="759.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="759.2" 
textLength="1066.4">pretty-format-json&#160;|&#160;pydocstyle&#160;|&#160;python-no-lo
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="785.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="785.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="785.6" 
textLength="1066.4">run-flake8&#160;|&#160;run-mypy&#160;|&#160;run-shellcheck&#160;|&
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="812" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="812" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="812" 
textLength="1066.4">|&#160;update-breeze-file&#160;|&#160;update-breeze-readme-config-hash&#
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="838.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="838.4" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="838.4" 
textLength="1066.4">update-in-the-wild-to-be-sorted&#160;|&#160;update-inlined-dockerf
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="864.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="864.8" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="864.8" 
textLength="1066.4">update-local-yml-file&#160;|&#160;update-migration-references&#160
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="891.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="891.2" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="891.2" 
textLength="1066.4">update-setup-cfg-file&#160;|&#160;update-spelling-wordlist-to-be-s
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="917.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="917.6" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="917.6" 
textLength="1066.4">update-supported-versions&#160;|&#160;update-vendored-in-k8s-json-
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="944" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="944" 
textLength="372">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="384.4" y="944" 
textLength="1066.4">yamllint&#160;|&#160;yesqa)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="970.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="970.4" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="970.4" 
textLength="74.4">--file</tspan><tspan class="terminal-158108476-r2" x="111.6" 
y="970.4" 
textLength="223.2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-1581084 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="996.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="996.8" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="996.8" 
textLength="136.4">--all-files</tspan><tspan class="terminal-158108476-r2" 
x="173.6" y="996.8" 
textLength="161.2">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r6" x="334.8" y="996. [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1023.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1023.2" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="1023.2" 
textLength="272.8">--show-diff-on-failure</tspan><tspan 
class="terminal-158108476-r2" x="310" y="1023.2" 
textLength="24.8">&#160;&#160;</tspan><tspan class="terminal-158108476-r6" 
x="334.8" y="1023.2" textLength="24.8">-s</tspan><tspan class="terminal [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1049.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1049.6" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="1049.6" 
textLength="161.2">--last-commit</tspan><tspan class="terminal-158108476-r2" 
x="198.4" y="1049.6" 
textLength="136.4">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r6" x="334.8" y="1049.6" te [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1076" 
textLength="1488">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</tspan><tspan
 class="terminal-158108476-r2" x="1488" y="1076" textLength="12.4">
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1102.4" 
textLength="1488">╭─&#160;Options&#160;────────────────────────────────────────────────────────────────────────────────────────────────────────────╮</tspan><tspan
 class="terminal-158108476-r2" x="1488" y="1102.4" textLength="12.4">
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1128.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1128.8" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="1128.8" 
textLength="148.8">--commit-ref</tspan><tspan class="terminal-158108476-r2" 
x="186" y="1128.8" 
textLength="111.6">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r6" x="297.6" y="1128.8" textLength="24.8" [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1155.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1155.2" 
textLength="520.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exclusive&#160;with&#160;</tspan><tspan
 class="terminal-158108476-r5" x="533.2" y="1155.2" 
textLength="161.2">--last-commit</tspan><tspan class="terminal-158108476-r [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1181.6" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1181.6" 
textLength="334.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r7" x="347.2" y="1181.6" 
textLength="1103.6">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1208" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1208" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="1208" 
textLength="111.6">--verbose</tspan><tspan class="terminal-158108476-r2" 
x="148.8" y="1208" 
textLength="148.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r6" x="297.6" y="1208" textLength [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1234.4" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1234.4" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="1234.4" 
textLength="111.6">--dry-run</tspan><tspan class="terminal-158108476-r2" 
x="148.8" y="1234.4" 
textLength="148.8">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r6" x="297.6" y="1234.4"  [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1260.8" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1260.8" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="1260.8" 
textLength="235.6">--github-repository</tspan><tspan 
class="terminal-158108476-r2" x="272.8" y="1260.8" 
textLength="24.8">&#160;&#160;</tspan><tspan class="terminal-158108476-r6" 
x="297.6" y="1260.8" textLength="24.8">-g</tspan><tspan class="terminal- [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1287.2" 
textLength="12.4">│</tspan><tspan class="terminal-158108476-r2" x="12.4" 
y="1287.2" textLength="24.8">&#160;&#160;</tspan><tspan 
class="terminal-158108476-r5" x="37.2" y="1287.2" 
textLength="74.4">--help</tspan><tspan class="terminal-158108476-r2" x="111.6" 
y="1287.2" 
textLength="186">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</tspan><tspan
 class="terminal-158108476-r6" x="297.6" [...]
+</tspan><tspan class="terminal-158108476-r4" x="0" y="1313.6" 
textLength="1488">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</tspan><tspan
 class="terminal-158108476-r2" x="1488" y="1313.6" textLength="12.4">
 </tspan></text>
     </g>
 </svg>
diff --git a/scripts/ci/pre_commit/pre_commit_check_pre_commit_hooks.py 
b/scripts/ci/pre_commit/pre_commit_check_pre_commit_hooks.py
index 9855091ba8..2a5a25639b 100755
--- a/scripts/ci/pre_commit/pre_commit_check_pre_commit_hooks.py
+++ b/scripts/ci/pre_commit/pre_commit_check_pre_commit_hooks.py
@@ -56,7 +56,7 @@ def get_errors_and_hooks(content: Any, max_length: int) -> 
Tuple[List[str], Dict
             else:
                 errors.append(f"The id is missing in {hook}")
                 continue
-            if hook_id == 'mypy':
+            if hook_id == 'run-mypy':
                 needs_image = True
             if 'name' not in hook:
                 errors.append(
diff --git a/scripts/ci/pre_commit/pre_commit_flake8.py 
b/scripts/ci/pre_commit/pre_commit_flake8.py
index 7adba2ffc6..59bd356d24 100755
--- a/scripts/ci/pre_commit/pre_commit_flake8.py
+++ b/scripts/ci/pre_commit/pre_commit_flake8.py
@@ -16,12 +16,9 @@
 # specific language governing permissions and limitations
 # under the License.
 import os
-import subprocess
 import sys
 from pathlib import Path
 
-from rich import print
-
 if __name__ not in ("__main__", "__mp_main__"):
     raise SystemExit(
         "This file is intended to be executed as an executable program. You 
cannot use it as a module."
@@ -30,22 +27,20 @@ if __name__ not in ("__main__", "__mp_main__"):
 
 AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
 GITHUB_REPOSITORY = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
+# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
+VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
+DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
 
 if __name__ == '__main__':
-    sys.path.insert(0, str(Path(__file__).parents[3].resolve() / "dev" / 
"breeze" / "src"))
-    from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
+    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
     from airflow_breeze.global_constants import MOUNT_SELECTED
     from airflow_breeze.utils.docker_command_utils import 
create_static_check_volumes, get_extra_docker_flags
+    from airflow_breeze.utils.run_utils import get_runnable_ci_image, 
run_command
 
-    AIRFLOW_CI_IMAGE = 
f"ghcr.io/{GITHUB_REPOSITORY}/{AIRFLOW_BRANCH}/ci/python3.7"
-
-    if subprocess.call(args=["docker", "inspect", AIRFLOW_CI_IMAGE], 
stdout=subprocess.DEVNULL) != 0:
-        print(f'[red]The image {AIRFLOW_CI_IMAGE} is not available.[/]\n')
-        print("\n[yellow]Please run at the earliest convenience:[/]\n\nbreeze 
build-image --python 3.7\n\n")
-        sys.exit(1)
+    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
     create_static_check_volumes()
-    return_code = subprocess.call(
-        args=[
+    cmd_result = run_command(
+        [
             "docker",
             "run",
             "-t",
@@ -58,9 +53,12 @@ if __name__ == '__main__':
             "BACKEND=sqlite",
             "--pull",
             "never",
-            AIRFLOW_CI_IMAGE,
+            airflow_image,
             "/opt/airflow/scripts/in_container/run_flake8.sh",
             *sys.argv[1:],
         ],
+        check=False,
+        verbose=VERBOSE,
+        dry_run=DRY_RUN,
     )
-    sys.exit(return_code)
+    sys.exit(cmd_result.returncode)
diff --git a/scripts/ci/pre_commit/pre_commit_migration_reference.py 
b/scripts/ci/pre_commit/pre_commit_migration_reference.py
index e72a7a3326..154a795f3e 100755
--- a/scripts/ci/pre_commit/pre_commit_migration_reference.py
+++ b/scripts/ci/pre_commit/pre_commit_migration_reference.py
@@ -16,12 +16,9 @@
 # specific language governing permissions and limitations
 # under the License.
 import os
-import subprocess
 import sys
 from pathlib import Path
 
-from rich import print
-
 if __name__ not in ("__main__", "__mp_main__"):
     raise SystemExit(
         "This file is intended to be executed as an executable program. You 
cannot use it as a module."
@@ -30,31 +27,36 @@ if __name__ not in ("__main__", "__mp_main__"):
 
 AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
 GITHUB_REPOSITORY = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
+# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
+VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
+DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
 
 if __name__ == '__main__':
-    sys.path.insert(0, str(Path(__file__).parents[3].resolve() / "dev" / 
"breeze" / "src"))
-    from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
+    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
+    from airflow_breeze.global_constants import MOUNT_SELECTED
+    from airflow_breeze.utils.docker_command_utils import 
create_static_check_volumes, get_extra_docker_flags
+    from airflow_breeze.utils.run_utils import get_runnable_ci_image, 
run_command
 
-    AIRFLOW_CI_IMAGE = 
f"ghcr.io/{GITHUB_REPOSITORY}/{AIRFLOW_BRANCH}/ci/python3.7"
-    if subprocess.call(args=["docker", "inspect", AIRFLOW_CI_IMAGE], 
stdout=subprocess.DEVNULL) != 0:
-        print(f'[red]The image {AIRFLOW_CI_IMAGE} is not available.[/]\n')
-        print("\n[yellow]Please run at the earliest convenience:[/]\n\nbreeze 
build-image --python 3.7\n\n")
-        sys.exit(1)
-    return_code = subprocess.call(
-        args=[
+    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
+    create_static_check_volumes()
+    cmd_result = run_command(
+        [
             "docker",
             "run",
-            "-v",
-            f"{AIRFLOW_SOURCES}:/opt/airflow/",
+            "-t",
+            *get_extra_docker_flags(MOUNT_SELECTED),
             "-e",
             "SKIP_ENVIRONMENT_INITIALIZATION=true",
             "-e",
             "PRINT_INFO_FROM_SCRIPTS=false",
             "--pull",
             "never",
-            AIRFLOW_CI_IMAGE,
+            airflow_image,
             "-c",
             "python3 
/opt/airflow/scripts/in_container/run_migration_reference.py",
         ],
+        check=False,
+        verbose=VERBOSE,
+        dry_run=DRY_RUN,
     )
-    sys.exit(return_code)
+    sys.exit(cmd_result.returncode)
diff --git a/scripts/ci/pre_commit/pre_commit_mypy.py 
b/scripts/ci/pre_commit/pre_commit_mypy.py
index 9d92b99e80..74d511a65b 100755
--- a/scripts/ci/pre_commit/pre_commit_mypy.py
+++ b/scripts/ci/pre_commit/pre_commit_mypy.py
@@ -16,12 +16,9 @@
 # specific language governing permissions and limitations
 # under the License.
 import os
-import subprocess
 import sys
 from pathlib import Path
 
-from rich import print
-
 if __name__ not in ("__main__", "__mp_main__"):
     raise SystemExit(
         "This file is intended to be executed as an executable program. You 
cannot use it as a module."
@@ -31,22 +28,20 @@ if __name__ not in ("__main__", "__mp_main__"):
 
 AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
 GITHUB_REPOSITORY = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
+# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
+VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
+DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
 
 if __name__ == '__main__':
-    sys.path.insert(0, str(Path(__file__).parents[3].resolve() / "dev" / 
"breeze" / "src"))
-    from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
+    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
     from airflow_breeze.global_constants import MOUNT_SELECTED
     from airflow_breeze.utils.docker_command_utils import 
create_static_check_volumes, get_extra_docker_flags
+    from airflow_breeze.utils.run_utils import get_runnable_ci_image, 
run_command
 
-    AIRFLOW_CI_IMAGE = 
f"ghcr.io/{GITHUB_REPOSITORY}/{AIRFLOW_BRANCH}/ci/python3.7"
-
-    if subprocess.call(args=["docker", "inspect", AIRFLOW_CI_IMAGE], 
stdout=subprocess.DEVNULL) != 0:
-        print(f'[red]The image {AIRFLOW_CI_IMAGE} is not available.[/]\n')
-        print("\n[yellow]Please run at the earliest convenience:[/]\n\nbreeze 
build-image --python 3.7\n\n")
-        sys.exit(1)
+    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
     create_static_check_volumes()
-    return_code = subprocess.call(
-        args=[
+    cmd_result = run_command(
+        [
             "docker",
             "run",
             "-t",
@@ -59,9 +54,12 @@ if __name__ == '__main__':
             "BACKEND=sqlite",
             "--pull",
             "never",
-            AIRFLOW_CI_IMAGE,
+            airflow_image,
             "/opt/airflow/scripts/in_container/run_mypy.sh",
             *sys.argv[1:],
         ],
+        check=False,
+        verbose=VERBOSE,
+        dry_run=DRY_RUN,
     )
-    sys.exit(return_code)
+    sys.exit(cmd_result.returncode)
diff --git a/scripts/ci/pre_commit/pre_commit_ui_lint.py 
b/scripts/ci/pre_commit/pre_commit_ui_lint.py
index 93a5c3bf72..7755e3d204 100755
--- a/scripts/ci/pre_commit/pre_commit_ui_lint.py
+++ b/scripts/ci/pre_commit/pre_commit_ui_lint.py
@@ -16,12 +16,9 @@
 # specific language governing permissions and limitations
 # under the License.
 import os
-import subprocess
 import sys
 from pathlib import Path
 
-from rich import print
-
 if __name__ not in ("__main__", "__mp_main__"):
     raise SystemExit(
         "This file is intended to be executed as an executable program. You 
cannot use it as a module."
@@ -29,33 +26,36 @@ if __name__ not in ("__main__", "__mp_main__"):
     )
 
 AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
-GITHUB_REPOSITORY = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
-AIRFLOW_CI_IMAGE = f"ghcr.io/{GITHUB_REPOSITORY}/main/ci/python3.7"
+# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
+VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
+DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
 
 if __name__ == '__main__':
-    sys.path.insert(0, str(Path(__file__).parents[3].resolve() / "dev" / 
"breeze" / "src"))
-    from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
+    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
+    from airflow_breeze.global_constants import MOUNT_SELECTED
+    from airflow_breeze.utils.docker_command_utils import 
create_static_check_volumes, get_extra_docker_flags
+    from airflow_breeze.utils.run_utils import get_runnable_ci_image, 
run_command
 
-    AIRFLOW_CI_IMAGE = 
f"ghcr.io/{GITHUB_REPOSITORY}/{AIRFLOW_BRANCH}/ci/python3.7"
-    if subprocess.call(args=["docker", "inspect", AIRFLOW_CI_IMAGE], 
stdout=subprocess.DEVNULL) != 0:
-        print(f'[red]The image {AIRFLOW_CI_IMAGE} is not available.[/]\n')
-        print("\n[yellow]Please run at the earliest convenience:[/]\n\nbreeze 
build-image --python 3.7\n\n")
-        sys.exit(1)
-    return_code = subprocess.call(
-        args=[
+    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
+    create_static_check_volumes()
+    cmd_result = run_command(
+        [
             "docker",
             "run",
-            "-v",
-            f"{AIRFLOW_SOURCES}:/opt/airflow/",
+            "-t",
+            *get_extra_docker_flags(MOUNT_SELECTED),
             "-e",
             "SKIP_ENVIRONMENT_INITIALIZATION=true",
             "-e",
             "PRINT_INFO_FROM_SCRIPTS=false",
             "--pull",
             "never",
-            AIRFLOW_CI_IMAGE,
+            airflow_image,
             "-c",
             'cd airflow/ui && yarn --frozen-lockfile --non-interactive && yarn 
run lint',
         ],
+        check=False,
+        verbose=VERBOSE,
+        dry_run=DRY_RUN,
     )
-    sys.exit(return_code)
+    sys.exit(cmd_result.returncode)
diff --git a/scripts/ci/pre_commit/pre_commit_www_lint.py 
b/scripts/ci/pre_commit/pre_commit_www_lint.py
index c2807d4082..65553c3d81 100755
--- a/scripts/ci/pre_commit/pre_commit_www_lint.py
+++ b/scripts/ci/pre_commit/pre_commit_www_lint.py
@@ -16,12 +16,9 @@
 # specific language governing permissions and limitations
 # under the License.
 import os
-import subprocess
 import sys
 from pathlib import Path
 
-from rich import print
-
 if __name__ not in ("__main__", "__mp_main__"):
     raise SystemExit(
         "This file is intended to be executed as an executable program. You 
cannot use it as a module."
@@ -30,32 +27,36 @@ if __name__ not in ("__main__", "__mp_main__"):
 
 AIRFLOW_SOURCES = Path(__file__).parents[3].resolve()
 GITHUB_REPOSITORY = os.environ.get('GITHUB_REPOSITORY', "apache/airflow")
-AIRFLOW_CI_IMAGE = f"ghcr.io/{GITHUB_REPOSITORY}/main/ci/python3.7"
+# allow "False", "false", "True", "true", "f", "F", "t", "T" and the like
+VERBOSE = os.environ.get('VERBOSE', "false")[0].lower() == "t"
+DRY_RUN = os.environ.get('DRY_RUN', "false")[0].lower() == "t"
 
 if __name__ == '__main__':
-    sys.path.insert(0, str(Path(__file__).parents[3].resolve() / "dev" / 
"breeze" / "src"))
-    from airflow_breeze.branch_defaults import AIRFLOW_BRANCH
+    sys.path.insert(0, str(AIRFLOW_SOURCES / "dev" / "breeze" / "src"))
+    from airflow_breeze.global_constants import MOUNT_SELECTED
+    from airflow_breeze.utils.docker_command_utils import 
create_static_check_volumes, get_extra_docker_flags
+    from airflow_breeze.utils.run_utils import get_runnable_ci_image, 
run_command
 
-    AIRFLOW_CI_IMAGE = 
f"ghcr.io/{GITHUB_REPOSITORY}/{AIRFLOW_BRANCH}/ci/python3.7"
-    if subprocess.call(args=["docker", "inspect", AIRFLOW_CI_IMAGE], 
stdout=subprocess.DEVNULL) != 0:
-        print(f'[red]The image {AIRFLOW_CI_IMAGE} is not available.[/]\n')
-        print("\n[yellow]Please run at the earliest convenience:[/]\n\nbreeze 
build-image --python 3.7\n\n")
-        sys.exit(1)
-    return_code = subprocess.call(
-        args=[
+    airflow_image = get_runnable_ci_image(verbose=VERBOSE, dry_run=DRY_RUN)
+    create_static_check_volumes()
+    cmd_result = run_command(
+        [
             "docker",
             "run",
-            "-v",
-            f"{AIRFLOW_SOURCES}:/opt/airflow/",
+            "-t",
+            *get_extra_docker_flags(MOUNT_SELECTED),
             "-e",
             "SKIP_ENVIRONMENT_INITIALIZATION=true",
             "-e",
             "PRINT_INFO_FROM_SCRIPTS=false",
             "--pull",
             "never",
-            AIRFLOW_CI_IMAGE,
+            airflow_image,
             "-c",
             'cd airflow/www && yarn --frozen-lockfile --non-interactive && 
yarn run lint',
         ],
+        check=False,
+        verbose=VERBOSE,
+        dry_run=DRY_RUN,
     )
-    sys.exit(return_code)
+    sys.exit(cmd_result.returncode)

Reply via email to