diff --git a/solver/llbsolver/file/backend.go b/solver/llbsolver/file/backend.go index 6212066cd..f83593b79 100644 --- a/solver/llbsolver/file/backend.go +++ b/solver/llbsolver/file/backend.go @@ -161,14 +161,15 @@ func rmPath(root, src string, allowNotFound bool) error { } p := filepath.Join(dir, base) - if err := os.RemoveAll(p); err != nil { - if errors.Is(err, os.ErrNotExist) && allowNotFound { - return nil + if !allowNotFound { + _, err := os.Stat(p) + + if errors.Is(err, os.ErrNotExist) { + return err } - return err } - return nil + return os.RemoveAll(p) } func docopy(ctx context.Context, src, dest string, action pb.FileActionCopy, u *copy.User, idmap *idtools.IdentityMapping) error { diff --git a/solver/llbsolver/file/backend_test.go b/solver/llbsolver/file/backend_test.go new file mode 100644 index 000000000..b13df1ef7 --- /dev/null +++ b/solver/llbsolver/file/backend_test.go @@ -0,0 +1,36 @@ +package file + +import ( + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestRmPathNonExistentFileAllowNotFoundFalse(t *testing.T) { + root := t.TempDir() + err := rmPath(root, "doesnt_exist", false) + require.Error(t, err) + require.True(t, os.IsNotExist(err)) +} + +func TestRmPathNonExistentFileAllowNotFoundTrue(t *testing.T) { + root := t.TempDir() + require.NoError(t, rmPath(root, "doesnt_exist", true)) +} + +func TestRmPathFileExists(t *testing.T) { + root := t.TempDir() + + src := filepath.Join(root, "exists") + file, err := os.Create(src) + require.NoError(t, err) + file.Close() + + require.NoError(t, rmPath(root, "exists", false)) + + _, err = os.Stat(src) + + require.True(t, os.IsNotExist(err)) +}