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&#160;this&#160;message&#160;and&#160;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)">&#160;SBOM&#160;commands&#160;</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="585.6" y="239.6" textLength="854" 
clip-path="url(#breeze-sbom-line-9)">Update&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="585.6" y="264" textLength="854" 
clip-path="url(#breeze-sbom-line-10)">Generate&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="585.6" y="288.4" textLength="854" 
clip-path="url(#breeze-sbom-line-11)">Generate&#160;requirements&#160;for&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="585.6" y="312.8" textLength="854" 
clip-path="url(#breeze-sbom-line-12)">Export&#160;dependency&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="549" y="239.6" textLength="890.6" 
clip-path="url(#breeze-sbom-line-9)">Update&#160;SBOM&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="549" y="264" textLength="890.6" 
clip-path="url(#breeze-sbom-line-10)">Generate&#160;images&#160;with&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="549" y="288.4" textLength="890.6" 
clip-path="url(#breeze-sbom-line-11)">Generate&#160;requirements&#160;for&#160;selected&#160;provider.&#160
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-sbom-r1" x="549" y="312.8" textLength="890.6" 
clip-path="url(#breeze-sbom-line-12)">Export&#160;dependency&#160;information&#160;from&#160;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:&#160;sbom&#160;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:&#160;sbom&#160;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&#160;sbom&#160;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&#160;SBOM&#160;information&#160;in&#160;airflow-site&#160;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&#160;SBOM&#160;information&#160;in&#160;airflow-site-archive&#160;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)">&#160;Update&#160;SBOM&#160;information&#160;flags&#160;</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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-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&#160;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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
-</text><text class="breeze-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&#160;|&#160;3.7&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11&#160;|&#160;3.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</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&#160;</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&#160;the&#160;full&#160;package&#160;name,&#160;for&#160;example&#160;`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&#160;when&#160;you&#160;want&#160;to&#160;selectseveral&#160;similarly&#160;named&#160;packages&#160;together.&#160;</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&#160;|&#160;apache-airflow)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#1
 [...]
-</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&#160;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)">&#160;Parallel&#160;running&#160;</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&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
-</text><text class="breeze-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:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
-</text><text class="breeze-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)">&#160;Common&#160;options&#160;</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)">&#160;Update&#160;SBOM&#160;destination&#160;flags&#160;</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&#160;airflow&#160;docs&#160;are&#160;build&#160;(generated/_build/docs/apache-airflow/stable&#160;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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-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.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-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)">&#160;Update&#160;SBOM&#160;information&#160;flags&#160;</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)&#160;&#160;&#160;&#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
 [...]
+</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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-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)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-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&#160;|&#160;3.7&#160;|&#160;3.8&#160;|&#160;3.9&#160;|&#160;3.10&#160;|&#160;3.11&#160;|&#160;3.12)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</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)">&#16 [...]
+</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&#160;the&#160;full&#160;package&#160;name,&#160;for&#160;example&#160;`apache-airflow-providers-*`.&#160;&#160;&#160;</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&#160;when&#160;you&#160;want&#160;to&#160;selectseveral&#160;similarly&#160;named&#160;packages&#160;together.&#160;&#160;&#160;&#160;</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&#160;|&#160;apache-airflow)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160
 [...]
+</text><text class="breeze-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&#1 [...]
+</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)">&#160;Parallel&#160;running&#160;</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&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 [...]
+</text><text class="breeze-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:&#160;4;&#160;1&lt;=x&lt;=8]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-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)">&#160;Common&#160;options&#160;</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
         )

Reply via email to