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-09-09 20:29:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/minio-client (Old) and /work/SRC/openSUSE:Factory/.minio-client.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "minio-client" Tue Sep 9 20:29:14 2025 rev:116 rq:1303159 version:20250813T083541Z Changes: -------- --- /work/SRC/openSUSE:Factory/minio-client/minio-client.changes 2025-07-24 18:49:39.884027793 +0200 +++ /work/SRC/openSUSE:Factory/.minio-client.new.1977/minio-client.changes 2025-09-09 20:29:35.527575250 +0200 @@ -1,0 +2,9 @@ +Sun Sep 07 14:47:53 UTC 2025 - Marcus Rueckert <mrueck...@suse.de> + +- Update to version 20250813T083541Z: + * feat: beautify output for the ping command (#5237) + * Update links to new docs site (#5242) + * Fix the abnormal exit of the ping command (#5233) + * chore: clear error message with unauthorized credentials (#5236) + +------------------------------------------------------------------- Old: ---- minio-client-20250721T052808Z.obscpio New: ---- minio-client-20250813T083541Z.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ minio-client.spec ++++++ --- /var/tmp/diff_new_pack.5uhzFl/_old 2025-09-09 20:29:36.519617057 +0200 +++ /var/tmp/diff_new_pack.5uhzFl/_new 2025-09-09 20:29:36.523617226 +0200 @@ -1,7 +1,7 @@ # # spec file for package minio-client # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: minio-client -Version: 20250721T052808Z +Version: 20250813T083541Z Release: 0 Summary: Client for MinIO License: AGPL-3.0-only ++++++ _service ++++++ --- /var/tmp/diff_new_pack.5uhzFl/_old 2025-09-09 20:29:36.575619418 +0200 +++ /var/tmp/diff_new_pack.5uhzFl/_new 2025-09-09 20:29:36.579619586 +0200 @@ -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-07-21T05-28-08Z</param> + <param name="revision">RELEASE.2025-08-13T08-35-41Z</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.5uhzFl/_old 2025-09-09 20:29:36.603620597 +0200 +++ /var/tmp/diff_new_pack.5uhzFl/_new 2025-09-09 20:29:36.607620766 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/minio/mc</param> - <param name="changesrevision">ee72571936f15b0e65dc8b4a231a4dd445e5ccb6</param></service></servicedata> + <param name="changesrevision">7394ce0dd2a80935aded936b09fa12cbb3cb8096</param></service></servicedata> (No newline at EOF) ++++++ minio-client-20250721T052808Z.obscpio -> minio-client-20250813T083541Z.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/README.md new/minio-client-20250813T083541Z/README.md --- old/minio-client-20250721T052808Z/README.md 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/README.md 2025-08-13 10:35:41.000000000 +0200 @@ -2,7 +2,7 @@ [](https://slack.min.io) [](https://goreportcard.com/report/minio/mc) [](https://hub.docker.com/r/minio/mc/) [](https://github.com/minio/mc/blob/master/LICENSE) # Documentation -- [MC documentation](https://min.io/docs/minio/linux/reference/minio-mc.html) +- [MC documentation](https://docs.min.io/community/minio-object-store/reference/minio-mc.html) MinIO Client (mc) provides a modern alternative to UNIX commands like ls, cat, cp, mirror, diff, find etc. It supports filesystems and Amazon S3 compatible cloud storage service (AWS Signature v2 and v4). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/README_zh_CN.md new/minio-client-20250813T083541Z/README_zh_CN.md --- old/minio-client-20250721T052808Z/README_zh_CN.md 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/README_zh_CN.md 2025-08-13 10:35:41.000000000 +0200 @@ -165,9 +165,9 @@ ``` ## 了解更多 -- [MinIO Client完全指南](https://min.io/docs/minio/linux/reference/minio-mc.html?ref=gh) -- [MinIO快速入门](https://min.io/docs/minio/linux/index.html#quickstart-for-linux?ref=gh) -- [MinIO官方文档](https://min.io/docs/minio/linux/index.html?ref=gh) +- [MinIO Client完全指南](https://docs.min.io/community/minio-object-store/reference/minio-mc.html?ref=gh) +- [MinIO快速入门](https://docs.min.io/community/minio-object-store/operations/deployments/baremetal-deploy-minio-on-redhat-linux.html?ref=gh) +- [MinIO官方文档](https://docs.min.io/community/minio-object-store/index.html?ref=gh) ## 贡献 请遵守MinIO[贡献者指南](https://github.com/minio/mc/blob/master/docs/zh_CN/CONTRIBUTING.md) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/cmd/cp-url.go new/minio-client-20250813T083541Z/cmd/cp-url.go --- old/minio-client-20250721T052808Z/cmd/cp-url.go 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/cmd/cp-url.go 2025-08-13 10:35:41.000000000 +0200 @@ -336,7 +336,7 @@ defer close(copyURLsCh) copyURLsContent, err := guessCopyURLType(ctx, o) if err != nil { - copyURLsCh <- URLs{Error: errUnableToGuess().Trace(o.sourceURLs...)} + copyURLsCh <- URLs{Error: errUnableToGuess(err.Cause.Error()).Trace(o.sourceURLs...)} return } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/cmd/globals.go new/minio-client-20250813T083541Z/cmd/globals.go --- old/minio-client-20250721T052808Z/cmd/globals.go 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/cmd/globals.go 2025-08-13 10:35:41.000000000 +0200 @@ -82,6 +82,9 @@ // GlobalDevMode is set to true if the program is running in development mode GlobalDevMode = false + // GlobalTrapSignals is set to true if need to trap the registered signals and cancel the global context. + GlobalTrapSignals = true + // GlobalSubnetProxyURL is the proxy to be used for communication with subnet GlobalSubnetProxyURL *url.URL diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/cmd/ping.go new/minio-client-20250813T083541Z/cmd/ping.go --- old/minio-client-20250721T052808Z/cmd/ping.go 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/cmd/ping.go 2025-08-13 10:35:41.000000000 +0200 @@ -22,8 +22,11 @@ "fmt" "math" "net/url" + "os" + "os/signal" "strconv" "strings" + "syscall" "text/tabwriter" "text/template" "time" @@ -117,14 +120,15 @@ var colorMap = template.FuncMap{ "colorWhite": color.New(color.FgWhite).SprintfFunc(), "colorRed": color.New(color.FgRed).SprintfFunc(), + "colorGreen": color.New(color.FgGreen).SprintfFunc(), } // PingDist is the template for ping result in distributed mode -const PingDist = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "0 " .CountErr}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{"\t"}}{{ colorWhite "min="}}{{colorWhite .Min}}{{"\t"}}{{colorWhite "max="}}{{colorWhite .Max}}{{"\t"}}{{colorWhite "average="}}{{colorWhite .Average}}{{"\t"}}{{colorWhite "errors="}}{{colorWhite .CountErr}}{{" "}}{{colorWhite "roundtrip="}}{{colorWhite .Roundtrip}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorRed ":"}}{{colorRed .Endpoint.Port}}{{end}}{{"\t"}}{{ colorRed "min="}}{{colorRed .Min}}{{"\t"}}{{colorRed "max="}}{{colorRed .Max}}{{"\t"}}{{colorRed "average="}}{{colorRed .Average}}{{"\t"}}{{colorRed "errors="}}{{colorRed .CountErr}}{{" "}}{{colorRed "roundtrip="}}{{colorRed .Roundtrip}}{{end}} +const PingDist = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "ok " .Status}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{"\t"}}{{colorWhite "status="}}{{colorGreen .Status}}{{" "}}{{colorWhite "time="}}{{colorWhite .Time}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{"\t"}}{{colorRed "status="}}{{colorRed .Status}}{{" "}}{{colorRed "time="}}{{colorRed .Time}}{{end}} {{end}}` // Ping is the template for ping result -const Ping = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "0 " .CountErr}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{"\t"}}{{ colorWhite "min="}}{{colorWhite .Min}}{{"\t"}}{{colorWhite "max="}}{{colorWhite .Max}}{{"\t"}}{{colorWhite "average="}}{{colorWhite .Average}}{{"\t"}}{{colorWhite "errors="}}{{colorWhite .CountErr}}{{" "}}{{colorWhite "roundtrip="}}{{colorWhite .Roundtrip}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorRed ":"}}{{colorRed .Endpoint.Port}}{{end}}{{"\t"}}{{ colorRed "min="}}{{colorRed .Min}}{{"\t"}}{{colorRed "max="}}{{colorRed .Max}}{{"\t"}}{{colorRed "average="}}{{colorRed .Average}}{{"\t"}}{{colorRed "errors="}}{{colorRed .CountErr}}{{" "}}{{colorRed "roundtrip="}}{{colorRed .Roundtrip}}{{end}}{{end}}` +const Ping = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "ok " .Status}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{"\t"}}{{colorWhite "status="}}{{colorGreen .Status}}{{" "}}{{colorWhite "time="}}{{colorWhite .Time}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{"\t"}}{{colorRed "status="}}{{colorRed .Status}}{{" "}}{{colorRed "time="}}{{colorRed .Time}}{{end}}{{end}}` // PingTemplateDist - captures ping template var PingTemplateDist = template.Must(template.New("ping-list").Funcs(colorMap).Parse(PingDist)) @@ -149,14 +153,11 @@ // EndPointStats - container to hold server ping stats type EndPointStats struct { - Endpoint *url.URL `json:"endpoint"` - Min string `json:"min"` - Max string `json:"max"` - Average string `json:"average"` - DNS string `json:"dns"` - CountErr string `json:"error-count,omitempty"` - Error string `json:"error,omitempty"` - Roundtrip string `json:"roundtrip"` + Endpoint *url.URL `json:"endpoint"` + DNS string `json:"dns"` + Status string `json:"status,omitempty"` + Error string `json:"error,omitempty"` + Time string `json:"time"` } // PingResult contains ping output @@ -166,15 +167,71 @@ EndPointsStats []EndPointStats `json:"servers"` } -type serverStats struct { - min uint64 - max uint64 - sum uint64 - avg uint64 - dns uint64 // last DNS resolving time - errorCount int // used to keep a track of consecutive errors - err string - counter int // used to find the average, acts as denominator +// PingSummary Summarizes the results of the ping execution. +type PingSummary struct { + Status string `json:"status"` + // map to contain server stats for all the servers + ServerMap map[string]ServerStats `json:"serverMap"` +} + +// JSON jsonified ping summary message. +func (ps PingSummary) JSON() string { + pingJSONBytes, e := json.MarshalIndent(ps, "", " ") + fatalIf(probe.NewError(e), "Unable to marshal into JSON.") + + return string(pingJSONBytes) +} + +// String colorized ping summary message. +func (ps PingSummary) String() string { + dspOrder := []col{colGreen} // Header + for i := 0; i < len(ps.ServerMap); i++ { + 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, false, false}, 0) + + var builder strings.Builder + cellText := make([][]string, len(ps.ServerMap)+1) + cellText[0] = []string{ + "Endpoint", + "Min", + "Avg", + "Max", + "Error", + "Count", + } + index := 0 + for endpoint, ping := range ps.ServerMap { + index++ + cellText[index] = []string{ + ping.Endpoint.Scheme + "://" + endpoint, + trimToTwoDecimal(time.Duration(ping.Min)), + trimToTwoDecimal(time.Duration(ping.Avg)), + trimToTwoDecimal(time.Duration(ping.Max)), + strconv.Itoa(ping.ErrorCount), + strconv.Itoa(ping.Counter), + } + } + e := tbl.PopulateTable(&builder, cellText) + fatalIf(probe.NewError(e), "unable to populate the table") + return builder.String() +} + +// ServerStats ping result of each endpoint +type ServerStats struct { + Endpoint *url.URL `json:"endpoint"` + Min uint64 `json:"min"` + Max uint64 `json:"max"` + Sum uint64 `json:"sum"` + Avg uint64 `json:"avg"` + DNS uint64 `json:"dns"` // last DNS resolving time + ErrorCount int `json:"errorCount"` // used to keep a track of consecutive errors + Err string `json:"err"` + Counter int `json:"counter"` // used to find the average, acts as denominator } func fetchAdminInfo(admClnt *madmin.AdminClient) (madmin.InfoMessage, error) { @@ -223,7 +280,7 @@ return madmin.InfoMessage{}, e } -func ping(ctx context.Context, cliCtx *cli.Context, anonClient *madmin.AnonymousClient, admInfo madmin.InfoMessage, endPointMap map[string]serverStats, index int) { +func ping(ctx context.Context, cliCtx *cli.Context, anonClient *madmin.AnonymousClient, admInfo madmin.InfoMessage, pingSummary PingSummary, index int) { var endPointStats []EndPointStats var servers []madmin.ServerProperties if cliCtx.Bool("distributed") || cliCtx.IsSet("node") { @@ -232,21 +289,22 @@ allOK := true for result := range anonClient.Alive(ctx, madmin.AliveOpts{}, servers...) { - stat := pingStats(cliCtx, result, endPointMap) + stat := pingStats(cliCtx, result, pingSummary) + status := "ok " + if !result.Online { + status = "failed " + } allOK = allOK && result.Online endPointStat := EndPointStats{ - Endpoint: result.Endpoint, - Min: trimToTwoDecimal(time.Duration(stat.min)), - Max: trimToTwoDecimal(time.Duration(stat.max)), - Average: trimToTwoDecimal(time.Duration(stat.avg)), - DNS: time.Duration(stat.dns).String(), - CountErr: pad(strconv.Itoa(stat.errorCount), " ", 3-len(strconv.Itoa(stat.errorCount)), false), - Error: stat.err, - Roundtrip: trimToTwoDecimal(result.ResponseTime), + Endpoint: result.Endpoint, + DNS: time.Duration(stat.DNS).String(), + Status: status, + Error: stat.Err, + Time: trimToTwoDecimal(result.ResponseTime), } endPointStats = append(endPointStats, endPointStat) - endPointMap[result.Endpoint.Host] = stat + pingSummary.ServerMap[result.Endpoint.Host] = stat } stop = stop || cliCtx.Bool("exit") && allOK @@ -302,7 +360,7 @@ return string(ret) } -func pingStats(cliCtx *cli.Context, result madmin.AliveResult, serverMap map[string]serverStats) serverStats { +func pingStats(cliCtx *cli.Context, result madmin.AliveResult, ps PingSummary) ServerStats { var errorString string var sum, avg, dns uint64 minPing := uint64(math.MaxUint64) @@ -311,13 +369,13 @@ if result.Error != nil { errorString = result.Error.Error() - if stat, ok := serverMap[result.Endpoint.Host]; ok { - minPing = stat.min - maxPing = stat.max - sum = stat.sum - counter = stat.counter - avg = stat.avg - errorCount = stat.errorCount + 1 + if stat, ok := ps.ServerMap[result.Endpoint.Host]; ok { + minPing = stat.Min + maxPing = stat.Max + sum = stat.Sum + counter = stat.Counter + avg = stat.Avg + errorCount = stat.ErrorCount + 1 } else { minPing = 0 @@ -330,17 +388,17 @@ } else { // reset consecutive error count errorCount = 0 - if stat, ok := serverMap[result.Endpoint.Host]; ok { + if stat, ok := ps.ServerMap[result.Endpoint.Host]; ok { var minVal uint64 - if stat.min == 0 { + if stat.Min == 0 { minVal = uint64(result.ResponseTime) } else { - minVal = stat.min + minVal = stat.Min } minPing = uint64(math.Min(float64(minVal), float64(uint64(result.ResponseTime)))) - maxPing = uint64(math.Max(float64(stat.max), float64(uint64(result.ResponseTime)))) - sum = stat.sum + uint64(result.ResponseTime.Nanoseconds()) - counter = stat.counter + 1 + maxPing = uint64(math.Max(float64(stat.Max), float64(uint64(result.ResponseTime)))) + sum = stat.Sum + uint64(result.ResponseTime.Nanoseconds()) + counter = stat.Counter + 1 } else { minPing = uint64(math.Min(float64(minPing), float64(uint64(result.ResponseTime)))) @@ -351,7 +409,38 @@ avg = sum / uint64(counter) dns = uint64(result.DNSResolveTime.Nanoseconds()) } - return serverStats{minPing, maxPing, sum, avg, dns, errorCount, errorString, counter} + return ServerStats{result.Endpoint, minPing, maxPing, sum, avg, dns, errorCount, errorString, counter} +} + +func watchSignals(ps PingSummary) { + c := make(chan os.Signal, 1) + signal.Notify(c, syscall.SIGTERM, syscall.SIGINT) + go func() { + s := <-c + // Ensure that the table structure is not disrupted when manually canceling. + fmt.Println("") + printMsg(ps) + + // Stop profiling if enabled, this needs to be before canceling the + // global context to check for any unusual cpu/mem/goroutines usage + stopProfiling() + + // Cancel the global context + globalCancel() + + var exitCode int + switch s.String() { + case "interrupt": + exitCode = globalCancelExitStatus + case "killed": + exitCode = globalKillExitStatus + case "terminated": + exitCode = globalTerminatExitStatus + default: + exitCode = globalErrorExitStatus + } + os.Exit(exitCode) + }() } // mainPing is entry point for ping command. @@ -383,9 +472,14 @@ admInfo, e = filterAdminInfo(admClient, cliCtx.String("node")) fatalIf(probe.NewError(e).Trace(aliasedURL), "Unable to get server info") } + pingSummary := PingSummary{ + ServerMap: make(map[string]ServerStats), + Status: "success", + } - // map to contain server stats for all the servers - serverMap := make(map[string]serverStats) + // stop global signals trap. + GlobalTrapSignals = false + watchSignals(pingSummary) index := 1 if cliCtx.IsSet("count") { @@ -396,9 +490,10 @@ for index <= count { // return if consecutive error count more then specified value if stop { + printMsg(pingSummary) return nil } - ping(ctx, cliCtx, anonClient, admInfo, serverMap, index) + ping(ctx, cliCtx, anonClient, admInfo, pingSummary, index) index++ } } else { @@ -409,12 +504,14 @@ default: // return if consecutive error count more then specified value if stop { + printMsg(pingSummary) return nil } - ping(ctx, cliCtx, anonClient, admInfo, serverMap, index) + ping(ctx, cliCtx, anonClient, admInfo, pingSummary, index) index++ } } } + printMsg(pingSummary) return nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/cmd/signals.go new/minio-client-20250813T083541Z/cmd/signals.go --- old/minio-client-20250721T052808Z/cmd/signals.go 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/cmd/signals.go 2025-08-13 10:35:41.000000000 +0200 @@ -38,6 +38,12 @@ // Once signal has been received stop signal Notify handler. signal.Stop(sigCh) + // If GlobalTrapSignals is set to false, the global context will not be canceled, + // allowing the method to cancel the context. + if !GlobalTrapSignals { + return + } + // Stop profiling if enabled, this needs to be before canceling the // global context to check for any unusual cpu/mem/goroutines usage stopProfiling() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/cmd/sql-main.go new/minio-client-20250813T083541Z/cmd/sql-main.go --- old/minio-client-20250721T052808Z/cmd/sql-main.go 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/cmd/sql-main.go 2025-08-13 10:35:41.000000000 +0200 @@ -92,7 +92,7 @@ {{end}}{{end}} SERIALIZATION OPTIONS: - For query serialization options, refer to https://min.io/docs/minio/linux/reference/minio-mc/mc-sql.html#command-mc.sql + For query serialization options, refer to https://docs.min.io/community/minio-object-store/reference/minio-mc/mc-sql.html EXAMPLES: 1. Run a query on a set of objects recursively on AWS S3. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250721T052808Z/cmd/typed-errors.go new/minio-client-20250813T083541Z/cmd/typed-errors.go --- old/minio-client-20250721T052808Z/cmd/typed-errors.go 2025-07-21 07:28:08.000000000 +0200 +++ new/minio-client-20250813T083541Z/cmd/typed-errors.go 2025-08-13 10:35:41.000000000 +0200 @@ -41,8 +41,11 @@ type unableToGuessErr error -var errUnableToGuess = func() *probe.Error { +var errUnableToGuess = func(customMsg string) *probe.Error { msg := "Unable to guess the type of copy operation." + if strings.TrimSpace(customMsg) != "" { + msg = customMsg + } return probe.NewError(unableToGuessErr(errors.New(msg))) } ++++++ minio-client.obsinfo ++++++ --- /var/tmp/diff_new_pack.5uhzFl/_old 2025-09-09 20:29:36.923634084 +0200 +++ /var/tmp/diff_new_pack.5uhzFl/_new 2025-09-09 20:29:36.927634252 +0200 @@ -1,5 +1,5 @@ name: minio-client -version: 20250721T052808Z -mtime: 1753075688 -commit: ee72571936f15b0e65dc8b4a231a4dd445e5ccb6 +version: 20250813T083541Z +mtime: 1755074141 +commit: 7394ce0dd2a80935aded936b09fa12cbb3cb8096 ++++++ vendor.tar.zst ++++++