This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v3-0-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-0-test by this push:
new 4cca2589245 [v3-0-test] Fix SBOM commands to work for Airfow 2
(#52591) (#52604)
4cca2589245 is described below
commit 4cca25892450ba3541e3351f85a91f17d2dcc48b
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Jul 1 00:45:31 2025 +0200
[v3-0-test] Fix SBOM commands to work for Airfow 2 (#52591) (#52604)
Airflow 3 will need to be updated with package-json.lock but for now
we are fixing the sbom command to work for Airflow 2 (and generate
airflow 2.11 SBOMS.
Changes:
* passing --github-token parameter which might be helpful to not
rate-limit GitHub calls
* allowing to pass either `--airflow-site-archive-path` or
`--airflow-root-path` depending where we want to generate sbom -
it can be generated in `archive` folder directly (when we want
to update historical data) or in the airflow source directory
when we want to add SBOM to **just** generated documentation
during the doc-building phase
(cherry picked from commit acea31e7a3d91c5c0a30736367cca5bc89ede4e9)
Co-authored-by: Jarek Potiuk <[email protected]>
---
dev/breeze/doc/images/output_sbom.svg | 8 +-
dev/breeze/doc/images/output_sbom.txt | 2 +-
.../images/output_sbom_update-sbom-information.svg | 122 +++++++++++-------
.../images/output_sbom_update-sbom-information.txt | 2 +-
.../src/airflow_breeze/commands/sbom_commands.py | 136 ++++++++++++++++-----
.../commands/sbom_commands_config.py | 9 +-
dev/breeze/src/airflow_breeze/utils/cdxgen.py | 31 +++--
dev/breeze/src/airflow_breeze/utils/github.py | 6 +-
8 files changed, 224 insertions(+), 92 deletions(-)
diff --git a/dev/breeze/doc/images/output_sbom.svg
b/dev/breeze/doc/images/output_sbom.svg
index 02ef64aa6a8..058cb7a0023 100644
--- a/dev/breeze/doc/images/output_sbom.svg
+++ b/dev/breeze/doc/images/output_sbom.svg
@@ -104,10 +104,10 @@
</text><text class="breeze-sbom-r5" x="0" y="166.4" textLength="12.2"
clip-path="url(#breeze-sbom-line-6)">│</text><text class="breeze-sbom-r4"
x="24.4" y="166.4" textLength="73.2"
clip-path="url(#breeze-sbom-line-6)">--help</text><text class="breeze-sbom-r6"
x="122" y="166.4" textLength="24.4"
clip-path="url(#breeze-sbom-line-6)">-h</text><text class="breeze-sbom-r1"
x="170.8" y="166.4" textLength="329.4"
clip-path="url(#breeze-sbom-line-6)">Show this message and exi
[...]
</text><text class="breeze-sbom-r5" x="0" y="190.8" textLength="1464"
clip-path="url(#breeze-sbom-line-7)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-r1" x="1464" y="190.8" textLength="12.2"
clip-path="url(#breeze-sbom-line-7)">
</text><text class="breeze-sbom-r5" x="0" y="215.2" textLength="24.4"
clip-path="url(#breeze-sbom-line-8)">╭─</text><text class="breeze-sbom-r5"
x="24.4" y="215.2" textLength="183"
clip-path="url(#breeze-sbom-line-8)"> SBOM commands </text><text
class="breeze-sbom-r5" x="207.4" y="215.2" textLength="1232.2"
clip-path="url(#breeze-sbom-line-8)">─────────────────────────────────────────────────────────────────────────────────────────────────────</text><text
class="breeze-sbo [...]
-</text><text class="breeze-sbom-r5" x="0" y="239.6" textLength="12.2"
clip-path="url(#breeze-sbom-line-9)">│</text><text class="breeze-sbom-r4"
x="24.4" y="239.6" textLength="536.8"
clip-path="url(#breeze-sbom-line-9)">update-sbom-information                     </text><text
class="breeze-sbom-r1" x="585.6" y="239.6" textLength="854"
clip-path="url(#breeze-sbom-line-9)">Update SB [...]
-</text><text class="breeze-sbom-r5" x="0" y="264" textLength="12.2"
clip-path="url(#breeze-sbom-line-10)">│</text><text class="breeze-sbom-r4"
x="24.4" y="264" textLength="536.8"
clip-path="url(#breeze-sbom-line-10)">build-all-airflow-images                    </text><text
class="breeze-sbom-r1" x="585.6" y="264" textLength="854"
clip-path="url(#breeze-sbom-line-10)">Generate images&# [...]
-</text><text class="breeze-sbom-r5" x="0" y="288.4" textLength="12.2"
clip-path="url(#breeze-sbom-line-11)">│</text><text class="breeze-sbom-r4"
x="24.4" y="288.4" textLength="536.8"
clip-path="url(#breeze-sbom-line-11)">generate-providers-requirements             </text><text
class="breeze-sbom-r1" x="585.6" y="288.4" textLength="854"
clip-path="url(#breeze-sbom-line-11)">Generate requirements for selected&#
[...]
-</text><text class="breeze-sbom-r5" x="0" y="312.8" textLength="12.2"
clip-path="url(#breeze-sbom-line-12)">│</text><text class="breeze-sbom-r4"
x="24.4" y="312.8" textLength="536.8"
clip-path="url(#breeze-sbom-line-12)">export-dependency-information               </text><text
class="breeze-sbom-r1" x="585.6" y="312.8" textLength="854"
clip-path="url(#breeze-sbom-line-12)">Export dependency information&#
[...]
+</text><text class="breeze-sbom-r5" x="0" y="239.6" textLength="12.2"
clip-path="url(#breeze-sbom-line-9)">│</text><text class="breeze-sbom-r4"
x="24.4" y="239.6" textLength="500.2"
clip-path="url(#breeze-sbom-line-9)">update-sbom-information                  </text><text
class="breeze-sbom-r1" x="549" y="239.6" textLength="890.6"
clip-path="url(#breeze-sbom-line-9)">Update SBOM informatio [...]
+</text><text class="breeze-sbom-r5" x="0" y="264" textLength="12.2"
clip-path="url(#breeze-sbom-line-10)">│</text><text class="breeze-sbom-r4"
x="24.4" y="264" textLength="500.2"
clip-path="url(#breeze-sbom-line-10)">build-all-airflow-images                 </text><text
class="breeze-sbom-r1" x="549" y="264" textLength="890.6"
clip-path="url(#breeze-sbom-line-10)">Generate images with airf
[...]
+</text><text class="breeze-sbom-r5" x="0" y="288.4" textLength="12.2"
clip-path="url(#breeze-sbom-line-11)">│</text><text class="breeze-sbom-r4"
x="24.4" y="288.4" textLength="500.2"
clip-path="url(#breeze-sbom-line-11)">generate-providers-requirements          </text><text
class="breeze-sbom-r1" x="549" y="288.4" textLength="890.6"
clip-path="url(#breeze-sbom-line-11)">Generate requirements for selected provider. 
[...]
+</text><text class="breeze-sbom-r5" x="0" y="312.8" textLength="12.2"
clip-path="url(#breeze-sbom-line-12)">│</text><text class="breeze-sbom-r4"
x="24.4" y="312.8" textLength="500.2"
clip-path="url(#breeze-sbom-line-12)">export-dependency-information            </text><text
class="breeze-sbom-r1" x="549" y="312.8" textLength="890.6"
clip-path="url(#breeze-sbom-line-12)">Export dependency information from SBOM
[...]
</text><text class="breeze-sbom-r5" x="0" y="337.2" textLength="1464"
clip-path="url(#breeze-sbom-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-r1" x="1464" y="337.2" textLength="12.2"
clip-path="url(#breeze-sbom-line-13)">
</text>
</g>
diff --git a/dev/breeze/doc/images/output_sbom.txt
b/dev/breeze/doc/images/output_sbom.txt
index 472454d8107..12cb2627e16 100644
--- a/dev/breeze/doc/images/output_sbom.txt
+++ b/dev/breeze/doc/images/output_sbom.txt
@@ -1 +1 @@
-b03d6ab68f41027663d36fe101214323
+a66ca015aaf5cd2f0bf0671db381f9f2
diff --git a/dev/breeze/doc/images/output_sbom_update-sbom-information.svg
b/dev/breeze/doc/images/output_sbom_update-sbom-information.svg
index 159e57af898..714502939fe 100644
--- a/dev/breeze/doc/images/output_sbom_update-sbom-information.svg
+++ b/dev/breeze/doc/images/output_sbom_update-sbom-information.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1001.5999999999999"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1245.6"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -37,15 +37,13 @@
.breeze-sbom-update-sbom-information-r3 { fill: #c5c8c6;font-weight: bold }
.breeze-sbom-update-sbom-information-r4 { fill: #68a0b3;font-weight: bold }
.breeze-sbom-update-sbom-information-r5 { fill: #868887 }
-.breeze-sbom-update-sbom-information-r6 { fill: #cc555a }
-.breeze-sbom-update-sbom-information-r7 { fill: #8d7b39 }
-.breeze-sbom-update-sbom-information-r8 { fill: #8a4346 }
-.breeze-sbom-update-sbom-information-r9 { fill: #98a84b;font-weight: bold }
+.breeze-sbom-update-sbom-information-r6 { fill: #8d7b39 }
+.breeze-sbom-update-sbom-information-r7 { fill: #98a84b;font-weight: bold }
</style>
<defs>
<clipPath id="breeze-sbom-update-sbom-information-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="950.5999999999999" />
+ <rect x="0" y="0" width="1463.0" height="1194.6" />
</clipPath>
<clipPath id="breeze-sbom-update-sbom-information-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -161,9 +159,39 @@
<clipPath id="breeze-sbom-update-sbom-information-line-37">
<rect x="0" y="904.3" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-38">
+ <rect x="0" y="928.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-39">
+ <rect x="0" y="953.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-40">
+ <rect x="0" y="977.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-41">
+ <rect x="0" y="1001.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-42">
+ <rect x="0" y="1026.3" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-43">
+ <rect x="0" y="1050.7" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-44">
+ <rect x="0" y="1075.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-45">
+ <rect x="0" y="1099.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-46">
+ <rect x="0" y="1123.9" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-sbom-update-sbom-information-line-47">
+ <rect x="0" y="1148.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="999.6" rx="8"/><text
class="breeze-sbom-update-sbom-information-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom update-sbom-information</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="1243.6" rx="8"/><text
class="breeze-sbom-update-sbom-information-title" fill="#c5c8c6"
text-anchor="middle" x="740"
y="27">Command: sbom update-sbom-information</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -176,42 +204,52 @@
<text class="breeze-sbom-update-sbom-information-r1" x="1464" y="20"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-0)">
</text><text class="breeze-sbom-update-sbom-information-r2" x="12.2" y="44.4"
textLength="73.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-1)">Usage:</text><text
class="breeze-sbom-update-sbom-information-r3" x="97.6" y="44.4"
textLength="427"
clip-path="url(#breeze-sbom-update-sbom-information-line-1)">breeze sbom update-sbom-information</text><text
class="breeze-sbom-update-sbom-information-r1" x="536.8" y="44.4"
textLength="12.2" clip-path="url(#breeze-sbom-upd [...]
</text><text class="breeze-sbom-update-sbom-information-r1" x="1464" y="68.8"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-2)">
-</text><text class="breeze-sbom-update-sbom-information-r1" x="12.2" y="93.2"
textLength="585.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-3)">Update SBOM information in airflow-site project.</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="93.2"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-3)">
+</text><text class="breeze-sbom-update-sbom-information-r1" x="12.2" y="93.2"
textLength="683.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-3)">Update SBOM information in airflow-site-archive project.</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="93.2"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-3)">
</text><text class="breeze-sbom-update-sbom-information-r1" x="1464" y="117.6"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-4)">
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="142"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-5)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="142"
textLength="378.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-5)"> Update SBOM information flags </text><text
class="breeze-sbom-update-sbom-information-r5" x="402.6" y="142"
textLength="1037" clip-path="url(#breeze-sbom- [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="24.4" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">*</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="166.4"
textLength="292.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">--airflow-site-direc
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="190.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="190.8"
textLength="207.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">--airflow-version</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="190.8"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">Vers [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="215.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-8)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="215.2"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-8)">versions)                            &
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="239.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-9)">│</text><text
class="breeze-sbom-update-sbom-information-r7" x="549" y="239.6"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-9)">(TEXT)                            
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="264"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="264" textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">--python</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="264"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">Python versi
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="288.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-11)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="288.4"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-11)">versions)                            
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="312.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-12)">│</text><text
class="breeze-sbom-update-sbom-information-r7" x="549" y="312.8"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-12)">(3.6 | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | 3.12)            
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="337.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-13)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="337.2"
textLength="378.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-13)">--include-provider-dependencies</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="337.2"
textLength="732" clip-path="url(#breeze-sbom-update-sbom-information [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="361.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-14)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="361.6"
textLength="195.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-14)">--include-python</text><text
class="breeze-sbom-update-sbom-information-r1" x="256.2" y="361.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-14)">/ [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="386"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-15)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="386"
textLength="158.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-15)">--include-npm</text><text
class="breeze-sbom-update-sbom-information-r1" x="219.6" y="386"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-15)">/</text><t [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-16)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="410.4"
textLength="219.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-16)">--all-combinations</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="410.4"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-16)"> [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="434.8"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">Ignores </text><text
class="breeze-sbom-update-sbom-information-r4" x="646.6" y="434.8"
textLength="109.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">--i [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="459.2"
textLength="195.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">--package-filter</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="459.2"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">Fi [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="483.6"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">matching the full package name, for example `apache-airflow-providers-*`.</text><text
class="breeze-sbom-update-sbom-information-r5" x="1451. [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-20)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="508"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-20)">Useful when you want to selectseveral similarly named packages together. </text><text
class="breeze-sbom-update-sbom-information-r [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-21)">│</text><text
class="breeze-sbom-update-sbom-information-r7" x="549" y="532.4"
textLength="890.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-21)">(apache-airflow-providers | apache-airflow)                    
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="61" y="556.8"
textLength="85.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">--force</text><text
class="breeze-sbom-update-sbom-information-r1" x="549" y="556.8"
textLength="573.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">Force u [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="581.2"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="581.2"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-23)">
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="605.6"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="605.6"
textLength="219.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)"> Parallel running </text><text
class="breeze-sbom-update-sbom-information-r5" x="244" y="605.6"
textLength="1195.6" clip-path="url(#breeze-sbom-update-sbom-inf [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-25)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="630"
textLength="207.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-25)">--run-in-parallel</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="630"
textLength="854"
clip-path="url(#breeze-sbom-update-sbom-information-line-25)">Run&# [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="654.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-26)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="654.4"
textLength="158.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-26)">--parallelism</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="654.4"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-26)">Max [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="678.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-27)">│</text><text
class="breeze-sbom-update-sbom-information-r7" x="378.2" y="678.8"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-27)">(INTEGER RANGE)                          
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="703.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-28)">│</text><text
class="breeze-sbom-update-sbom-information-r5" x="378.2" y="703.2"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-28)">[default: 4; 1<=x<=8]                       &
[...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="727.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-29)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="727.6"
textLength="170.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-29)">--skip-cleanup</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="727.6"
textLength="732"
clip-path="url(#breeze-sbom-update-sbom-information-line-29)">Sk [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="752"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-30)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="752"
textLength="207.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-30)">--debug-resources</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="752"
textLength="768.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-30)">Whe [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="776.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-31)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="776.4"
textLength="305"
clip-path="url(#breeze-sbom-update-sbom-information-line-31)">--include-success-outputs</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="776.4"
textLength="841.8" clip-path="url(#breeze-sbom-update-sbom-information-l [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="800.8"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="800.8"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-32)">
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="825.2"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-33)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="825.2"
textLength="195.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-33)"> Common options </text><text
class="breeze-sbom-update-sbom-information-r5" x="219.6" y="825.2"
textLength="1220" clip-path="url(#breeze-sbom-update-sbom-infor [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="849.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-34)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="849.6"
textLength="109.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-34)">--verbose</text><text
class="breeze-sbom-update-sbom-information-r9" x="158.6" y="849.6"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-34)">-v</te [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="874"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-35)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="874"
textLength="109.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-35)">--dry-run</text><text
class="breeze-sbom-update-sbom-information-r9" x="158.6" y="874"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-35)">-D</text><te [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="898.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-36)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="898.4"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-36)">--answer</text><text
class="breeze-sbom-update-sbom-information-r9" x="158.6" y="898.4"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-36)">-a</text [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="922.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-37)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="922.8"
textLength="73.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-37)">--help</text><text
class="breeze-sbom-update-sbom-information-r9" x="158.6" y="922.8"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-37)">-h</text>< [...]
-</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="947.2"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="947.2"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-38)">
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="142"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-5)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="142"
textLength="378.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-5)"> Update SBOM destination flags </text><text
class="breeze-sbom-update-sbom-information-r5" x="402.6" y="142"
textLength="1037" clip-path="url(#breeze-sbom- [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="166.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="166.4"
textLength="231.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-6)">--airflow-root-path</text><text
class="breeze-sbom-update-sbom-information-r1" x="402.6" y="166.4"
textLength="1037" clip-path="url(#breeze-sbom-update-sbom-information-line-6)"
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="190.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="402.6" y="190.8"
textLength="329.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-7)">--airflow-site-archive-path</text><text
class="breeze-sbom-update-sbom-information-r1" x="732" y="190.8"
textLength="707.6" clip-path="url(#breeze-sbom-update-sbom-information- [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="215.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-8)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="402.6" y="215.2"
textLength="1037"
clip-path="url(#breeze-sbom-update-sbom-information-line-8)">where airflow docs are build (generated/_build/docs/apache-airflow/stable directory).</text><text
class="breeze-sbom-update-sbom-information-r5" x= [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="239.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-9)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="402.6" y="239.6"
textLength="1037"
clip-path="url(#breeze-sbom-update-sbom-information-line-9)">(DIRECTORY)                           
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="264"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="264"
textLength="329.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-10)">--airflow-site-archive-path</text><text
class="breeze-sbom-update-sbom-information-r1" x="402.6" y="264"
textLength="1037" clip-path="url(#breeze-sbom-update-sbom-information-line [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="288.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-11)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="402.6" y="288.4"
textLength="231.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-11)">--airflow-root-path</text><text
class="breeze-sbom-update-sbom-information-r1" x="634.4" y="288.4"
textLength="805.2" clip-path="url(#breeze-sbom-update-sbom-information-line
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="312.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-12)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="402.6" y="312.8"
textLength="1037"
clip-path="url(#breeze-sbom-update-sbom-information-line-12)">airflow-site-archive/docs-archive/directory.                      
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="337.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-13)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="402.6" y="337.2"
textLength="1037"
clip-path="url(#breeze-sbom-update-sbom-information-line-13)">(DIRECTORY)                           &#
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="361.6"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-14)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="361.6"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-14)">
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="386"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-15)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="386"
textLength="378.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-15)"> Update SBOM information flags </text><text
class="breeze-sbom-update-sbom-information-r5" x="402.6" y="386"
textLength="1037" clip-path="url(#breeze-sbo [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="410.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-16)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="410.4"
textLength="207.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-16)">--airflow-version</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="410.4"
textLength="927.2" clip-path="url(#breeze-sbom-update-sbom-information-line-16
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="434.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="434.8"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-17)">versions)                           
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="459.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="512.4" y="459.2"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-18)">(TEXT)                            
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="483.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="483.6"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">--python</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="483.6"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-19)">Python& [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="508"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-20)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="508"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-20)">versions)                            &
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="532.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-21)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="512.4" y="532.4"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-21)">(3.6 | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | 3.12)           
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="556.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="556.8"
textLength="378.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-22)">--include-provider-dependencies</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="556.8"
textLength="732" clip-path="url(#breeze-sbom-update-sbom-informa [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="581.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-23)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="581.2"
textLength="195.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-23)">--include-python</text><text
class="breeze-sbom-update-sbom-information-r1" x="219.6" y="581.2"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-23)"
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="605.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="605.6"
textLength="158.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)">--include-npm</text><text
class="breeze-sbom-update-sbom-information-r1" x="183" y="605.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-24)">/</t [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="630"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-25)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="630"
textLength="219.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-25)">--all-combinations</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="630"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-25)">Pr [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="654.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-26)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="512.4" y="654.4"
textLength="109.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-26)">--include</text><text
class="breeze-sbom-update-sbom-information-r1" x="622.2" y="654.4"
textLength="817.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-26)"> [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="678.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-27)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="678.8"
textLength="195.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-27)">--package-filter</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="678.8"
textLength="927.2" clip-path="url(#breeze-sbom-update-sbom-information-line-27)
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="703.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-28)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="703.2"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-28)">matching the full package name, for example `apache-airflow-providers-*`.   </text><text
class="breeze-sbom-update-sbom-info [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="727.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-29)">│</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="727.6"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-29)">Useful when you want to selectseveral similarly named packages together.    </text><text
class="breeze-sbom-u [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="752"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-30)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="512.4" y="752"
textLength="927.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-30)">(apache-airflow-providers | apache-airflow)                     
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="776.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-31)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="776.4"
textLength="85.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-31)">--force</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="776.4"
textLength="573.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-31)">Force [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="800.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-32)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="800.8"
textLength="170.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-32)">--github-token</text><text
class="breeze-sbom-update-sbom-information-r1" x="512.4" y="800.8"
textLength="500.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-32)"> [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="825.2"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-33)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="825.2"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-33)">
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="849.6"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-34)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="849.6"
textLength="219.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-34)"> Parallel running </text><text
class="breeze-sbom-update-sbom-information-r5" x="244" y="849.6"
textLength="1195.6" clip-path="url(#breeze-sbom-update-sbom-inf [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="874"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-35)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="874"
textLength="207.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-35)">--run-in-parallel</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="874"
textLength="854"
clip-path="url(#breeze-sbom-update-sbom-information-line-35)">Run&# [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="898.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-36)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="898.4"
textLength="158.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-36)">--parallelism</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="898.4"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-36)">Max [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="922.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-37)">│</text><text
class="breeze-sbom-update-sbom-information-r6" x="378.2" y="922.8"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-37)">(INTEGER RANGE)                          
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="947.2"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-38)">│</text><text
class="breeze-sbom-update-sbom-information-r5" x="378.2" y="947.2"
textLength="915"
clip-path="url(#breeze-sbom-update-sbom-information-line-38)">[default: 4; 1<=x<=8]                       &
[...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="971.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-39)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="971.6"
textLength="170.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-39)">--skip-cleanup</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="971.6"
textLength="732"
clip-path="url(#breeze-sbom-update-sbom-information-line-39)">Sk [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="996"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-40)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="996"
textLength="207.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-40)">--debug-resources</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="996"
textLength="768.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-40)">Whe [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1020.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-41)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="1020.4"
textLength="305"
clip-path="url(#breeze-sbom-update-sbom-information-line-41)">--include-success-outputs</text><text
class="breeze-sbom-update-sbom-information-r1" x="378.2" y="1020.4"
textLength="841.8" clip-path="url(#breeze-sbom-update-sbom-informatio [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1044.8"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-42)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="1044.8"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-42)">
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1069.2"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-43)">╭─</text><text
class="breeze-sbom-update-sbom-information-r5" x="24.4" y="1069.2"
textLength="195.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-43)"> Common options </text><text
class="breeze-sbom-update-sbom-information-r5" x="219.6" y="1069.2"
textLength="1220" clip-path="url(#breeze-sbom-update-sbom-in [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1093.6"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-44)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="1093.6"
textLength="109.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-44)">--verbose</text><text
class="breeze-sbom-update-sbom-information-r7" x="158.6" y="1093.6"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-44)">-v< [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1118"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-45)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="1118"
textLength="109.8"
clip-path="url(#breeze-sbom-update-sbom-information-line-45)">--dry-run</text><text
class="breeze-sbom-update-sbom-information-r7" x="158.6" y="1118"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-45)">-D</text> [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1142.4"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-46)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="1142.4"
textLength="97.6"
clip-path="url(#breeze-sbom-update-sbom-information-line-46)">--answer</text><text
class="breeze-sbom-update-sbom-information-r7" x="158.6" y="1142.4"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-46)">-a</t [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1166.8"
textLength="12.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-47)">│</text><text
class="breeze-sbom-update-sbom-information-r4" x="24.4" y="1166.8"
textLength="73.2"
clip-path="url(#breeze-sbom-update-sbom-information-line-47)">--help</text><text
class="breeze-sbom-update-sbom-information-r7" x="158.6" y="1166.8"
textLength="24.4"
clip-path="url(#breeze-sbom-update-sbom-information-line-47)">-h</tex [...]
+</text><text class="breeze-sbom-update-sbom-information-r5" x="0" y="1191.2"
textLength="1464"
clip-path="url(#breeze-sbom-update-sbom-information-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-sbom-update-sbom-information-r1" x="1464" y="1191.2"
textLength="12.2" clip-path="url(#breeze-sbom-update-sbom-information-line-48)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_sbom_update-sbom-information.txt
b/dev/breeze/doc/images/output_sbom_update-sbom-information.txt
index 6e5ac979b16..483167d8d8a 100644
--- a/dev/breeze/doc/images/output_sbom_update-sbom-information.txt
+++ b/dev/breeze/doc/images/output_sbom_update-sbom-information.txt
@@ -1 +1 @@
-7cb3c6bd7a08706720035864df941273
+43dadb548e01dd68fd148adf2e62f750
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
index f7d7b77a18c..8eb29258792 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands.py
@@ -121,13 +121,24 @@ SBOM_INDEX_TEMPLATE = """
"""
[email protected](name="update-sbom-information", help="Update SBOM information in
airflow-site project.")
[email protected](name="update-sbom-information", help="Update SBOM information in
airflow-site-archive project.")
@click.option(
- "--airflow-site-directory",
+ "--airflow-site-archive-path",
type=click.Path(file_okay=False, dir_okay=True, path_type=Path,
exists=True),
- required=True,
- envvar="AIRFLOW_SITE_DIRECTORY",
- help="Directory where airflow-site directory is located.",
+ required=False,
+ envvar="AIRFLOW_SITE_ARCHIVE_PATH",
+ help="Directory where airflow-site-archive directory is located. Mutually
exclusive with "
+ "--airflow-root-path option. When specified SBOM generated files are
placed in "
+ "airflow-site-archive/docs-archive/directory.",
+)
[email protected](
+ "--airflow-root-path",
+ type=click.Path(file_okay=False, dir_okay=True, path_type=Path,
exists=True),
+ required=False,
+ help="Path to the root of the airflow repository. Mutually exclusive with "
+ "--airflow-site-archive-path option. When specified SBOM generated files
are placed where "
+ "airflow docs are build (generated/_build/docs/apache-airflow/stable
directory).",
+ envvar="AIRFLOW_ROOT_PATH",
)
@click.option(
"--airflow-version",
@@ -169,6 +180,7 @@ SBOM_INDEX_TEMPLATE = """
is_flag=True,
help="Produces all combinations of airflow sbom npm/python(airflow/full).
Ignores --include flags",
)
+@option_github_token
@option_verbose
@option_dry_run
@option_answer
@@ -182,7 +194,8 @@ SBOM_INDEX_TEMPLATE = """
default="apache-airflow",
)
def update_sbom_information(
- airflow_site_directory: Path,
+ airflow_site_archive_path: Path | None,
+ airflow_root_path: Path | None,
airflow_version: str | None,
python: str | None,
include_provider_dependencies: bool,
@@ -195,6 +208,7 @@ def update_sbom_information(
skip_cleanup: bool,
force: bool,
all_combinations: bool,
+ github_token: str | None,
package_filter: tuple[str, ...],
):
import jinja2
@@ -208,8 +222,10 @@ def update_sbom_information(
if airflow_version is None:
airflow_versions, _ = get_active_airflow_versions()
+ all_airflow_versions = airflow_versions.copy()
else:
airflow_versions = [airflow_version]
+ all_airflow_versions = get_active_airflow_versions(confirm=False)
if python is None:
python_versions = ALL_HISTORICAL_PYTHON_VERSIONS
else:
@@ -219,7 +235,19 @@ def update_sbom_information(
jobs_to_run: list[SbomApplicationJob] = []
- airflow_site_archive_directory = airflow_site_directory / "docs-archive"
+ if airflow_root_path and airflow_site_archive_path:
+ get_console().print(
+ "[error]You cannot specify both --airflow-site-archive-path and
--airflow-root-path. "
+ "Please specify only one of them."
+ )
+ sys.exit(1)
+
+ if not airflow_root_path and not airflow_site_archive_path:
+ get_console().print(
+ "[error]You must specify either --airflow-site-archive-path or
--airflow-root-path. "
+ "Please specify one of them."
+ )
+ sys.exit(1)
def _dir_exists_warn_and_should_skip(dir: Path, force: bool) -> bool:
if dir.exists():
@@ -230,7 +258,6 @@ def update_sbom_information(
return False
return False
- apache_airflow_documentation_directory = airflow_site_archive_directory /
"apache-airflow"
if package_filter == "apache-airflow":
if all_combinations:
for include_npm, include_python, include_provider_dependencies in [
@@ -244,8 +271,10 @@ def update_sbom_information(
if not include_python:
use_python_versions = [None]
core_jobs(
+ all_airflow_versions,
_dir_exists_warn_and_should_skip,
- apache_airflow_documentation_directory,
+ airflow_site_archive_path,
+ airflow_root_path,
airflow_versions,
application_root_path,
force,
@@ -260,8 +289,10 @@ def update_sbom_information(
if not include_python:
use_python_versions = [None]
core_jobs(
+ all_airflow_versions,
_dir_exists_warn_and_should_skip,
- apache_airflow_documentation_directory,
+ airflow_site_archive_path,
+ airflow_root_path,
airflow_versions,
application_root_path,
force,
@@ -284,7 +315,7 @@ def update_sbom_information(
provider_id,
provider_version,
provider_version_documentation_directory,
- ) in
list_providers_from_providers_requirements(airflow_site_archive_directory):
+ ) in
list_providers_from_providers_requirements(airflow_site_archive_path):
destination_dir = provider_version_documentation_directory / "sbom"
destination_dir.mkdir(parents=True, exist_ok=True)
@@ -340,6 +371,7 @@ def update_sbom_information(
"job": job,
"output": outputs[index],
"port_map": port_map,
+ "github_token": github_token,
},
)
for index, job in enumerate(jobs_to_run)
@@ -353,7 +385,7 @@ def update_sbom_information(
)
else:
for job in jobs_to_run:
- produce_sbom_for_application_via_cdxgen_server(job, output=None)
+ produce_sbom_for_application_via_cdxgen_server(job, output=None,
github_token=github_token)
html_template = SBOM_INDEX_TEMPLATE
@@ -372,6 +404,20 @@ def update_sbom_information(
if package_filter == "apache-airflow":
for airflow_v in airflow_versions:
+ if airflow_site_archive_path:
+ apache_airflow_documentation_directory = (
+ airflow_site_archive_path / "docs-archive" /
"apache-airflow"
+ )
+ elif airflow_root_path:
+ apache_airflow_documentation_directory = (
+ airflow_root_path / "generated" / "_build" / "docs" /
"apache-airflow"
+ )
+ else:
+ get_console().print(
+ "[error]You must specify either
--airflow-site-archive-path or --airflow-root-path. "
+ "Please specify one of them."
+ )
+ sys.exit(1)
airflow_version_dir = apache_airflow_documentation_directory /
airflow_v
destination_dir = airflow_version_dir / "sbom"
_generate_index(destination_dir, None, airflow_v)
@@ -381,14 +427,16 @@ def update_sbom_information(
provider_id,
provider_version,
provider_version_documentation_directory,
- ) in
list_providers_from_providers_requirements(airflow_site_archive_directory):
+ ) in
list_providers_from_providers_requirements(airflow_site_archive_path):
destination_dir = provider_version_documentation_directory / "sbom"
_generate_index(destination_dir, provider_id, provider_version)
def core_jobs(
+ all_airflow_versions: list[str],
_dir_exists_warn_and_should_skip,
- apache_airflow_documentation_directory: Path,
+ airflow_site_archive_path: Path | None,
+ airflow_root_path: Path | None,
airflow_versions: list[str],
application_root_path: Path,
force: bool,
@@ -398,18 +446,48 @@ def core_jobs(
jobs_to_run: list[SbomApplicationJob],
python_versions: list[str | None],
):
+ latest_airflow_version = all_airflow_versions[-1]
# Create core jobs
for airflow_v in airflow_versions:
- airflow_version_dir = apache_airflow_documentation_directory /
airflow_v
- if not airflow_version_dir.exists():
- get_console().print(f"[warning]The {airflow_version_dir} does not
exist. Skipping")
+ if airflow_site_archive_path:
+ airflow_version_dirs = [
+ airflow_site_archive_path / "docs-archive" / "apache-airflow"
/ airflow_v,
+ ]
+ if latest_airflow_version == airflow_v:
+ airflow_version_dirs.append(airflow_site_archive_path /
"apache-airflow" / "stable")
+ elif airflow_root_path:
+ airflow_version_dirs = [
+ airflow_root_path / "generated" / "_build" / "docs" /
"apache-airflow" / "stable"
+ ]
+ else:
+ get_console().print(
+ "[error]You must specify either --airflow-site-archive-path or
--airflow-root-path. "
+ "Please specify one of them."
+ )
+ sys.exit(1)
+ exists = True
+ for airflow_version_dir in airflow_version_dirs:
+ if not airflow_version_dir.exists():
+ get_console().print(f"[warning]The {airflow_version_dir} does
not exist. Skipping")
+ exists = False
+ break
+ if not exists:
continue
- destination_dir = airflow_version_dir / "sbom"
-
- if _dir_exists_warn_and_should_skip(destination_dir, force):
+ destination_dirs: list[Path] = []
+ for airflow_version_dir in airflow_version_dirs:
+ destination_dir = airflow_version_dir / "sbom"
+ if not _dir_exists_warn_and_should_skip(destination_dir, force):
+ destination_dirs.append(destination_dir)
+ else:
+ get_console().print(
+ f"[warning]The {destination_dir} already exists and
generation is not forced. "
+ f"Skipping for airflow version {airflow_v}"
+ )
+ if not destination_dirs:
+ get_console().print(
+ f"[warning]All directories already exist and generation is not
forced. Skipping {airflow_v}"
+ )
continue
-
- destination_dir.mkdir(parents=True, exist_ok=True)
get_console().print(f"[info]Attempting to update sbom for
{airflow_v}.")
for python_version in python_versions:
if include_python and include_npm:
@@ -425,10 +503,12 @@ def core_jobs(
suffix += "-full"
target_sbom_file_name =
f"apache-airflow-sbom-{airflow_v}{suffix}.json"
- target_sbom_path = destination_dir / target_sbom_file_name
-
- if _dir_exists_warn_and_should_skip(target_sbom_path, force):
- continue
+ target_sbom_paths: list[Path] = []
+ for destination_dir in destination_dirs:
+ target_sbom_path = destination_dir / target_sbom_file_name
+ if _dir_exists_warn_and_should_skip(target_sbom_path, force):
+ continue
+ target_sbom_paths.append(target_sbom_path)
jobs_to_run.append(
SbomCoreJob(
@@ -436,7 +516,7 @@ def core_jobs(
python_version=python_version,
application_root_path=application_root_path,
include_provider_dependencies=include_provider_dependencies,
- target_path=target_sbom_path,
+ target_paths=target_sbom_paths,
include_python=include_python,
include_npm=include_npm,
)
@@ -745,7 +825,7 @@ def export_dependency_information(
import requests
- base_url =
f"https://airflow.apache.org/docs/apache-airflow/{airflow_version}/sbom"
+ base_url =
f"https://airflow.apache.org/docs/apache-airflow/{airflow_version}"
sbom_file_base =
f"apache-airflow-sbom-{airflow_version}-python{python}-python-only"
sbom_core_url = f"{base_url}/{sbom_file_base}.json"
diff --git a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
index 96cc5cad885..a68e8a6c9ac 100644
--- a/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/sbom_commands_config.py
@@ -28,10 +28,16 @@ SBOM_COMMANDS: dict[str, str | list[str]] = {
SBOM_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
"breeze sbom update-sbom-information": [
+ {
+ "name": "Update SBOM destination flags",
+ "options": [
+ "--airflow-root-path",
+ "--airflow-site-archive-path",
+ ],
+ },
{
"name": "Update SBOM information flags",
"options": [
- "--airflow-site-directory",
"--airflow-version",
"--python",
"--include-provider-dependencies",
@@ -40,6 +46,7 @@ SBOM_PARAMETERS: dict[str, list[dict[str, str | list[str]]]]
= {
"--all-combinations",
"--package-filter",
"--force",
+ "--github-token",
],
},
{
diff --git a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
index f8822250dc2..d3b09b459d6 100644
--- a/dev/breeze/src/airflow_breeze/utils/cdxgen.py
+++ b/dev/breeze/src/airflow_breeze/utils/cdxgen.py
@@ -137,7 +137,7 @@ def get_all_airflow_versions_image_name(python_version:
str) -> str:
def list_providers_from_providers_requirements(
- airflow_site_archive_directory: Path,
+ airflow_site_archive_path: Path,
) -> Generator[tuple[str, str, str, Path], None, None]:
for node_name in os.listdir(PROVIDER_REQUIREMENTS_DIR_PATH):
if not node_name.startswith("provider"):
@@ -146,7 +146,7 @@ def list_providers_from_providers_requirements(
provider_id, provider_version = node_name.rsplit("-", 1)
provider_documentation_directory = (
- airflow_site_archive_directory
+ airflow_site_archive_path
/ f"apache-airflow-providers-{provider_id.replace('provider-',
'').replace('.', '-')}"
)
provider_version_documentation_directory =
provider_documentation_directory / provider_version
@@ -325,10 +325,10 @@
constraints-{airflow_version}/constraints-{python_version}.txt
@dataclass
class SbomApplicationJob:
python_version: str | None
- target_path: Path
+ target_paths: list[Path]
@abstractmethod
- def produce(self, output: Output | None, port: int) -> tuple[int, str]:
+ def produce(self, output: Output | None, port: int, github_token: str |
None) -> tuple[int, str]:
raise NotImplementedError
@abstractmethod
@@ -368,7 +368,7 @@ class SbomCoreJob(SbomApplicationJob):
source_dir = source_dir / f"python{self.python_version}"
return source_dir
- def download_dependency_files(self, output: Output | None) -> bool:
+ def download_dependency_files(self, output: Output | None, github_token:
str | None) -> bool:
source_dir = self.get_files_directory(self.application_root_path)
source_dir.mkdir(parents=True, exist_ok=True)
lock_file_relative_path = "airflow/www/yarn.lock"
@@ -384,6 +384,7 @@ class SbomCoreJob(SbomApplicationJob):
python_version=self.python_version,
include_provider_dependencies=self.include_provider_dependencies,
output_file=source_dir / "requirements.txt",
+ github_token=github_token,
):
get_console(output=output).print(
f"[warning]Failed to download constraints file for "
@@ -395,7 +396,7 @@ class SbomCoreJob(SbomApplicationJob):
(source_dir / "requirements.txt").unlink(missing_ok=True)
return True
- def produce(self, output: Output | None, port: int) -> tuple[int, str]:
+ def produce(self, output: Output | None, port: int, github_token: str |
None) -> tuple[int, str]:
import requests
get_console(output=output).print(
@@ -403,7 +404,7 @@ class SbomCoreJob(SbomApplicationJob):
f"include_provider_dependencies={self.include_provider_dependencies}, "
f"python={self.include_python}, npm={self.include_npm}"
)
- if not self.download_dependency_files(output):
+ if not self.download_dependency_files(output,
github_token=github_token):
return 0, f"SBOM Generate
{self.airflow_version}:{self.python_version}"
get_console(output=output).print(
@@ -437,7 +438,8 @@ class SbomCoreJob(SbomApplicationJob):
response.status_code,
f"SBOM Generate
{self.airflow_version}:python{self.python_version}",
)
- self.target_path.write_bytes(response.content)
+ for target_path in self.target_paths:
+ target_path.write_bytes(response.content)
suffix = ""
if self.python_version:
suffix += f":python{self.python_version}"
@@ -462,7 +464,7 @@ class SbomProviderJob(SbomApplicationJob):
def get_job_name(self) -> str:
return
f"{self.provider_id}:{self.provider_version}:python{self.python_version}"
- def produce(self, output: Output | None, port: int) -> tuple[int, str]:
+ def produce(self, output: Output | None, port: int, github_token: str |
None) -> tuple[int, str]:
import requests
get_console(output=output).print(
@@ -491,7 +493,8 @@ class SbomProviderJob(SbomApplicationJob):
response.status_code,
f"SBOM Generate
{self.provider_id}:{self.provider_version}:{self.python_version}",
)
- self.target_path.write_bytes(response.content)
+ for target_path in self.target_paths:
+ target_path.write_bytes(response.content)
get_console(output=output).print(
f"[success]Generated SBOM for
{self.provider_id}:{self.provider_version}:"
f"{self.python_version}"
@@ -501,12 +504,16 @@ class SbomProviderJob(SbomApplicationJob):
def produce_sbom_for_application_via_cdxgen_server(
- job: SbomApplicationJob, output: Output | None, port_map: dict[str, int] |
None = None
+ job: SbomApplicationJob,
+ output: Output | None,
+ github_token: str | None,
+ port_map: dict[str, int] | None = None,
) -> tuple[int, str]:
"""
Produces SBOM for application using cdxgen server.
:param job: Job to run
:param output: Output to use
+ :param github_token: GitHub token to use for downloading files`
:param port_map map of process name to port - making sure that one process
talks to one server
in case parallel processing is used
:return: tuple with exit code and output
@@ -517,7 +524,7 @@ def produce_sbom_for_application_via_cdxgen_server(
else:
port = port_map[multiprocessing.current_process().name]
get_console(output=output).print(f"[info]Using port {port}")
- return job.produce(output, port)
+ return job.produce(output, port, github_token)
def convert_licenses(licenses: list[dict[str, Any]]) -> str:
diff --git a/dev/breeze/src/airflow_breeze/utils/github.py
b/dev/breeze/src/airflow_breeze/utils/github.py
index d1a9c262104..2f1f960c4cd 100644
--- a/dev/breeze/src/airflow_breeze/utils/github.py
+++ b/dev/breeze/src/airflow_breeze/utils/github.py
@@ -176,10 +176,10 @@ def get_active_airflow_versions(confirm: bool = True) ->
tuple[list[str], dict[s
get_console().print("[error]Error fetching tag date for Airflow
{version}")
sys.exit(1)
airflow_release_dates[version] = date
- get_console().print("[info]All Airflow 2 versions")
- for version in airflow_versions:
- get_console().print(f" {version}:
[info]{airflow_release_dates[version]}[/]")
+ get_console().print("[info]All Airflow 2/3 versions")
if confirm:
+ for version in airflow_versions:
+ get_console().print(f" {version}:
[info]{airflow_release_dates[version]}[/]")
answer = user_confirm(
"Should we continue with those versions?", quit_allowed=False,
default_answer=Answer.YES
)