1
1
package tanka
2
2
3
3
import (
4
+ "fmt"
4
5
"io/ioutil"
5
6
"os"
6
7
"path/filepath"
7
8
9
+ "github.com/grafana/tanka/pkg/jsonnet/jpath"
8
10
"github.com/grafana/tanka/pkg/spec/v1alpha1"
11
+ "github.com/pkg/errors"
9
12
"k8s.io/apimachinery/pkg/labels"
10
13
)
11
14
@@ -21,9 +24,9 @@ type FindOpts struct {
21
24
// are not checked.
22
25
func FindEnvs (path string , opts FindOpts ) ([]* v1alpha1.Environment , error ) {
23
26
// find all environments at dir
24
- envs , err := find (path , Opts {JsonnetOpts : opts .JsonnetOpts })
25
- if err != nil {
26
- return nil , err
27
+ envs , errs := find (path , Opts {JsonnetOpts : opts .JsonnetOpts })
28
+ if errs != nil {
29
+ return envs , ErrParallel { errors : errs }
27
30
}
28
31
29
32
// optionally filter
@@ -42,18 +45,28 @@ func FindEnvs(path string, opts FindOpts) ([]*v1alpha1.Environment, error) {
42
45
return filtered , nil
43
46
}
44
47
48
+ func findErr (path string , err error ) []error {
49
+ return []error {fmt .Errorf ("%s:\n %w" , path , err )}
50
+ }
51
+
45
52
// find implements the actual functionality described at 'FindEnvs'
46
- func find (path string , opts Opts ) ([]* v1alpha1.Environment , error ) {
53
+ func find (path string , opts Opts ) ([]* v1alpha1.Environment , [] error ) {
47
54
// try if this has envs
48
55
list , err := List (path , opts )
49
- if len (list ) != 0 && err == nil {
56
+ if err != nil &&
57
+ // expected when looking for environments
58
+ ! errors .As (err , & jpath.ErrorNoBase {}) &&
59
+ ! errors .As (err , & jpath.ErrorFileNotFound {}) {
60
+ return nil , findErr (path , err )
61
+ }
62
+ if len (list ) != 0 {
50
63
// it has. don't search deeper
51
64
return list , nil
52
65
}
53
66
54
67
stat , err := os .Stat (path )
55
68
if err != nil {
56
- return nil , err
69
+ return nil , findErr ( path , err )
57
70
}
58
71
59
72
// if path is a file, don't search deeper
@@ -64,7 +77,7 @@ func find(path string, opts Opts) ([]*v1alpha1.Environment, error) {
64
77
// list directory
65
78
files , err := ioutil .ReadDir (path )
66
79
if err != nil {
67
- return nil , err
80
+ return nil , findErr ( path , err )
68
81
}
69
82
70
83
// it's not one. Maybe subdirectories are?
@@ -82,31 +95,31 @@ func find(path string, opts Opts) ([]*v1alpha1.Environment, error) {
82
95
}
83
96
84
97
// collect parallel results
85
- var lastErr error
98
+ var errs [] error
86
99
var envs []* v1alpha1.Environment
87
100
88
101
for i := 0 ; i < routines ; i ++ {
89
102
out := <- ch
90
- if out .err != nil {
91
- lastErr = out .err
103
+ if out .errs != nil {
104
+ errs = append ( errs , out .errs ... )
92
105
}
93
106
94
107
envs = append (envs , out .envs ... )
95
108
}
96
109
97
- if lastErr != nil {
98
- return nil , lastErr
110
+ if len ( errs ) != 0 {
111
+ return envs , errs
99
112
}
100
113
101
114
return envs , nil
102
115
}
103
116
104
117
type findOut struct {
105
118
envs []* v1alpha1.Environment
106
- err error
119
+ errs [] error
107
120
}
108
121
109
122
func findShim (dir string , opts Opts , ch chan findOut ) {
110
- envs , err := find (dir , opts )
111
- ch <- findOut {envs : envs , err : err }
123
+ envs , errs := find (dir , opts )
124
+ ch <- findOut {envs : envs , errs : errs }
112
125
}
0 commit comments