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
+18 -13
View File
@@ -5167,12 +5167,11 @@ func hideChartCredentials(chartCredentials string) (string, error) {
}
// DisplayAffectedReleases logs the upgraded, deleted and in error releases.
// useColor controls whether the section headers carry the bold+blue style we
// use elsewhere for visual section breaks; pass false (e.g. when --no-color is
// set) for clean output in non-TTY consumers.
// Each section header is centered within a line of '=' characters whose width
// matches the table below it. useColor controls whether the headers carry
// the bold+blue style used for visual section breaks.
func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger, useColor bool) {
if len(ar.Upgraded) > 0 {
logger.Infof("\n%s", kubedog.HeaderDividerStyled("Updated Releases", useColor))
tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"},
prettytable.Column{Header: "NAMESPACE", MinWidth: 6},
prettytable.Column{Header: "CHART", MinWidth: 6},
@@ -5191,10 +5190,11 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger, u
logger.Warn("Could not add row, %v", err)
}
}
logger.Info(tbl.String())
tableStr := tbl.String()
logger.Infof("\n%s", kubedog.HeaderDividerCenteredStyled("Updated Releases", kubedog.TableVisualWidth(tableStr), useColor))
logger.Info(tableStr)
}
if len(ar.Reinstalled) > 0 {
logger.Infof("\n%s", kubedog.HeaderDividerStyled("Reinstalled Releases", useColor))
tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"},
prettytable.Column{Header: "NAMESPACE", MinWidth: 6},
prettytable.Column{Header: "CHART", MinWidth: 6},
@@ -5213,10 +5213,11 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger, u
logger.Warn("Could not add row, %v", err)
}
}
logger.Info(tbl.String())
tableStr := tbl.String()
logger.Infof("\n%s", kubedog.HeaderDividerCenteredStyled("Reinstalled Releases", kubedog.TableVisualWidth(tableStr), useColor))
logger.Info(tableStr)
}
if len(ar.Deleted) > 0 {
logger.Infof("\n%s", kubedog.HeaderDividerStyled("Deleted Releases", useColor))
tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"},
prettytable.Column{Header: "NAMESPACE", MinWidth: 6},
prettytable.Column{Header: "DURATION", AlignRight: true},
@@ -5228,10 +5229,11 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger, u
logger.Warn("Could not add row, %v", err)
}
}
logger.Info(tbl.String())
tableStr := tbl.String()
logger.Infof("\n%s", kubedog.HeaderDividerCenteredStyled("Deleted Releases", kubedog.TableVisualWidth(tableStr), useColor))
logger.Info(tableStr)
}
if len(ar.Failed) > 0 {
logger.Infof("\n%s", kubedog.HeaderDividerStyled("Failed Releases", useColor))
tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"},
prettytable.Column{Header: "NAMESPACE", MinWidth: 6},
prettytable.Column{Header: "CHART", MinWidth: 6},
@@ -5245,10 +5247,11 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger, u
logger.Warn("Could not add row, %v", err)
}
}
logger.Info(tbl.String())
tableStr := tbl.String()
logger.Infof("\n%s", kubedog.HeaderDividerCenteredStyled("Failed Releases", kubedog.TableVisualWidth(tableStr), useColor))
logger.Info(tableStr)
}
if len(ar.DeleteFailed) > 0 {
logger.Infof("\n%s", kubedog.HeaderDividerStyled("Failed to Delete Releases", useColor))
tbl, _ := prettytable.NewTable(prettytable.Column{Header: "NAME"},
prettytable.Column{Header: "NAMESPACE", MinWidth: 6},
prettytable.Column{Header: "DURATION", AlignRight: true},
@@ -5260,7 +5263,9 @@ func (ar *AffectedReleases) DisplayAffectedReleases(logger *zap.SugaredLogger, u
logger.Warn("Could not add row, %v", err)
}
}
logger.Info(tbl.String())
tableStr := tbl.String()
logger.Infof("\n%s", kubedog.HeaderDividerCenteredStyled("Failed to Delete Releases", kubedog.TableVisualWidth(tableStr), useColor))
logger.Info(tableStr)
}
}