feat: center section divider to match table width (#2698)

The '========== Updated Releases ==========' header was a fixed 38
chars regardless of the table width below it. Now the divider line
is extended to match the table's visual width, with the title text
centered within the '=' borders.

- Add TableVisualWidth() to measure table width via runewidth
- Add HeaderDividerCentered() and HeaderDividerCenteredStyled()
  for centered dividers with optional bold+blue ANSI styling
- Refactor DisplayAffectedReleases to build the table first, then
  compute its width before logging the header
- Update all test snapshots and integration test output files

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero
2026-07-10 21:17:35 +08:00
committed by GitHub
parent 30f529f529
commit a9e4a8518a
59 changed files with 191 additions and 78 deletions
@@ -23,12 +23,12 @@ GROUP RELEASES
processing releases in group 1/1: default//foo
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
foo stable/mychart1 3.1.0 0s
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
bar 0s
@@ -26,12 +26,12 @@ GROUP RELEASES
processing releases in group 1/1: default//foo
WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
foo stable/mychart1 3.1.0 0s
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
bar 0s
@@ -20,7 +20,7 @@ GROUP RELEASES
processing releases in group 1/2: default//bar
processing releases in group 2/2: default//foo
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
bar 0s
foo 0s
@@ -20,7 +20,7 @@ GROUP RELEASES
processing releases in group 1/2: default//foo
processing releases in group 2/2: default//bar
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
foo 0s
bar 0s
@@ -26,12 +26,12 @@ GROUP RELEASES
processing releases in group 1/1: default//bar
WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
bar stable/mychart2 3.1.0 0s
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
foo 0s
@@ -23,12 +23,12 @@ GROUP RELEASES
processing releases in group 1/1: default//bar
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
bar stable/mychart2 3.1.0 0s
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
foo 0s
@@ -24,7 +24,7 @@ update strategy - sync success
processing releases in group 2/2: default//foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
baz stable/mychart3 3.1.0 0s
bar stable/mychart2 3.1.0 0s
@@ -24,7 +24,7 @@ update strategy - sync success
processing releases in group 2/2: default//foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
baz stable/mychart3 3.1.0 0s
bar stable/mychart2 3.1.0 0s
@@ -22,7 +22,7 @@ processing releases in group 1/2: default//baz, default//bar
processing releases in group 2/2: default//foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
baz stable/mychart3 3.1.0 0s
bar stable/mychart2 3.1.0 0s
@@ -22,7 +22,7 @@ processing releases in group 1/2: default//baz, default//bar
processing releases in group 2/2: default//foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
baz stable/mychart3 3.1.0 0s
bar stable/mychart2 3.1.0 0s
+1 -1
View File
@@ -24,7 +24,7 @@ getting deployed release version failed: unexpected list key: listkey(filter=^ba
processing releases in group 2/2: default//foo
getting deployed release version failed: unexpected list key: listkey(filter=^foo$,flags=--kube-context default --uninstalling --deployed --failed --pending) not found in
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
baz stable/mychart3 0s
bar stable/mychart2 0s
+2 -2
View File
@@ -46,7 +46,7 @@ processing releases in group 3/5: default//anotherbackend
processing releases in group 4/5: default//backend-v2
processing releases in group 5/5: default//frontend-v3
========== Updated Releases ==========
========================== Updated Releases ===========================
NAME NAMESPACE CHART VERSION DURATION
logging charts/fluent-bit 3.1.0 0s
front-proxy stable/envoy 3.1.0 0s
@@ -57,7 +57,7 @@ backend-v2 charts/backend 3.1.0 0s
frontend-v3 charts/frontend 3.1.0 0s
========== Deleted Releases ==========
======== Deleted Releases ========
NAME NAMESPACE DURATION
frontend-v1 0s
backend-v1 0s
@@ -22,7 +22,7 @@ getting deployed release version failed: Failed to get the version for: mychart1
processing releases in group 2/2: default/testNamespace/bar
getting deployed release version failed: Failed to get the version for: mychart2
========== Updated Releases ==========
==================== Updated Releases =====================
NAME NAMESPACE CHART VERSION DURATION
foo testNamespace stable/mychart1 0s
bar testNamespace stable/mychart2 0s
+1 -1
View File
@@ -22,7 +22,7 @@ getting deployed release version failed: Failed to get the version for: mychart1
processing releases in group 2/2: default//bar
getting deployed release version failed: Failed to get the version for: mychart2
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
foo stable/mychart1 0s
bar stable/mychart2 0s
@@ -22,7 +22,7 @@ getting deployed release version failed: Failed to get the version for: mychart2
processing releases in group 2/2: default/testNamespace/foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
==================== Updated Releases =====================
NAME NAMESPACE CHART VERSION DURATION
bar testNamespace stable/mychart2 0s
foo testNamespace stable/mychart1 0s
+1 -1
View File
@@ -22,7 +22,7 @@ getting deployed release version failed: Failed to get the version for: mychart2
processing releases in group 2/2: default//foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
bar stable/mychart2 0s
foo stable/mychart1 0s
@@ -28,13 +28,13 @@ getting deployed release version failed: Failed to get the version for: mychart2
processing releases in group 2/2: default/ns1/foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
bar ns1 stable/mychart2 0s
foo ns1 stable/mychart1 0s
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
bar ns2 0s
@@ -22,7 +22,7 @@ getting deployed release version failed: Failed to get the version for: mychart2
processing releases in group 2/2: default/ns1/foo
getting deployed release version failed: Failed to get the version for: mychart1
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
bar ns2 stable/mychart2 0s
foo ns1 stable/mychart1 0s
@@ -22,7 +22,7 @@ getting deployed release version failed: Failed to get the version for: mychart1
processing releases in group 2/2: default/ns2/bar
getting deployed release version failed: Failed to get the version for: mychart2
========== Updated Releases ==========
================== Updated Releases ===================
NAME NAMESPACE CHART VERSION DURATION
foo ns1 stable/mychart1 0s
bar ns2 stable/mychart2 0s
@@ -47,7 +47,7 @@ GROUP RELEASES
processing releases in group 1/2: default/default/external-secrets
processing releases in group 2/2: default/default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
+1 -1
View File
@@ -15,7 +15,7 @@ GROUP RELEASES
processing releases in group 1/1: default/default/foo
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 3.1.0 0s
@@ -48,7 +48,7 @@ processing releases in group 1/3: default//serviceC
processing releases in group 2/3: default//serviceB
processing releases in group 3/3: default//serviceA
========== Updated Releases ==========
================= Updated Releases =================
NAME NAMESPACE CHART VERSION DURATION
serviceC my/chart 3.1.0 0s
serviceB my/chart 3.1.0 0s
@@ -15,7 +15,7 @@ GROUP RELEASES
processing releases in group 1/1: default/default/foo
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 3.1.0 0s
@@ -52,7 +52,7 @@ processing releases in group 1/3: default/kube-system/kubernetes-external-secret
processing releases in group 2/3: default/default/external-secrets
processing releases in group 3/3: default/default/my-release
========== Updated Releases ==========
============================== Updated Releases ==============================
NAME NAMESPACE CHART VERSION DURATION
kubernetes-external-secrets kube-system incubator/raw 3.1.0 0s
external-secrets default incubator/raw 3.1.0 0s
@@ -49,7 +49,7 @@ GROUP RELEASES
processing releases in group 1/2: default/default/external-secrets
processing releases in group 2/2: default/default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
@@ -59,13 +59,13 @@ processing releases in group 1/2: default/default/external-secrets
WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs
processing releases in group 2/2: default/default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
========== Deleted Releases ==========
================= Deleted Releases =================
NAME NAMESPACE DURATION
kubernetes-external-secrets kube-system 0s
@@ -53,7 +53,7 @@ processing releases in group 1/2: default/default/external-secrets
WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs
processing releases in group 2/2: default/default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
+1 -1
View File
@@ -47,7 +47,7 @@ GROUP RELEASES
processing releases in group 1/2: default/default/external-secrets
processing releases in group 2/2: default/default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
@@ -44,7 +44,7 @@ GROUP RELEASES
processing releases in group 1/1: default/default/external-secrets
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
@@ -15,7 +15,7 @@ GROUP RELEASES
processing releases in group 1/1: default/default/my-release
========== Updated Releases ==========
==================== Updated Releases =====================
NAME NAMESPACE CHART VERSION DURATION
my-release default incubator/raw 3.1.0 0s
@@ -52,7 +52,7 @@ processing releases in group 1/3: kube-system/kubernetes-external-secrets
processing releases in group 2/3: default/external-secrets
processing releases in group 3/3: default/my-release
========== Updated Releases ==========
============================== Updated Releases ==============================
NAME NAMESPACE CHART VERSION DURATION
kubernetes-external-secrets kube-system incubator/raw 3.1.0 0s
external-secrets default incubator/raw 3.1.0 0s
@@ -49,7 +49,7 @@ GROUP RELEASES
processing releases in group 1/2: default/external-secrets
processing releases in group 2/2: default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
@@ -59,13 +59,13 @@ processing releases in group 1/2: default/external-secrets
WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs
processing releases in group 2/2: default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
========== Deleted Releases ==========
================= Deleted Releases =================
NAME NAMESPACE DURATION
kubernetes-external-secrets kube-system 0s
@@ -53,7 +53,7 @@ processing releases in group 1/2: default/external-secrets
WARNING: release external-secrets needs kubernetes-external-secrets, but kubernetes-external-secrets is not installed due to installed: false. Either mark kubernetes-external-secrets as installed or remove kubernetes-external-secrets from external-secrets's needs
processing releases in group 2/2: default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
+1 -1
View File
@@ -47,7 +47,7 @@ GROUP RELEASES
processing releases in group 1/2: default/external-secrets
processing releases in group 2/2: default/my-release
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
my-release default incubator/raw 3.1.0 0s
@@ -44,7 +44,7 @@ GROUP RELEASES
processing releases in group 1/1: default/external-secrets
========== Updated Releases ==========
======================= Updated Releases ========================
NAME NAMESPACE CHART VERSION DURATION
external-secrets default incubator/raw 3.1.0 0s
@@ -8,7 +8,7 @@ hook[preapply] logs |
hook[presync] logs | foo
hook[presync] logs |
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 0s
@@ -2,7 +2,7 @@
hook[presync] logs | foo
hook[presync] logs |
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 0s
@@ -2,7 +2,7 @@
hook[preapply] logs | foo
hook[preapply] logs |
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 0s
@@ -11,7 +11,7 @@ hook[preapply] logs |
hook[presync] logs | foo
hook[presync] logs |
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 3.1.0 0s
@@ -8,7 +8,7 @@ hook[preapply] logs |
hook[presync] logs | foo
hook[presync] logs |
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 0s
@@ -17,7 +17,7 @@ hook[presync] logs |
hook[presync] logs | bar
hook[presync] logs |
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 0s
bar default incubator/raw 0s
@@ -14,12 +14,12 @@ hook[presync] logs |
hook[presync] logs | foo
hook[presync] logs |
========== Updated Releases ==========
================= Updated Releases ==================
NAME NAMESPACE CHART VERSION DURATION
foo default incubator/raw 3.1.0 0s
========== Deleted Releases ==========
==== Deleted Releases =====
NAME NAMESPACE DURATION
bar default 0s
@@ -13,7 +13,7 @@ release "frontend-v1" processed
processing releases in group 2/2: default//backend-v1
release "backend-v1" processed
========== Deleted Releases ==========
======== Deleted Releases ========
NAME NAMESPACE DURATION
frontend-v1 0s
backend-v1 0s
@@ -8,7 +8,7 @@ GROUP RELEASES
processing releases in group 1/1: default//logging
release "logging" processed
========== Deleted Releases ==========
====== Deleted Releases ======
NAME NAMESPACE DURATION
logging 0s
+1 -1
View File
@@ -13,7 +13,7 @@ release "frontend-v1" processed
processing releases in group 2/2: default//backend-v1
release "backend-v1" processed
========== Deleted Releases ==========
======== Deleted Releases ========
NAME NAMESPACE DURATION
frontend-v1 0s
backend-v1 0s
+1 -1
View File
@@ -25,7 +25,7 @@ processing releases in group 5/5: default//front-proxy, default//logging
release "front-proxy" processed
release "logging" processed
========== Deleted Releases ==========
========= Deleted Releases ==========
NAME NAMESPACE DURATION
frontend-v3 0s
frontend-v2 0s
@@ -13,7 +13,7 @@ release "frontend-v1" processed
processing releases in group 2/2: backend-v1
release "backend-v1" processed
========== Deleted Releases ==========
======== Deleted Releases ========
NAME NAMESPACE DURATION
frontend-v1 0s
backend-v1 0s
@@ -8,7 +8,7 @@ GROUP RELEASES
processing releases in group 1/1: logging
release "logging" processed
========== Deleted Releases ==========
====== Deleted Releases ======
NAME NAMESPACE DURATION
logging 0s
+1 -1
View File
@@ -13,7 +13,7 @@ release "frontend-v1" processed
processing releases in group 2/2: backend-v1
release "backend-v1" processed
========== Deleted Releases ==========
======== Deleted Releases ========
NAME NAMESPACE DURATION
frontend-v1 0s
backend-v1 0s
+1 -1
View File
@@ -25,7 +25,7 @@ processing releases in group 5/5: front-proxy, logging
release "front-proxy" processed
release "logging" processed
========== Deleted Releases ==========
========= Deleted Releases ==========
NAME NAMESPACE DURATION
frontend-v3 0s
frontend-v2 0s