in gke-deploy/core/resource/resource.go [79:145]
func ParseConfigs(ctx context.Context, configs string, oss services.OSService, recursive bool) (Objects, error) {
objs := Objects{}
if configs == "-" {
if recursive {
return nil, fmt.Errorf("cannot recur with stdin")
}
objs, err := parseResourcesFromFile(ctx, configs, objs, oss)
if err != nil {
return nil, fmt.Errorf("failed to parse config from stdin: %v", err)
}
return objs, nil
}
fi, err := oss.Stat(ctx, configs)
if err != nil {
return nil, fmt.Errorf("failed to get file info for %q: %v", configs, err)
}
if !fi.IsDir() && recursive {
return nil, fmt.Errorf("cannot recur through a file")
}
hasResources := false
// Since walk is recursive, we need to declare it before creating the function that refers to it.
var walk func(path string, fi os.FileInfo, baseDir bool) error
walk = func(path string, fi os.FileInfo, baseDir bool) error {
if fi.IsDir() {
if !baseDir && !recursive {
return nil
}
subfiles, err := oss.ReadDir(ctx, path)
if err != nil {
return fmt.Errorf("failed to list files in directory %q: %v", path, err)
}
for _, subfile := range subfiles {
subpath := filepath.Join(path, subfile.Name())
if err = walk(subpath, subfile, false); err != nil {
return err
}
}
} else {
if hasYamlOrYmlSuffix(path) {
hasResources = true
objs, err = parseResourcesFromFile(ctx, path, objs, oss)
if err != nil {
return fmt.Errorf("failed to parse config %q: %v", path, err)
}
}
}
return nil
}
if err = walk(configs, fi, true); err != nil {
return nil, err
}
if !hasResources {
if fi.IsDir() {
return nil, fmt.Errorf("directory %q has no \".yaml\" or \".yml\" files to parse", configs)
}
return nil, fmt.Errorf("file %q does not end in \".yaml\" or \".yml\"", configs)
}
return objs, nil
}