Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package docker-compose for openSUSE:Factory checked in at 2025-12-19 16:44:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/docker-compose (Old) and /work/SRC/openSUSE:Factory/.docker-compose.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "docker-compose" Fri Dec 19 16:44:09 2025 rev:85 rq:1323616 version:5.0.1 Changes: -------- --- /work/SRC/openSUSE:Factory/docker-compose/docker-compose.changes 2025-12-11 18:40:57.676514865 +0100 +++ /work/SRC/openSUSE:Factory/.docker-compose.new.1928/docker-compose.changes 2025-12-19 16:47:20.689632807 +0100 @@ -1,0 +2,52 @@ +Fri Dec 19 08:17:00 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 5.0.1: + * Fixes + - Restored support for COMPOSE_COMPATIBILITY by @ndeloof in + #13424 + - Fixed grammatical errors and improve clarity in code. by + @xiaolinny in #13429 + - Fixed broken run --quiet. by @ndeloof in #13430 + - Fixed SDK example by @ndeloof in #13416 + - Added a check buildx version is set before comparing it. by + @yangfeiyu20102011 in #13415 + - Fixed grammar: pluralize 'service' and remove apostrophes in + lets. by @rashmivagha in #13423 + - Fixed progress UI not restoring terminal once operation + completes. by @ndeloof in #13439 + - Fixed status alignment in progress UI. by @ndeloof in #13438 + - Restored image layer download progress details on pull. by + @ndeloof in #13445 + - Added 'configured' event at the end of model configuration + phase. by @glours in #13446 + - Introduced a build tag to select watcher implementation. by + @ndeloof in #13452 + - Removed mention for v2 on README. by @alexislefebvre in + #13451 + - Fixed missing error handling in setEnvWithDotEnv. by + @htoyoda18 in #13450 + - Adopted morikuni/aec library over raw ANSI sequences. by + @ndeloof in #13440 + - Prevented incorrect progress metrics to break compose + display. by @ndeloof in #13457 + - Restored support for BUILDKIT_PROGRESS. by @ndeloof in #13455 + - Added check model plugin is successfully loaded. by @ndeloof + in #13464 + - Added a warning when no service has been selected to build. + by @ndeloof in #13467 + * Dependencies + - Drop Go min patch version by @austinvazquez in #13418 + - bump golang 1.24.11 by @austinvazquez in #13417 + - bump osxcross by @ndeloof in #13425 + - bump golang.org/x/sys from 0.38.0 to 0.39.0 by + @dependabot[bot] in #13433 + - bump github.com/docker/cli-docs-tool from 0.10.0 to 0.11.0 by + @dependabot[bot] in #13437 + - bump golang.org/x/sync from 0.18.0 to 0.19.0 by + @dependabot[bot] in #13434 + - bump tags.cncf.io/container-device-interface from 1.0.1 to + 1.1.0 by @dependabot[bot] in #13441 + - bump github.com/moby/buildkit from 0.26.2 to 0.26.3 by + @dependabot[bot] in #13462 + +------------------------------------------------------------------- Old: ---- docker-compose-5.0.0.obscpio New: ---- docker-compose-5.0.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ docker-compose.spec ++++++ --- /var/tmp/diff_new_pack.qy2RRG/_old 2025-12-19 16:47:22.921726149 +0100 +++ /var/tmp/diff_new_pack.qy2RRG/_new 2025-12-19 16:47:22.925726317 +0100 @@ -17,14 +17,14 @@ Name: docker-compose -Version: 5.0.0 +Version: 5.0.1 Release: 0 Summary: Define and run multi-container applications with Docker License: Apache-2.0 URL: https://github.com/docker/compose Source: %{name}-%{version}.tar.gz Source1: vendor.tar.gz -BuildRequires: go1.24 >= 1.24.9 +BuildRequires: go1.24 >= 1.24.3 # can be used with podman by setting # DOCKER_SOCK and DOCKER_HOST Requires: (docker or podman) ++++++ _service ++++++ --- /var/tmp/diff_new_pack.qy2RRG/_old 2025-12-19 16:47:22.997729327 +0100 +++ /var/tmp/diff_new_pack.qy2RRG/_new 2025-12-19 16:47:23.005729662 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/docker/compose</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v5.0.0</param> + <param name="revision">v5.0.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.qy2RRG/_old 2025-12-19 16:47:23.033730833 +0100 +++ /var/tmp/diff_new_pack.qy2RRG/_new 2025-12-19 16:47:23.037731000 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/docker/compose</param> - <param name="changesrevision">13d70b1c11342dafb534f3793078666437e6d00a</param></service></servicedata> + <param name="changesrevision">c89b8a2d6b4495986b8e8227463895d7a0af680a</param></service></servicedata> (No newline at EOF) ++++++ docker-compose-5.0.0.obscpio -> docker-compose-5.0.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/.go-version new/docker-compose-5.0.1/.go-version --- old/docker-compose-5.0.0/.go-version 1970-01-01 01:00:00.000000000 +0100 +++ new/docker-compose-5.0.1/.go-version 2025-12-18 11:35:33.000000000 +0100 @@ -0,0 +1 @@ +1.24.11 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/Dockerfile new/docker-compose-5.0.1/Dockerfile --- old/docker-compose-5.0.0/Dockerfile 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/Dockerfile 2025-12-18 11:35:33.000000000 +0100 @@ -15,8 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -ARG GO_VERSION=1.24.9 -ARG XX_VERSION=1.6.1 +ARG GO_VERSION=1.24.11 +ARG XX_VERSION=1.9.0 ARG GOLANGCI_LINT_VERSION=v2.6.2 ARG ADDLICENSE_VERSION=v1.0.0 @@ -28,12 +28,12 @@ FROM --platform=${BUILDPLATFORM} tonistiigi/xx:${XX_VERSION} AS xx # osxcross contains the MacOSX cross toolchain for xx -FROM crazymax/osxcross:11.3-alpine AS osxcross +FROM crazymax/osxcross:15.5-alpine AS osxcross FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION}-alpine AS golangci-lint FROM ghcr.io/google/addlicense:${ADDLICENSE_VERSION} AS addlicense -FROM --platform=${BUILDPLATFORM} golang:${GO_VERSION}-alpine AS base +FROM --platform=${BUILDPLATFORM} golang:${GO_VERSION}-alpine3.22 AS base COPY --from=xx / / RUN apk add --no-cache \ clang \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/Makefile new/docker-compose-5.0.1/Makefile --- old/docker-compose-5.0.0/Makefile 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/Makefile 2025-12-18 11:35:33.000000000 +0100 @@ -29,6 +29,10 @@ BINARY_EXT=.exe endif +ifeq ($(DETECTED_OS),Darwin) + GO_BUILDTAGS += fsnotify +endif + BUILD_FLAGS?= TEST_FLAGS?= E2E_TEST?= @@ -62,11 +66,11 @@ .PHONY: binary binary: - $(BUILDX_CMD) bake binary + BUILD_TAGS="$(GO_BUILDTAGS)" $(BUILDX_CMD) bake binary .PHONY: binary-with-coverage binary-with-coverage: - $(BUILDX_CMD) bake binary-with-coverage + BUILD_TAGS="$(GO_BUILDTAGS)" $(BUILDX_CMD) bake binary-with-coverage .PHONY: install install: binary diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/README.md new/docker-compose-5.0.1/README.md --- old/docker-compose-5.0.0/README.md 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/README.md 2025-12-18 11:35:33.000000000 +0100 @@ -1,12 +1,13 @@ # Table of Contents -- [Docker Compose v2](#docker-compose-v2) +- [Docker Compose](#docker-compose) - [Where to get Docker Compose](#where-to-get-docker-compose) + [Windows and macOS](#windows-and-macos) + [Linux](#linux) - [Quick Start](#quick-start) - [Contributing](#contributing) - [Legacy](#legacy) -# Docker Compose v2 + +# Docker Compose [](https://github.com/docker/compose/releases/latest) [](https://pkg.go.dev/github.com/docker/compose/v5) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/cmd/compose/compose.go new/docker-compose-5.0.1/cmd/compose/compose.go --- old/docker-compose-5.0.0/cmd/compose/compose.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/cmd/compose/compose.go 2025-12-18 11:35:33.000000000 +0100 @@ -59,7 +59,7 @@ // ComposeProjectName define the project name to be used, instead of guessing from parent directory ComposeProjectName = "COMPOSE_PROJECT_NAME" // ComposeCompatibility try to mimic compose v1 as much as possible - ComposeCompatibility = "COMPOSE_COMPATIBILITY" + ComposeCompatibility = api.ComposeCompatibility // ComposeRemoveOrphans remove "orphaned" containers, i.e. containers tagged for current project but not declared as service ComposeRemoveOrphans = "COMPOSE_REMOVE_ORPHANS" // ComposeIgnoreOrphans ignore "orphaned" containers @@ -680,20 +680,20 @@ cli.WithDotEnv, ) if err != nil { - return nil + return err } envFromFile, err := dotenv.GetEnvFromFile(composegoutils.GetAsEqualsMap(os.Environ()), options.EnvFiles) if err != nil { - return nil + return err } for k, v := range envFromFile { if _, ok := os.LookupEnv(k); !ok && strings.HasPrefix(k, "COMPOSE_") { - if err = os.Setenv(k, v); err != nil { - return nil + if err := os.Setenv(k, v); err != nil { + return err } } } - return err + return nil } var printerModes = []string{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/cmd/compose/run.go new/docker-compose-5.0.1/cmd/compose/run.go --- old/docker-compose-5.0.0/cmd/compose/run.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/cmd/compose/run.go 2025-12-18 11:35:33.000000000 +0100 @@ -142,7 +142,7 @@ return environment, nil } -func runCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command { //nolint:gocyclo +func runCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *BackendOptions) *cobra.Command { options := runOptions{ composeOptions: &composeOptions{ ProjectOptions: p, @@ -185,7 +185,7 @@ } } else if !cmd.Flags().Changed("no-TTY") && !cmd.Flags().Changed("interactive") && !dockerCli.In().IsTerminal() { // while `docker run` requires explicit `-it` flags, Compose enables interactive mode and TTY by default - // but when compose is used from a scripr has stdin piped from another command, we just can't + // but when compose is used from a script that has stdin piped from another command, we just can't // Here, we detect we run "by default" (user didn't passed explicit flags) and disable TTY allocation if // we don't have an actual terminal to attach to for interactive mode options.noTty = true @@ -193,11 +193,7 @@ if options.quiet { display.Mode = display.ModeQuiet - devnull, err := os.Open(os.DevNull) - if err != nil { - return err - } - os.Stdout = devnull + backendOptions.Add(compose.WithEventProcessor(display.Quiet())) } createOpts.pullChanged = cmd.Flags().Changed("pull") return nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/cmd/display/tty.go new/docker-compose-5.0.1/cmd/display/tty.go --- old/docker-compose-5.0.0/cmd/display/tty.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/cmd/display/tty.go 2025-12-18 11:35:33.000000000 +0100 @@ -20,6 +20,7 @@ "context" "fmt" "io" + "iter" "strings" "sync" "time" @@ -29,6 +30,7 @@ "github.com/morikuni/aec" "github.com/docker/compose/v5/pkg/api" + "github.com/docker/compose/v5/pkg/utils" ) // Full creates an EventProcessor that render advanced UI within a terminal. @@ -37,31 +39,31 @@ return &ttyWriter{ out: out, info: info, - tasks: map[string]task{}, + tasks: map[string]*task{}, done: make(chan bool), mtx: &sync.Mutex{}, } } type ttyWriter struct { - out io.Writer - ids []string // tasks ids ordered as first event appeared - tasks map[string]task - repeated bool - numLines int - done chan bool - mtx *sync.Mutex - dryRun bool // FIXME(ndeloof) (re)implement support for dry-run - skipChildEvents bool - operation string - ticker *time.Ticker - suspended bool - info io.Writer + out io.Writer + ids []string // tasks ids ordered as first event appeared + tasks map[string]*task + repeated bool + numLines int + done chan bool + mtx *sync.Mutex + dryRun bool // FIXME(ndeloof) (re)implement support for dry-run + operation string + ticker *time.Ticker + suspended bool + info io.Writer } type task struct { ID string - parentID string + parent string // the resource this task receives updates from - other parents will be ignored + parents utils.Set[string] // all resources to depend on this task startTime time.Time endTime time.Time text string @@ -73,6 +75,64 @@ spinner *Spinner } +func newTask(e api.Resource) task { + t := task{ + ID: e.ID, + parents: utils.NewSet[string](), + startTime: time.Now(), + text: e.Text, + details: e.Details, + status: e.Status, + current: e.Current, + percent: e.Percent, + total: e.Total, + spinner: NewSpinner(), + } + if e.ParentID != "" { + t.parent = e.ParentID + t.parents.Add(e.ParentID) + } + if e.Status == api.Done || e.Status == api.Error { + t.stop() + } + return t +} + +// update adjusts task state based on last received event +func (t *task) update(e api.Resource) { + if e.ParentID != "" { + t.parents.Add(e.ParentID) + // we may receive same event from distinct parents (typically: images sharing layers) + // to avoid status to flicker, only accept updates from our first declared parent + if t.parent != e.ParentID { + return + } + } + + // update task based on received event + switch e.Status { + case api.Done, api.Error, api.Warning: + if t.status != e.Status { + t.stop() + } + case api.Working: + t.hasMore() + } + t.status = e.Status + t.text = e.Text + t.details = e.Details + // progress can only go up + if e.Total > t.total { + t.total = e.Total + } + if e.Current > t.current { + t.current = e.Current + } + if e.Percent > t.percent { + t.percent = e.Percent + } +} + func (t *task) stop() { t.endTime = time.Now() t.spinner.Stop() @@ -82,6 +142,15 @@ t.spinner.Restart() } +func (t *task) Completed() bool { + switch t.status { + case api.Done, api.Error, api.Warning: + return true + default: + return false + } +} + func (w *ttyWriter) Start(ctx context.Context, operation string) { w.ticker = time.NewTicker(100 * time.Millisecond) w.operation = operation @@ -93,11 +162,6 @@ w.ticker.Stop() return case <-w.done: - w.print() - w.mtx.Lock() - w.ticker.Stop() - w.operation = "" - w.mtx.Unlock() return case <-w.ticker.C: w.print() @@ -107,6 +171,11 @@ } func (w *ttyWriter) Done(operation string, success bool) { + w.print() + w.mtx.Lock() + defer w.mtx.Unlock() + w.ticker.Stop() + w.operation = "" w.done <- true } @@ -138,49 +207,10 @@ } if last, ok := w.tasks[e.ID]; ok { - switch e.Status { - case api.Done, api.Error, api.Warning: - if last.status != e.Status { - last.stop() - } - case api.Working: - last.hasMore() - } - last.status = e.Status - last.text = e.Text - last.details = e.Details - // progress can only go up - if e.Total > last.total { - last.total = e.Total - } - if e.Current > last.current { - last.current = e.Current - } - if e.Percent > last.percent { - last.percent = e.Percent - } - // allow set/unset of parent, but not swapping otherwise prompt is flickering - if last.parentID == "" || e.ParentID == "" { - last.parentID = e.ParentID - } - w.tasks[e.ID] = last + last.update(e) } else { - t := task{ - ID: e.ID, - parentID: e.ParentID, - startTime: time.Now(), - text: e.Text, - details: e.Details, - status: e.Status, - current: e.Current, - percent: e.Percent, - total: e.Total, - spinner: NewSpinner(), - } - if e.Status == api.Done || e.Status == api.Error { - t.stop() - } - w.tasks[e.ID] = t + t := newTask(e) + w.tasks[e.ID] = &t w.ids = append(w.ids, e.ID) } w.printEvent(e) @@ -206,6 +236,28 @@ _, _ = fmt.Fprintf(w.out, "%s %s %s\n", e.ID, color(e.Text), e.Details) } +func (w *ttyWriter) parentTasks() iter.Seq[*task] { + return func(yield func(*task) bool) { + for _, id := range w.ids { // iterate on ids to enforce a consistent order + t := w.tasks[id] + if len(t.parents) == 0 { + yield(t) + } + } + } +} + +func (w *ttyWriter) childrenTasks(parent string) iter.Seq[*task] { + return func(yield func(*task) bool) { + for _, id := range w.ids { // iterate on ids to enforce a consistent order + t := w.tasks[id] + if t.parents.Has(parent) { + yield(t) + } + } + } +} + func (w *ttyWriter) print() { w.mtx.Lock() defer w.mtx.Unlock() @@ -213,18 +265,17 @@ return } terminalWidth := goterm.Width() - b := aec.EmptyBuilder - for i := 0; i <= w.numLines; i++ { - b = b.Up(1) - } + up := w.numLines + 1 if !w.repeated { - b = b.Down(1) + up-- + w.repeated = true } - w.repeated = true - _, _ = fmt.Fprint(w.out, b.Column(0).ANSI) - - // Hide the cursor while we are printing - _, _ = fmt.Fprint(w.out, aec.Hide) + b := aec.NewBuilder( + aec.Hide, // Hide the cursor while we are printing + aec.Up(uint(up)), + aec.Column(0), + ) + _, _ = fmt.Fprint(w.out, b.ANSI) defer func() { _, _ = fmt.Fprint(w.out, aec.Show) }() @@ -235,36 +286,24 @@ var statusPadding int for _, t := range w.tasks { l := len(t.ID) - if statusPadding < l { + if len(t.parents) == 0 && statusPadding < l { statusPadding = l } - if t.parentID != "" { - statusPadding -= 2 - } } - if len(w.tasks) > goterm.Height()-2 { - w.skipChildEvents = true - } + skipChildEvents := len(w.tasks) > goterm.Height()-2 numLines := 0 - - for _, id := range w.ids { // iterate on ids to enforce a consistent order - t := w.tasks[id] - if t.parentID != "" { - continue - } + for t := range w.parentTasks() { line := w.lineText(t, "", terminalWidth, statusPadding, w.dryRun) _, _ = fmt.Fprint(w.out, line) numLines++ - for _, t := range w.tasks { - if t.parentID == t.ID { - if w.skipChildEvents { - continue - } - line := w.lineText(t, " ", terminalWidth, statusPadding, w.dryRun) - _, _ = fmt.Fprint(w.out, line) - numLines++ - } + if skipChildEvents { + continue + } + for child := range w.childrenTasks(t.ID) { + line := w.lineText(child, " ", terminalWidth, statusPadding-2, w.dryRun) + _, _ = fmt.Fprint(w.out, line) + numLines++ } } for i := numLines; i < w.numLines; i++ { @@ -276,7 +315,7 @@ w.numLines = numLines } -func (w *ttyWriter) lineText(t task, pad string, terminalWidth, statusPadding int, dryRun bool) string { +func (w *ttyWriter) lineText(t *task, pad string, terminalWidth, statusPadding int, dryRun bool) string { endTime := time.Now() if t.status != api.Working { endTime = t.startTime @@ -300,18 +339,20 @@ // only show the aggregated progress while the root operation is in-progress if parent := t; parent.status == api.Working { - for _, id := range w.ids { - child := w.tasks[id] - if child.parentID == parent.ID { - if child.status == api.Working && child.total == 0 { - // we don't have totals available for all the child events - // so don't show the total progress yet - hideDetails = true - } - total += child.total - current += child.current - completion = append(completion, percentChars[(len(percentChars)-1)*child.percent/100]) + for child := range w.childrenTasks(parent.ID) { + if child.status == api.Working && child.total == 0 { + // we don't have totals available for all the child events + // so don't show the total progress yet + hideDetails = true + } + total += child.total + current += child.current + r := len(percentChars) - 1 + p := child.percent + if p > 100 { + p = 100 } + completion = append(completion, percentChars[r*p/100]) } } @@ -366,7 +407,7 @@ spinnerError = "✘" ) -func spinner(t task) string { +func spinner(t *task) string { switch t.status { case api.Done: return SuccessColor(spinnerDone) @@ -392,7 +433,7 @@ } } -func numDone(tasks map[string]task) int { +func numDone(tasks map[string]*task) int { i := 0 for _, t := range tasks { if t.status != api.Working { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/cmd/formatter/ansi.go new/docker-compose-5.0.1/cmd/formatter/ansi.go --- old/docker-compose-5.0.0/cmd/formatter/ansi.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/cmd/formatter/ansi.go 2025-12-18 11:35:33.000000000 +0100 @@ -20,47 +20,46 @@ "fmt" "github.com/acarl005/stripansi" + "github.com/morikuni/aec" ) var disableAnsi bool -func ansi(code string) string { - return fmt.Sprintf("\033%s", code) -} - func saveCursor() { if disableAnsi { return } - fmt.Print(ansi("7")) + // see https://github.com/morikuni/aec/pull/5 + fmt.Print(aec.Save) } func restoreCursor() { if disableAnsi { return } - fmt.Print(ansi("8")) + // see https://github.com/morikuni/aec/pull/5 + fmt.Print(aec.Restore) } func showCursor() { if disableAnsi { return } - fmt.Print(ansi("[?25h")) + fmt.Print(aec.Show) } func moveCursor(y, x int) { if disableAnsi { return } - fmt.Print(ansi(fmt.Sprintf("[%d;%dH", y, x))) + fmt.Print(aec.Position(uint(y), uint(x))) } func carriageReturn() { if disableAnsi { return } - fmt.Print(ansi(fmt.Sprintf("[%dG", 0))) + fmt.Print(aec.Column(0)) } func clearLine() { @@ -68,7 +67,7 @@ return } // Does not move cursor from its current position - fmt.Print(ansi("[2K")) + fmt.Print(aec.EraseLine(aec.EraseModes.Tail)) } func moveCursorUp(lines int) { @@ -76,7 +75,7 @@ return } // Does not add new lines - fmt.Print(ansi(fmt.Sprintf("[%dA", lines))) + fmt.Print(aec.Up(uint(lines))) } func moveCursorDown(lines int) { @@ -84,7 +83,7 @@ return } // Does not add new lines - fmt.Print(ansi(fmt.Sprintf("[%dB", lines))) + fmt.Print(aec.Down(uint(lines))) } func newLine() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/docs/extension.md new/docker-compose-5.0.1/docs/extension.md --- old/docker-compose-5.0.0/docs/extension.md 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/docs/extension.md 2025-12-18 11:35:33.000000000 +0100 @@ -1,7 +1,7 @@ # About The Compose application model defines `service` as an abstraction for a computing unit managing (a subset of) -application needs, which can interact with other service by relying on network(s). Docker Compose is designed +application needs, which can interact with other services by relying on network(s). Docker Compose is designed to use the Docker Engine ("Moby") API to manage services as containers, but the abstraction _could_ also cover many other runtimes, typically cloud services or services natively provided by host. @@ -55,8 +55,8 @@ `type` can be either: - `info`: Reports status updates to the user. Compose will render message as the service state in the progress UI -- `error`: Let's the user know something went wrong with details about the error. Compose will render the message as the reason for the service failure. -- `setenv`: Let's the plugin tell Compose how dependent services can access the created resource. See next section for further details. +- `error`: Lets the user know something went wrong with details about the error. Compose will render the message as the reason for the service failure. +- `setenv`: Lets the plugin tell Compose how dependent services can access the created resource. See next section for further details. - `debug`: Those messages could help debugging the provider, but are not rendered to the user by default. They are rendered when Compose is started with `--verbose` flag. ```mermaid diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/docs/sdk.md new/docker-compose-5.0.1/docs/sdk.md --- old/docker-compose-5.0.0/docs/sdk.md 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/docs/sdk.md 2025-12-18 11:35:33.000000000 +0100 @@ -41,7 +41,7 @@ if err != nil { log.Fatalf("Failed to create docker CLI: %v", err) } - err = dockerCLI.Initialize(flags.ClientOptions{}) + err = dockerCLI.Initialize(&flags.ClientOptions{}) if err != nil { log.Fatalf("Failed to initialize docker CLI: %v", err) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/go.mod new/docker-compose-5.0.1/go.mod --- old/docker-compose-5.0.0/go.mod 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/go.mod 2025-12-18 11:35:33.000000000 +0100 @@ -1,6 +1,6 @@ module github.com/docker/compose/v5 -go 1.24.9 +go 1.24.3 require ( github.com/AlecAivazis/survey/v2 v2.3.7 @@ -16,7 +16,7 @@ github.com/distribution/reference v0.6.0 github.com/docker/buildx v0.30.1 github.com/docker/cli v28.5.2+incompatible - github.com/docker/cli-docs-tool v0.10.0 + github.com/docker/cli-docs-tool v0.11.0 github.com/docker/docker v28.5.2+incompatible github.com/docker/go-connections v0.6.0 github.com/docker/go-units v0.5.0 @@ -29,18 +29,18 @@ github.com/jonboulle/clockwork v0.5.0 github.com/mattn/go-shellwords v1.0.12 github.com/mitchellh/go-ps v1.0.0 - github.com/moby/buildkit v0.26.2 + github.com/moby/buildkit v0.26.3 github.com/moby/go-archive v0.1.0 github.com/moby/patternmatcher v0.6.0 github.com/moby/sys/atomicwriter v0.1.0 github.com/moby/term v0.5.2 - github.com/morikuni/aec v1.0.0 + github.com/morikuni/aec v1.1.0 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.1.1 github.com/otiai10/copy v1.14.1 github.com/sirupsen/logrus v1.9.3 github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 - github.com/spf13/cobra v1.10.1 + github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 github.com/stretchr/testify v1.11.1 github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 @@ -54,11 +54,11 @@ go.uber.org/goleak v1.3.0 go.uber.org/mock v0.6.0 go.yaml.in/yaml/v4 v4.0.0-rc.3 - golang.org/x/sync v0.18.0 - golang.org/x/sys v0.38.0 + golang.org/x/sync v0.19.0 + golang.org/x/sys v0.39.0 google.golang.org/grpc v1.77.0 gotest.tools/v3 v3.5.2 - tags.cncf.io/container-device-interface v1.0.1 + tags.cncf.io/container-device-interface v1.1.0 ) require ( @@ -143,6 +143,7 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/crypto v0.45.0 // indirect golang.org/x/net v0.47.0 // indirect golang.org/x/term v0.37.0 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/go.sum new/docker-compose-5.0.1/go.sum --- old/docker-compose-5.0.0/go.sum 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/go.sum 2025-12-18 11:35:33.000000000 +0100 @@ -98,8 +98,8 @@ github.com/docker/buildx v0.30.1/go.mod h1:8nwT0V6UNYNo9rXq6WO/BQd9KrJ0JYcY/QX6x0y1Oro= github.com/docker/cli v28.5.2+incompatible h1:XmG99IHcBmIAoC1PPg9eLBZPlTrNUAijsHLm8PjhBlg= github.com/docker/cli v28.5.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli-docs-tool v0.10.0 h1:bOD6mKynPQgojQi3s2jgcUWGp/Ebqy1SeCr9VfKQLLU= -github.com/docker/cli-docs-tool v0.10.0/go.mod h1:5EM5zPnT2E7yCLERZmrDA234Vwn09fzRHP4aX1qwp1U= +github.com/docker/cli-docs-tool v0.11.0 h1:7d8QARFb7QEobizqxmEM7fOteZEHwH/zWgHQtHZEcfE= +github.com/docker/cli-docs-tool v0.11.0/go.mod h1:ma8BKiisUo8D6W05XEYIh3oa1UbgrZhi1nowyKFJa8Q= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -251,8 +251,8 @@ github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/buildkit v0.26.2 h1:EIh5j0gzRsCZmQzvgNNWzSDbuKqwUIiBH7ssqLv8RU8= -github.com/moby/buildkit v0.26.2/go.mod h1:ylDa7IqzVJgLdi/wO7H1qLREFQpmhFbw2fbn4yoTw40= +github.com/moby/buildkit v0.26.3 h1:D+ruZVAk/3ipRq5XRxBH9/DIFpRjSlTtMbghT5gQP9g= +github.com/moby/buildkit v0.26.3/go.mod h1:4T4wJzQS4kYWIfFRjsbJry4QoxDBjK+UGOEOs1izL7w= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/go-archive v0.1.0 h1:Kk/5rdW/g+H8NHdJW2gsXyZ7UnzvJNOy6VKJqueWdcQ= @@ -283,8 +283,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ= +github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -299,8 +299,8 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= -github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.3.0 h1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg= +github.com/opencontainers/runtime-spec v1.3.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= @@ -365,8 +365,8 @@ github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94 h1:JmfC365KywYwHB946TTiQWEb8kqPY+pybPLoGE9GgVk= github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= -github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431 h1:XTHrT015sxHyJ5FnQ0AeemSspZWaDq7DoTRW0EVsDCE= github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -445,6 +445,8 @@ go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= go.yaml.in/yaml/v4 v4.0.0-rc.3 h1:3h1fjsh1CTAPjW7q/EMe+C8shx5d8ctzZTrLcs/j8Go= go.yaml.in/yaml/v4 v4.0.0-rc.3/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -480,8 +482,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -502,8 +504,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -562,5 +564,5 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -tags.cncf.io/container-device-interface v1.0.1 h1:KqQDr4vIlxwfYh0Ed/uJGVgX+CHAkahrgabg6Q8GYxc= -tags.cncf.io/container-device-interface v1.0.1/go.mod h1:JojJIOeW3hNbcnOH2q0NrWNha/JuHoDZcmYxAZwb2i0= +tags.cncf.io/container-device-interface v1.1.0 h1:RnxNhxF1JOu6CJUVpetTYvrXHdxw9j9jFYgZpI+anSY= +tags.cncf.io/container-device-interface v1.1.0/go.mod h1:76Oj0Yqp9FwTx/pySDc8Bxjpg+VqXfDb50cKAXVJ34Q= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/api/env.go new/docker-compose-5.0.1/pkg/api/env.go --- old/docker-compose-5.0.0/pkg/api/env.go 1970-01-01 01:00:00.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/api/env.go 2025-12-18 11:35:33.000000000 +0100 @@ -0,0 +1,20 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package api + +// ComposeCompatibility try to mimic compose v1 as much as possible +const ComposeCompatibility = "COMPOSE_COMPATIBILITY" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/api/event.go new/docker-compose-5.0.1/pkg/api/event.go --- old/docker-compose-5.0.0/pkg/api/event.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/api/event.go 2025-12-18 11:35:33.000000000 +0100 @@ -38,33 +38,37 @@ const ResourceCompose = "Compose" const ( - StatusError = "Error" - StatusCreating = "Creating" - StatusStarting = "Starting" - StatusStarted = "Started" - StatusWaiting = "Waiting" - StatusHealthy = "Healthy" - StatusExited = "Exited" - StatusRestarting = "Restarting" - StatusRestarted = "Restarted" - StatusRunning = "Running" - StatusCreated = "Created" - StatusStopping = "Stopping" - StatusStopped = "Stopped" - StatusKilling = "Killing" - StatusKilled = "Killed" - StatusRemoving = "Removing" - StatusRemoved = "Removed" - StatusBuilding = "Building" - StatusBuilt = "Built" - StatusPulling = "Pulling" - StatusPulled = "Pulled" - StatusCommitting = "Committing" - StatusCommitted = "Committed" - StatusCopying = "Copying" - StatusCopied = "Copied" - StatusExporting = "Exporting" - StatusExported = "Exported" + StatusError = "Error" + StatusCreating = "Creating" + StatusStarting = "Starting" + StatusStarted = "Started" + StatusWaiting = "Waiting" + StatusHealthy = "Healthy" + StatusExited = "Exited" + StatusRestarting = "Restarting" + StatusRestarted = "Restarted" + StatusRunning = "Running" + StatusCreated = "Created" + StatusStopping = "Stopping" + StatusStopped = "Stopped" + StatusKilling = "Killing" + StatusKilled = "Killed" + StatusRemoving = "Removing" + StatusRemoved = "Removed" + StatusBuilding = "Building" + StatusBuilt = "Built" + StatusPulling = "Pulling" + StatusPulled = "Pulled" + StatusCommitting = "Committing" + StatusCommitted = "Committed" + StatusCopying = "Copying" + StatusCopied = "Copied" + StatusExporting = "Exporting" + StatusExported = "Exported" + StatusDownloading = "Downloading" + StatusDownloadComplete = "Download complete" + StatusConfiguring = "Configuring" + StatusConfigured = "Configured" ) // Resource represents status change and progress for a compose resource. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/compose/build.go new/docker-compose-5.0.1/pkg/compose/build.go --- old/docker-compose-5.0.0/pkg/compose/build.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/compose/build.go 2025-12-18 11:35:33.000000000 +0100 @@ -61,6 +61,7 @@ // also include services used as additional_contexts with service: prefix options.Services = addBuildDependencies(options.Services, project) + // Some build dependencies we just introduced may not be enabled var err error project, err = project.WithServicesEnabled(options.Services...) @@ -85,10 +86,15 @@ serviceToBuild[serviceName] = *service return nil }, policy) - if err != nil || len(serviceToBuild) == 0 { + if err != nil { return imageIDs, err } + if len(serviceToBuild) == 0 { + logrus.Warn("No services to build") + return imageIDs, nil + } + bake, err := buildWithBake(s.dockerCli) if err != nil { return nil, err diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/compose/build_bake.go new/docker-compose-5.0.1/pkg/compose/build_bake.go --- old/docker-compose-5.0.0/pkg/compose/build_bake.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/compose/build_bake.go 2025-12-18 11:35:33.000000000 +0100 @@ -119,8 +119,8 @@ eg := errgroup.Group{} ch := make(chan *client.SolveStatus) displayMode := progressui.DisplayMode(options.Progress) - if displayMode == progressui.AutoMode { - options.Progress = os.Getenv("BUILDKIT_PROGRESS") + if p, ok := os.LookupEnv("BUILDKIT_PROGRESS"); ok && displayMode == progressui.AutoMode { + displayMode = progressui.DisplayMode(p) } out := options.Out if out == nil { @@ -289,15 +289,11 @@ _ = os.Remove(metadataFile) }() - buildx, err := manager.GetPlugin("buildx", s.dockerCli, &cobra.Command{}) + buildx, err := s.getBuildxPlugin() if err != nil { return nil, err } - if versions.LessThan(buildx.Version[1:], "0.17.0") { - return nil, fmt.Errorf("compose build requires buildx 0.17 or later") - } - args := []string{"bake", "--file", "-", "--progress", "rawjson", "--metadata-file", metadataFile} // FIXME we should prompt user about this, but this is a breaking change in UX for _, path := range read { @@ -414,6 +410,27 @@ return results, nil } +func (s *composeService) getBuildxPlugin() (*manager.Plugin, error) { + buildx, err := manager.GetPlugin("buildx", s.dockerCli, &cobra.Command{}) + if err != nil { + return nil, err + } + + if buildx.Err != nil { + return nil, buildx.Err + } + + if buildx.Version == "" { + return nil, fmt.Errorf("failed to get version of buildx") + } + + if versions.LessThan(buildx.Version[1:], "0.17.0") { + return nil, fmt.Errorf("compose build requires buildx 0.17 or later") + } + + return buildx, nil +} + // makeConsole wraps the provided writer to match [containerd.File] interface if it is of type *streams.Out. // buildkit's NewDisplay doesn't actually require a [io.Reader], it only uses the [containerd.Console] type to // benefits from ANSI capabilities, but only does writes. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/compose/loader.go new/docker-compose-5.0.1/pkg/compose/loader.go --- old/docker-compose-5.0.0/pkg/compose/loader.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/compose/loader.go 2025-12-18 11:35:33.000000000 +0100 @@ -28,6 +28,7 @@ "github.com/docker/compose/v5/pkg/api" "github.com/docker/compose/v5/pkg/remote" + "github.com/docker/compose/v5/pkg/utils" ) // LoadProject implements api.Compose.LoadProject @@ -48,7 +49,7 @@ } } - if options.Compatibility { + if options.Compatibility || utils.StringToBool(projectOptions.Environment[api.ComposeCompatibility]) { api.Separator = "_" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/compose/model.go new/docker-compose-5.0.1/pkg/compose/model.go --- old/docker-compose-5.0.0/pkg/compose/model.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/compose/model.go 2025-12-18 11:35:33.000000000 +0100 @@ -75,6 +75,7 @@ env []string prepare func(ctx context.Context, cmd *exec.Cmd) error cleanup func() + version string } func (s *composeService) newModelAPI(project *types.Project) (*modelAPI, error) { @@ -85,12 +86,16 @@ } return nil, err } + if dockerModel.Err != nil { + return nil, fmt.Errorf("failed to load Docker Model plugin: %w", dockerModel.Err) + } endpoint, cleanup, err := s.propagateDockerEndpoint() if err != nil { return nil, err } return &modelAPI{ - path: dockerModel.Path, + path: dockerModel.Path, + version: dockerModel.Version, prepare: func(ctx context.Context, cmd *exec.Cmd) error { return s.prepareShellOut(ctx, project.Environment, cmd) }, @@ -107,7 +112,7 @@ events.On(api.Resource{ ID: model.Name, Status: api.Working, - Text: "Pulling", + Text: api.StatusPulling, }) cmd := exec.CommandContext(ctx, m.path, "pull", model.Model) @@ -161,7 +166,7 @@ events.On(api.Resource{ ID: config.Name, Status: api.Working, - Text: "Configuring", + Text: api.StatusConfiguring, }) // configure [--context-size=<n>] MODEL args := []string{"configure"} @@ -174,7 +179,17 @@ if err != nil { return err } - return cmd.Run() + err = cmd.Run() + if err != nil { + events.On(errorEvent(config.Name, err.Error())) + return err + } + events.On(api.Resource{ + ID: config.Name, + Status: api.Done, + Text: api.StatusConfigured, + }) + return nil } func (m *modelAPI) SetModelVariables(ctx context.Context, project *types.Project) error { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/compose/pull.go new/docker-compose-5.0.1/pkg/compose/pull.go --- old/docker-compose-5.0.0/pkg/compose/pull.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/compose/pull.go 2025-12-18 11:35:33.000000000 +0100 @@ -398,14 +398,14 @@ } var ( - text string - total int64 - percent int - current int64 - status = api.Working + progress string + total int64 + percent int + current int64 + status = api.Working ) - text = jm.Progress.String() + progress = jm.Progress.String() switch jm.Status { case PreparingPhase, WaitingPhase, PullingFsPhase: @@ -416,6 +416,9 @@ total = jm.Progress.Total if jm.Progress.Total > 0 { percent = int(jm.Progress.Current * 100 / jm.Progress.Total) + if percent > 100 { + percent = 100 + } } } case DownloadCompletePhase, AlreadyExistsPhase, PullCompletePhase: @@ -431,7 +434,7 @@ if jm.Error != nil { status = api.Error - text = jm.Error.Message + progress = jm.Error.Message } events.On(api.Resource{ @@ -441,6 +444,7 @@ Total: total, Percent: percent, Status: status, - Text: text, + Text: jm.Status, + Details: progress, }) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/compose/push.go new/docker-compose-5.0.1/pkg/compose/push.go --- old/docker-compose-5.0.0/pkg/compose/push.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/compose/push.go 2025-12-18 11:35:33.000000000 +0100 @@ -155,6 +155,9 @@ total = jm.Progress.Total if jm.Progress.Total > 0 { percent = int(jm.Progress.Current * 100 / jm.Progress.Total) + if percent > 100 { + percent = 100 + } } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/compose/run.go new/docker-compose-5.0.1/pkg/compose/run.go --- old/docker-compose-5.0.0/pkg/compose/run.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/compose/run.go 2025-12-18 11:35:33.000000000 +0100 @@ -38,7 +38,7 @@ return 0, err } - // remove cancellable context signal handler so we can forward signals to container without compose to exit + // remove cancellable context signal handler so we can forward signals to container without compose from exiting signal.Reset() sigc := make(chan os.Signal, 128) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/dryrun/dryrunclient.go new/docker-compose-5.0.1/pkg/dryrun/dryrunclient.go --- old/docker-compose-5.0.0/pkg/dryrun/dryrunclient.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/dryrun/dryrunclient.go 2025-12-18 11:35:33.000000000 +0100 @@ -313,7 +313,7 @@ return nil } -// Functions delegated to original APIClient (not used by Compose or not modifying the Compose stack +// Functions delegated to original APIClient (not used by Compose or not modifying the Compose stack) func (d *DryRunClient) ConfigList(ctx context.Context, options swarm.ConfigListOptions) ([]swarm.Config, error) { return d.apiClient.ConfigList(ctx, options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/watch/watcher_darwin.go new/docker-compose-5.0.1/pkg/watch/watcher_darwin.go --- old/docker-compose-5.0.0/pkg/watch/watcher_darwin.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/watch/watcher_darwin.go 2025-12-18 11:35:33.000000000 +0100 @@ -1,4 +1,4 @@ -//go:build darwin +//go:build fsnotify /* Copyright 2020 Docker Compose CLI authors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/docker-compose-5.0.0/pkg/watch/watcher_naive.go new/docker-compose-5.0.1/pkg/watch/watcher_naive.go --- old/docker-compose-5.0.0/pkg/watch/watcher_naive.go 2025-12-02 08:41:49.000000000 +0100 +++ new/docker-compose-5.0.1/pkg/watch/watcher_naive.go 2025-12-18 11:35:33.000000000 +0100 @@ -1,4 +1,4 @@ -//go:build !darwin +//go:build !fsnotify /* Copyright 2020 Docker Compose CLI authors ++++++ docker-compose.obsinfo ++++++ --- /var/tmp/diff_new_pack.qy2RRG/_old 2025-12-19 16:47:24.017771985 +0100 +++ /var/tmp/diff_new_pack.qy2RRG/_new 2025-12-19 16:47:24.037772821 +0100 @@ -1,5 +1,5 @@ name: docker-compose -version: 5.0.0 -mtime: 1764661309 -commit: 13d70b1c11342dafb534f3793078666437e6d00a +version: 5.0.1 +mtime: 1766054133 +commit: c89b8a2d6b4495986b8e8227463895d7a0af680a ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/docker-compose/vendor.tar.gz /work/SRC/openSUSE:Factory/.docker-compose.new.1928/vendor.tar.gz differ: char 13, line 1
