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
 
 [![GitHub 
release](https://img.shields.io/github/v/release/docker/compose.svg?style=flat-square)](https://github.com/docker/compose/releases/latest)
 
[![PkgGoDev](https://img.shields.io/badge/go.dev-docs-007d9c?style=flat-square&logo=go&logoColor=white)](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

Reply via email to