flush progress bars before all print calls (#5131)

hopefully fixes clobbering issues for end-of-run tables

---

#### Does this PR need a docs update or release note?

- [x]  Yes, it's included

#### Type of change

- [x] 🐛 Bugfix

#### Issue(s)

* #5113

#### Test Plan

- [x] 💪 Manual
This commit is contained in:
Keepers 2024-01-26 17:10:10 -07:00 committed by GitHub
parent 8133da3087
commit f7a9ca836f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -133,7 +133,7 @@ func Pretty(ctx context.Context, a any) {
return
}
printPrettyJSON(getRootCmd(ctx).ErrOrStderr(), a)
printPrettyJSON(ctx, getRootCmd(ctx).ErrOrStderr(), a)
}
// PrettyJSON prettifies and prints the value.
@ -143,7 +143,7 @@ func PrettyJSON(ctx context.Context, p minimumPrintabler) {
return
}
outputJSON(getRootCmd(ctx).ErrOrStderr(), p, outputAsJSONDebug)
outputJSON(ctx, getRootCmd(ctx).ErrOrStderr(), p, outputAsJSONDebug)
}
// out is the testable core of exported print funcs
@ -193,56 +193,56 @@ type minimumPrintabler interface {
// Item prints the printable, according to the caller's requested format.
func Item(ctx context.Context, p Printable) {
printItem(getRootCmd(ctx).OutOrStdout(), p)
printItem(ctx, getRootCmd(ctx).OutOrStdout(), p)
}
// print prints the printable items,
// according to the caller's requested format.
func printItem(w io.Writer, p Printable) {
func printItem(ctx context.Context, w io.Writer, p Printable) {
if outputAsJSON || outputAsJSONDebug {
outputJSON(w, p, outputAsJSONDebug)
outputJSON(ctx, w, p, outputAsJSONDebug)
return
}
outputTable(w, []Printable{p})
outputTable(ctx, w, []Printable{p})
}
// ItemProperties prints the printable either as in a single line or a json
// The difference between this and Item is that this one does not print the ID
func ItemProperties(ctx context.Context, p Printable) {
printItemProperties(getRootCmd(ctx).OutOrStdout(), p)
printItemProperties(ctx, getRootCmd(ctx).OutOrStdout(), p)
}
// print prints the printable items,
// according to the caller's requested format.
func printItemProperties(w io.Writer, p Printable) {
func printItemProperties(ctx context.Context, w io.Writer, p Printable) {
if outputAsJSON || outputAsJSONDebug {
outputJSON(w, p, outputAsJSONDebug)
outputJSON(ctx, w, p, outputAsJSONDebug)
return
}
outputOneLine(w, []Printable{p})
outputOneLine(ctx, w, []Printable{p})
}
// All prints the slice of printable items,
// according to the caller's requested format.
func All(ctx context.Context, ps ...Printable) {
printAll(getRootCmd(ctx).OutOrStdout(), ps)
printAll(ctx, getRootCmd(ctx).OutOrStdout(), ps)
}
// printAll prints the slice of printable items,
// according to the caller's requested format.
func printAll(w io.Writer, ps []Printable) {
func printAll(ctx context.Context, w io.Writer, ps []Printable) {
if len(ps) == 0 {
return
}
if outputAsJSON || outputAsJSONDebug {
outputJSONArr(w, ps, outputAsJSONDebug)
outputJSONArr(ctx, w, ps, outputAsJSONDebug)
return
}
outputTable(w, ps)
outputTable(ctx, w, ps)
}
// ------------------------------------------------------------------------------------------
@ -252,11 +252,11 @@ func printAll(w io.Writer, ps []Printable) {
// Table writes the printables in a tabular format. Takes headers from
// the 0th printable only.
func Table(ctx context.Context, ps []Printable) {
outputTable(getRootCmd(ctx).OutOrStdout(), ps)
outputTable(ctx, getRootCmd(ctx).OutOrStdout(), ps)
}
// output to stdout the list of printable structs in a table
func outputTable(w io.Writer, ps []Printable) {
func outputTable(ctx context.Context, w io.Writer, ps []Printable) {
t := table.Table{
Headers: ps[0].Headers(false),
Rows: [][]string{},
@ -266,6 +266,9 @@ func outputTable(w io.Writer, ps []Printable) {
t.Rows = append(t.Rows, p.Values(false))
}
// observe bars needs to be flushed before printing
observe.Flush(ctx)
_ = t.WriteTable(
w,
&table.Config{
@ -279,20 +282,20 @@ func outputTable(w io.Writer, ps []Printable) {
// JSON
// ------------------------------------------------------------------------------------------
func outputJSON(w io.Writer, p minimumPrintabler, debug bool) {
func outputJSON(ctx context.Context, w io.Writer, p minimumPrintabler, debug bool) {
if debug {
printJSON(w, p)
printJSON(ctx, w, p)
return
}
if debug {
printJSON(w, p)
printJSON(ctx, w, p)
} else {
printJSON(w, p.MinimumPrintable())
printJSON(ctx, w, p.MinimumPrintable())
}
}
func outputJSONArr(w io.Writer, ps []Printable, debug bool) {
func outputJSONArr(ctx context.Context, w io.Writer, ps []Printable, debug bool) {
sl := make([]any, 0, len(ps))
for _, p := range ps {
@ -303,11 +306,14 @@ func outputJSONArr(w io.Writer, ps []Printable, debug bool) {
}
}
printJSON(w, sl)
printJSON(ctx, w, sl)
}
// output to stdout the list of printable structs as json.
func printJSON(w io.Writer, a any) {
func printJSON(ctx context.Context, w io.Writer, a any) {
// observe bars needs to be flushed before printing
observe.Flush(ctx)
bs, err := json.Marshal(a)
if err != nil {
fmt.Fprintf(w, "error formatting results to json: %v\n", err)
@ -318,7 +324,10 @@ func printJSON(w io.Writer, a any) {
}
// output to stdout the list of printable structs as prettified json.
func printPrettyJSON(w io.Writer, a any) {
func printPrettyJSON(ctx context.Context, w io.Writer, a any) {
// observe bars needs to be flushed before printing
observe.Flush(ctx)
bs, err := json.MarshalIndent(a, "", " ")
if err != nil {
fmt.Fprintf(w, "error formatting results to json: %v\n", err)
@ -334,7 +343,10 @@ func printPrettyJSON(w io.Writer, a any) {
// Output in the following format:
// Bytes Uploaded: 401 kB | Items Uploaded: 59 | Items Skipped: 0 | Errors: 0
func outputOneLine(w io.Writer, ps []Printable) {
func outputOneLine(ctx context.Context, w io.Writer, ps []Printable) {
// observe bars needs to be flushed before printing
observe.Flush(ctx)
headers := ps[0].Headers(true)
rows := [][]string{}