Merge pull request #3487 from jsternberg/dap-pause-non-existent-file

dap: attempt to find multiple digests when a failure happens
This commit is contained in:
Tõnis Tiigi
2025-10-29 16:11:32 -07:00
committed by GitHub
+23 -13
View File
@@ -4,6 +4,7 @@ import (
"context"
"path"
"path/filepath"
"slices"
"sync"
"github.com/docker/buildx/build"
@@ -646,29 +647,38 @@ func (t *thread) rewind(ctx Context, inErr error) (k string, result *step, mount
return "", nil, nil, inErr
}
dt, err := solveErr.Op.Marshal()
if err != nil {
return "", nil, nil, err
// Find the error digests we might have failed on.
var digests []digest.Digest
if dt, err := solveErr.Op.Marshal(); err == nil {
digests = append(digests, digest.FromBytes(dt))
}
// Find the error digest.
errDgst := digest.FromBytes(dt)
// Include a version of the digest without the platform
// if this is a file op.
if _, ok := solveErr.Op.Op.(*pb.Op_File); ok && solveErr.Op.Platform != nil {
op := solveErr.Op.CloneVT()
op.Platform = nil
if dt, err := op.Marshal(); err == nil {
digests = append(digests, digest.FromBytes(dt))
}
}
if len(digests) == 0 {
return "", nil, nil, inErr
}
// Iterate from the first step to find the one we failed on.
result = t.entrypoint
for result != nil && result.dgst != errDgst {
for result != nil && !slices.Contains(digests, result.dgst) {
result = result.in
}
if result == nil {
return "", nil, nil, inErr
}
// Seek to this step. This should succeed because otherwise
// we wouldn't have been able to even fail on it to begin with.
k, result, mounts, err = t.seek(ctx, result)
if err != nil {
return k, result, mounts, err
k, result, mounts, retErr = t.seek(ctx, result)
if retErr != nil {
return k, result, mounts, retErr
}
return k, result, mounts, inErr
}