Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package minio-client for openSUSE:Factory checked in at 2025-02-10 17:30:37 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/minio-client (Old) and /work/SRC/openSUSE:Factory/.minio-client.new.19470 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "minio-client" Mon Feb 10 17:30:37 2025 rev:106 rq:1244759 version:20250208T191421Z Changes: -------- --- /work/SRC/openSUSE:Factory/minio-client/minio-client.changes 2025-02-05 17:23:19.930003709 +0100 +++ /work/SRC/openSUSE:Factory/.minio-client.new.19470/minio-client.changes 2025-02-10 18:15:21.458603973 +0100 @@ -1,0 +2,10 @@ +Sat Feb 08 22:52:48 UTC 2025 - mrueck...@suse.de + +- Update to version 20250208T191421Z: + * mirror: add the duration time and beautify the output (#5125) + * fix: urls equals nil deref (#5126) + * add support for pre-2023 minio deployments (#5122) + * Change enable to "enable=" (#5104) + * Giving mirror the option to exit early when --remove is not set (#5116) + +------------------------------------------------------------------- Old: ---- minio-client-20250204T045750Z.obscpio New: ---- minio-client-20250208T191421Z.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ minio-client.spec ++++++ --- /var/tmp/diff_new_pack.7hKaqx/_old 2025-02-10 18:15:23.282679410 +0100 +++ /var/tmp/diff_new_pack.7hKaqx/_new 2025-02-10 18:15:23.290679741 +0100 @@ -17,7 +17,7 @@ Name: minio-client -Version: 20250204T045750Z +Version: 20250208T191421Z Release: 0 Summary: Client for MinIO License: AGPL-3.0-only ++++++ _service ++++++ --- /var/tmp/diff_new_pack.7hKaqx/_old 2025-02-10 18:15:23.518689170 +0100 +++ /var/tmp/diff_new_pack.7hKaqx/_new 2025-02-10 18:15:23.538689998 +0100 @@ -5,7 +5,7 @@ <param name="exclude">.git</param> <param name="changesgenerate">enable</param> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">RELEASE.2025-02-04T04-57-50Z</param> + <param name="revision">RELEASE.2025-02-08T19-14-21Z</param> <param name="match-tag">RELEASE.*</param> <param name="versionrewrite-pattern">RELEASE\.(.*)-(.*)-(.*)-(.*)-(.*)</param> <param name="versionrewrite-replacement">\1\2\3\4\5</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.7hKaqx/_old 2025-02-10 18:15:23.630693802 +0100 +++ /var/tmp/diff_new_pack.7hKaqx/_new 2025-02-10 18:15:23.666695291 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/minio/mc</param> - <param name="changesrevision">318e7070718f59198a9c6911f72e46dab1625b3a</param></service></servicedata> + <param name="changesrevision">bd925c01a1ccab367993f20c251b7bae9d22f8a5</param></service></servicedata> (No newline at EOF) ++++++ minio-client-20250204T045750Z.obscpio -> minio-client-20250208T191421Z.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/accounting-reader.go new/minio-client-20250208T191421Z/cmd/accounting-reader.go --- old/minio-client-20250204T045750Z/cmd/accounting-reader.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/accounting-reader.go 2025-02-08 20:14:21.000000000 +0100 @@ -18,11 +18,14 @@ package cmd import ( - "fmt" + "strings" "sync" "sync/atomic" "time" + "github.com/fatih/color" + "github.com/minio/pkg/v3/console" + "github.com/cheggaaa/pb" json "github.com/minio/colorjson" "github.com/minio/mc/pkg/probe" @@ -56,14 +59,14 @@ } // write calculate the final speed. -func (a *accounter) write(current int64) float64 { +func (a *accounter) write(current int64) (float64, time.Duration) { fromStart := time.Since(a.startTime) currentFromStart := current - a.startValue if currentFromStart > 0 { speed := float64(currentFromStart) / (float64(fromStart) / float64(time.Second)) - return speed + return speed, fromStart } - return 0.0 + return 0.0, 0 } // writer update new accounting data for a specified refreshRate. @@ -81,10 +84,11 @@ // accountStat cantainer for current stats captured. type accountStat struct { - Status string `json:"status"` - Total int64 `json:"total"` - Transferred int64 `json:"transferred"` - Speed float64 `json:"speed"` + Status string `json:"status"` + Total int64 `json:"total"` + Transferred int64 `json:"transferred"` + Duration time.Duration `json:"duration"` + Speed float64 `json:"speed"` } func (c accountStat) JSON() string { @@ -96,15 +100,42 @@ } func (c accountStat) String() string { + dspOrder := []col{colGreen} // Header + dspOrder = append(dspOrder, colGrey) + var printColors []*color.Color + for _, c := range dspOrder { + printColors = append(printColors, getPrintCol(c)) + } + + tbl := console.NewTable(printColors, []bool{false, false, false, false}, 0) + + var builder strings.Builder + cellText := make([][]string, 0, 2) + cellText = append(cellText, []string{ + "Total", + "Transferred", + "Duration", + "Speed", + }) + speedBox := pb.Format(int64(c.Speed)).To(pb.U_BYTES).String() if speedBox == "" { speedBox = "0 MB" } else { speedBox = speedBox + "/s" } - message := fmt.Sprintf("Total: %s, Transferred: %s, Speed: %s", pb.Format(c.Total).To(pb.U_BYTES), - pb.Format(c.Transferred).To(pb.U_BYTES), speedBox) - return message + + cellText = append(cellText, []string{ + pb.Format(c.Total).To(pb.U_BYTES).String(), + pb.Format(c.Transferred).To(pb.U_BYTES).String(), + pb.Format(int64(c.Duration)).To(pb.U_DURATION).String(), + speedBox, + }) + + e := tbl.PopulateTable(&builder, cellText) + fatalIf(probe.NewError(e), "unable to populate the table") + + return builder.String() } // Stat provides current stats captured. @@ -114,7 +145,7 @@ close(a.isFinished) acntStat.Total = a.total acntStat.Transferred = atomic.LoadInt64(&a.current) - acntStat.Speed = a.write(atomic.LoadInt64(&a.current)) + acntStat.Speed, acntStat.Duration = a.write(atomic.LoadInt64(&a.current)) }) return acntStat } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/admin-info.go new/minio-client-20250208T191421Z/cmd/admin-info.go --- old/minio-client-20250204T045750Z/cmd/admin-info.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/admin-info.go 2025-02-08 20:14:21.000000000 +0100 @@ -95,9 +95,11 @@ } } - if disk.DiskIndex < (info.Backend.DrivesPerSet[disk.PoolIndex] - info.Backend.StandardSCParity) { - pool.drivesTotalFreeSpace += disk.AvailableSpace - pool.drivesTotalUsableSpace += disk.TotalSpace + if len(info.Backend.DrivesPerSet) > 0 { + if disk.DiskIndex < (info.Backend.DrivesPerSet[disk.PoolIndex] - info.Backend.StandardSCParity) { + pool.drivesTotalFreeSpace += disk.AvailableSpace + pool.drivesTotalUsableSpace += disk.TotalSpace + } } pool.endpoints.Add(srv.Endpoint) @@ -105,8 +107,6 @@ } } - // This was already added in 2022 enough time has passed to remove - // any other deprecated calculations for idx := range info.Backend.TotalSets { pool := summary[idx] if pool != nil { @@ -150,11 +150,6 @@ fatal(probe.NewError(errors.New("Unable to get service info")), "") } - // Validate such that we expect the server to be atleast from 2022 - if len(u.Info.Backend.TotalSets) == 0 || len(u.Info.Backend.DrivesPerSet) == 0 { - fatal(probe.NewError(errors.New("Unable to display service info, server is too old")), "") - } - // Initialization var totalOfflineNodes int @@ -299,6 +294,7 @@ "Erasure sets", }) + var printSummary bool // Keep the pool order while printing the output for poolIdx := 0; poolIdx < len(clusterSummary); poolIdx++ { summary := clusterSummary[poolIdx] @@ -308,12 +304,14 @@ totalSize := summary.drivesTotalUsableSpace usedCurrent := summary.drivesTotalUsableSpace - summary.drivesTotalFreeSpace var capacity string - if totalSize == 0 { - capacity = "0% (total: 0B)" - } else { + if totalSize > 0 { capacity = fmt.Sprintf("%.1f%% (total: %s)", 100*float64(usedCurrent)/float64(totalSize), humanize.IBytes(totalSize)) } + if summary.drivesPerSet > 0 { + printSummary = true + } + cellText = append(cellText, []string{ humanize.Ordinal(poolIdx + 1), capacity, @@ -322,10 +320,12 @@ }) } - e := tbl.PopulateTable(&builder, cellText) - fatalIf(probe.NewError(e), "unable to populate the table") + if printSummary { + e := tbl.PopulateTable(&builder, cellText) + fatalIf(probe.NewError(e), "unable to populate the table") - msg += builder.String() + "\n" + msg += builder.String() + "\n" + } } // Summary on used space, total no of buckets and diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/diff-main.go new/minio-client-20250208T191421Z/cmd/diff-main.go --- old/minio-client-20250204T045750Z/cmd/diff-main.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/diff-main.go 2025-02-08 20:14:21.000000000 +0100 @@ -184,7 +184,7 @@ } // Diff first and second urls. - for diffMsg := range objectDifference(ctx, firstClient, secondClient, true) { + for diffMsg := range bucketObjectDifference(ctx, firstClient, secondClient) { if diffMsg.Error != nil { errorIf(diffMsg.Error, "Unable to calculate objects difference.") // Ignore error and proceed to next object. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/difference.go new/minio-client-20250208T191421Z/cmd/difference.go --- old/minio-client-20250204T045750Z/cmd/difference.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/difference.go 2025-02-08 20:14:21.000000000 +0100 @@ -161,17 +161,23 @@ return true } -func objectDifference(ctx context.Context, sourceClnt, targetClnt Client, isMetadata bool) (diffCh chan diffMessage) { +func bucketObjectDifference(ctx context.Context, sourceClnt, targetClnt Client) (diffCh chan diffMessage) { + return objectDifference(ctx, sourceClnt, targetClnt, mirrorOptions{ + isMetadata: false, + }) +} + +func objectDifference(ctx context.Context, sourceClnt, targetClnt Client, opts mirrorOptions) (diffCh chan diffMessage) { sourceURL := sourceClnt.GetURL().String() - sourceCh := sourceClnt.List(ctx, ListOptions{Recursive: true, WithMetadata: isMetadata, ShowDir: DirNone}) + sourceCh := sourceClnt.List(ctx, ListOptions{Recursive: true, WithMetadata: opts.isMetadata, ShowDir: DirNone}) targetURL := targetClnt.GetURL().String() - targetCh := targetClnt.List(ctx, ListOptions{Recursive: true, WithMetadata: isMetadata, ShowDir: DirNone}) + targetCh := targetClnt.List(ctx, ListOptions{Recursive: true, WithMetadata: opts.isMetadata, ShowDir: DirNone}) - return difference(sourceURL, sourceCh, targetURL, targetCh, isMetadata, false) + return difference(sourceURL, sourceCh, targetURL, targetCh, opts, false) } -func bucketDifference(ctx context.Context, sourceClnt, targetClnt Client) (diffCh chan diffMessage) { +func bucketDifference(ctx context.Context, sourceClnt, targetClnt Client, opts mirrorOptions) (diffCh chan diffMessage) { sourceURL := sourceClnt.GetURL().String() sourceCh := make(chan *ClientContent) @@ -215,11 +221,16 @@ } }() - return difference(sourceURL, sourceCh, targetURL, targetCh, false, false) + return difference(sourceURL, sourceCh, targetURL, targetCh, opts, false) } -func differenceInternal(sourceURL string, srcCh <-chan *ClientContent, targetURL string, tgtCh <-chan *ClientContent, - cmpMetadata, returnSimilar bool, diffCh chan<- diffMessage, +func differenceInternal(sourceURL string, + srcCh <-chan *ClientContent, + targetURL string, + tgtCh <-chan *ClientContent, + opts mirrorOptions, + returnSimilar bool, + diffCh chan<- diffMessage, ) *probe.Error { // Pop first entries from the source and targets srcCtnt, srcOk := <-srcCh @@ -232,8 +243,14 @@ tgtEOF = !tgtOk // No objects from source AND target: Finish - if srcEOF && tgtEOF { - break + if opts.sourceListingOnly { + if srcEOF { + break + } + } else { + if srcEOF && tgtEOF { + break + } } if !srcEOF && srcCtnt.Err != nil { @@ -332,7 +349,7 @@ firstContent: srcCtnt, secondContent: tgtCtnt, } - } else if cmpMetadata && + } else if opts.isMetadata && !metadataEqual(srcCtnt.UserMetadata, tgtCtnt.UserMetadata) && !metadataEqual(srcCtnt.Metadata, tgtCtnt.Metadata) { @@ -375,13 +392,13 @@ // objectDifference function finds the difference between all objects // recursively in sorted order from source and target. -func difference(sourceURL string, sourceCh <-chan *ClientContent, targetURL string, targetCh <-chan *ClientContent, cmpMetadata, returnSimilar bool) (diffCh chan diffMessage) { +func difference(sourceURL string, sourceCh <-chan *ClientContent, targetURL string, targetCh <-chan *ClientContent, opts mirrorOptions, returnSimilar bool) (diffCh chan diffMessage) { diffCh = make(chan diffMessage, 10000) go func() { defer close(diffCh) - err := differenceInternal(sourceURL, sourceCh, targetURL, targetCh, cmpMetadata, returnSimilar, diffCh) + err := differenceInternal(sourceURL, sourceCh, targetURL, targetCh, opts, returnSimilar, diffCh) if err != nil { // handle this specifically for filesystem related errors. switch v := err.ToGoError().(type) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/idp-openid-subcommands.go new/minio-client-20250208T191421Z/cmd/idp-openid-subcommands.go --- old/minio-client-20250204T045750Z/cmd/idp-openid-subcommands.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/idp-openid-subcommands.go 2025-02-08 20:14:21.000000000 +0100 @@ -416,12 +416,16 @@ return "Not configured." } + enableStr := "on" // Determine required width for key column. fieldColWidth := 0 for _, kv := range i.Info { if fieldColWidth < len(kv.Key) { fieldColWidth = len(kv.Key) } + if kv.Key == "enable" { + enableStr = kv.Value + } } // Add 1 for the colon-suffix in each entry. fieldColWidth++ @@ -439,7 +443,14 @@ PaddingLeft(1) var lines []string + lines = append(lines, fmt.Sprintf("%s%s", + fieldColStyle.Render("enable:"), + valueColStyle.Render(enableStr), + )) for _, kv := range i.Info { + if kv.Key == "enable" { + continue + } envStr := "" if kv.IsCfg && kv.IsEnv { envStr = " (environment)" @@ -509,7 +520,7 @@ idpType = madmin.OpenidIDPCfg } - configBody := "enable=on" + configBody := "enable=" if !enable { configBody = "enable=off" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/mirror-main.go new/minio-client-20250208T191421Z/cmd/mirror-main.go --- old/minio-client-20250204T045750Z/cmd/mirror-main.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/mirror-main.go 2025-02-08 20:14:21.000000000 +0100 @@ -558,6 +558,13 @@ var cancelInProgress bool + defer func() { + // make sure we always cancel the context + if !cancelInProgress { + cancel() + } + }() + for sURLs := range mj.statusCh { if cancelInProgress { // Do not need to print any error after @@ -1011,6 +1018,13 @@ activeActive: isWatch, } + // If we are not using active/active and we are not removing + // files from the remote, then we can exit the listing once + // local files have been checked for diff. + if !mopts.activeActive && !mopts.isRemove { + mopts.sourceListingOnly = true + } + // Create a new mirror job and execute it mj := newMirrorJob(srcURL, dstURL, mopts) @@ -1022,7 +1036,7 @@ if mirrorSrcBuckets || createDstBuckets { // Synchronize buckets using dirDifference function - for d := range bucketDifference(ctx, srcClt, dstClt) { + for d := range bucketDifference(ctx, srcClt, dstClt, mj.opts) { if d.Error != nil { if mj.opts.activeActive { errorIf(d.Error, "Failed to start mirroring.. retrying") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/mirror-url.go new/minio-client-20250208T191421Z/cmd/mirror-url.go --- old/minio-client-20250204T045750Z/cmd/mirror-url.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/mirror-url.go 2025-02-08 20:14:21.000000000 +0100 @@ -167,7 +167,7 @@ } // List both source and target, compare and return values through channel. - for diffMsg := range objectDifference(ctx, sourceClnt, targetClnt, opts.isMetadata) { + for diffMsg := range objectDifference(ctx, sourceClnt, targetClnt, opts) { if diffMsg.Error != nil { // Send all errors through the channel URLsCh <- URLs{Error: diffMsg.Error, ErrorCond: differInUnknown} @@ -277,6 +277,7 @@ storageClass string userMetadata map[string]string checksum minio.ChecksumType + sourceListingOnly bool } // Prepares urls that need to be copied or removed based on requested options. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250204T045750Z/cmd/urls.go new/minio-client-20250208T191421Z/cmd/urls.go --- old/minio-client-20250204T045750Z/cmd/urls.go 2025-02-04 05:57:50.000000000 +0100 +++ new/minio-client-20250208T191421Z/cmd/urls.go 2025-02-08 20:14:21.000000000 +0100 @@ -50,7 +50,7 @@ return false } else if m.SourceContent == nil && n.SourceContent != nil { return false - } else if m.SourceContent.URL != n.SourceContent.URL { + } else if m.SourceContent != nil && n.SourceContent != nil && m.SourceContent.URL != n.SourceContent.URL { return false } @@ -58,7 +58,7 @@ return false } else if m.TargetContent == nil && n.TargetContent != nil { return false - } else if m.TargetContent.URL != n.TargetContent.URL { + } else if m.TargetContent != nil && n.TargetContent != nil && m.TargetContent.URL != n.TargetContent.URL { return false } ++++++ minio-client.obsinfo ++++++ --- /var/tmp/diff_new_pack.7hKaqx/_old 2025-02-10 18:15:24.682737311 +0100 +++ /var/tmp/diff_new_pack.7hKaqx/_new 2025-02-10 18:15:24.702738138 +0100 @@ -1,5 +1,5 @@ name: minio-client -version: 20250204T045750Z -mtime: 1738645070 -commit: 318e7070718f59198a9c6911f72e46dab1625b3a +version: 20250208T191421Z +mtime: 1739042061 +commit: bd925c01a1ccab367993f20c251b7bae9d22f8a5 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/minio-client/vendor.tar.gz /work/SRC/openSUSE:Factory/.minio-client.new.19470/vendor.tar.gz differ: char 5, line 1