Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit d9ca723

Browse files
author
Vincent Demeester
authored
Merge pull request #327 from silvin-lubecki/validate-multi-errors
Validate command now returns every errors it can find
2 parents e509ee4 + cedbc42 commit d9ca723

2 files changed

Lines changed: 25 additions & 16 deletions

File tree

internal/validator/validate.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io/ioutil"
77
"os"
88
"path/filepath"
9+
"strings"
910

1011
"github.com/docker/app/internal"
1112
"github.com/docker/app/internal/render"
@@ -15,29 +16,31 @@ import (
1516

1617
// Validate checks an application definition meets the specifications (metadata and rendered compose file)
1718
func Validate(appname string, settingsFiles []string, env map[string]string) error {
19+
var errs []string
1820
if err := checkExistingFiles(appname); err != nil {
19-
return err
21+
errs = append(errs, err.Error())
2022
}
2123
if err := validateMetadata(appname); err != nil {
22-
return err
24+
errs = append(errs, err.Error())
2325
}
2426
if _, err := render.Render(appname, nil, settingsFiles, env); err != nil {
25-
return err
27+
errs = append(errs, err.Error())
2628
}
27-
return nil
29+
return concatenateErrors(errs)
2830
}
2931

3032
func checkExistingFiles(appname string) error {
33+
var errs []string
3134
if _, err := os.Stat(filepath.Join(appname, internal.SettingsFileName)); err != nil {
32-
return errors.New("failed to read application settings")
35+
errs = append(errs, "failed to read application settings")
3336
}
3437
if _, err := os.Stat(filepath.Join(appname, internal.MetadataFileName)); err != nil {
35-
return errors.New("failed to read application metadata")
38+
errs = append(errs, "failed to read application metadata")
3639
}
3740
if _, err := os.Stat(filepath.Join(appname, internal.ComposeFileName)); err != nil {
38-
return errors.New("failed to read application compose")
41+
errs = append(errs, "failed to read application compose")
3942
}
40-
return nil
43+
return concatenateErrors(errs)
4144
}
4245

4346
func validateMetadata(appname string) error {
@@ -54,3 +57,10 @@ func validateMetadata(appname string) error {
5457
}
5558
return nil
5659
}
60+
61+
func concatenateErrors(errs []string) error {
62+
if len(errs) > 0 {
63+
return errors.New(strings.Join(errs, "\n"))
64+
}
65+
return nil
66+
}

internal/validator/validate_test.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,13 @@ import (
1111

1212
func TestValidateMissingFileApplication(t *testing.T) {
1313
dir := fs.NewDir(t, t.Name(),
14-
fs.WithDir("no-settings-app", fs.WithFile(internal.MetadataFileName, ""), fs.WithFile(internal.ComposeFileName, "")),
15-
fs.WithDir("no-metadata-app", fs.WithFile(internal.SettingsFileName, ""), fs.WithFile(internal.ComposeFileName, "")),
16-
fs.WithDir("no-compose-app", fs.WithFile(internal.MetadataFileName, ""), fs.WithFile(internal.SettingsFileName, "")),
14+
fs.WithDir("bad-app"),
1715
)
1816
defer dir.Remove()
19-
20-
assert.ErrorContains(t, Validate(dir.Join("no-settings-app"), nil, nil), "failed to read application settings")
21-
assert.ErrorContains(t, Validate(dir.Join("no-metadata-app"), nil, nil), "failed to read application metadata")
22-
assert.ErrorContains(t, Validate(dir.Join("no-compose-app"), nil, nil), "failed to read application compose")
17+
errs := Validate(dir.Join("bad-app"), nil, nil)
18+
assert.ErrorContains(t, errs, "failed to read application settings")
19+
assert.ErrorContains(t, errs, "failed to read application metadata")
20+
assert.ErrorContains(t, errs, "failed to read application compose")
2321
}
2422

2523
func TestValidateBrokenMetadata(t *testing.T) {
@@ -33,9 +31,10 @@ maintainers:
3331
- name: bad-user
3432
email: bad-email
3533
unknown: property`
34+
composeFile := `version: "3.6"`
3635
dir := fs.NewDir(t, t.Name(),
3736
fs.WithFile(internal.MetadataFileName, brokenMetadata),
38-
fs.WithFile(internal.ComposeFileName, ""),
37+
fs.WithFile(internal.ComposeFileName, composeFile),
3938
fs.WithFile(internal.SettingsFileName, ""))
4039
defer dir.Remove()
4140
err := Validate(dir.Path(), nil, nil)

0 commit comments

Comments
 (0)