@@ -3,6 +3,9 @@ package parser
3
3
import (
4
4
"encoding/json"
5
5
"fmt"
6
+ "net/url"
7
+ "path"
8
+ "strings"
6
9
7
10
devfileCtx "github.com/devfile/library/pkg/devfile/parser/context"
8
11
"github.com/devfile/library/pkg/devfile/parser/data"
@@ -16,7 +19,7 @@ import (
16
19
"github.com/pkg/errors"
17
20
)
18
21
19
- var URLMap = make ( map [ string ] bool )
22
+
20
23
21
24
// ParseDevfile func validates the devfile integrity.
22
25
// Creates devfile context and runtime objects
@@ -46,8 +49,8 @@ func parseDevfile(d DevfileObj, flattenedDevfile bool) (DevfileObj, error) {
46
49
return DevfileObj {}, err
47
50
}
48
51
}
49
- for url := range URLMap {
50
- delete (URLMap , url )
52
+ for uri := range devfileCtx . URIMap {
53
+ delete (devfileCtx . URIMap , uri )
51
54
}
52
55
// Successful
53
56
return d , nil
@@ -84,11 +87,6 @@ func ParseRawDevfile(path string) (d DevfileObj, err error) {
84
87
// ParseFromURL func parses and validates the devfile integrity.
85
88
// Creates devfile context and runtime objects
86
89
func ParseFromURL (url string ) (d DevfileObj , err error ) {
87
- if _ , exist := URLMap [url ]; ! exist {
88
- URLMap [url ] = true
89
- } else {
90
- return d , fmt .Errorf ("URI %v is recursively referenced" , url )
91
- }
92
90
d .Ctx = devfileCtx .NewURLDevfileCtx (url )
93
91
// Fill the fields of DevfileCtx struct
94
92
err = d .Ctx .PopulateFromURL ()
@@ -122,7 +120,7 @@ func parseParentAndPlugin(d DevfileObj) (err error) {
122
120
parent := d .Data .GetParent ()
123
121
var parentDevfileObj DevfileObj
124
122
if d .Data .GetParent ().Uri != "" {
125
- parentDevfileObj , err = ParseFromURL (parent .Uri )
123
+ parentDevfileObj , err = parseFromURI (parent .Uri , d )
126
124
if err != nil {
127
125
return err
128
126
}
@@ -153,7 +151,7 @@ func parseParentAndPlugin(d DevfileObj) (err error) {
153
151
plugin := component .Plugin
154
152
var pluginDevfileObj DevfileObj
155
153
if plugin .Uri != "" {
156
- pluginDevfileObj , err = ParseFromURL (plugin .Uri )
154
+ pluginDevfileObj , err = parseFromURI (plugin .Uri , d )
157
155
if err != nil {
158
156
return err
159
157
}
@@ -181,3 +179,37 @@ func parseParentAndPlugin(d DevfileObj) (err error) {
181
179
182
180
return nil
183
181
}
182
+
183
+
184
+
185
+ func parseFromURI (uri string , curDevfile DevfileObj ) (DevfileObj , error ){
186
+ // validate URI
187
+
188
+ // absolute URL address
189
+ if strings .HasPrefix (uri , "http://" ) || strings .HasPrefix (uri , "https://" ) {
190
+ return ParseFromURL (uri )
191
+ }
192
+
193
+ // absolute path on disk
194
+ if strings .HasPrefix (uri , "file://" ) {
195
+ return Parse (strings .TrimPrefix (uri , "file://" ))
196
+ }
197
+
198
+ // relative path on disk
199
+ if curDevfile .Ctx .GetAbsPath () != "" {
200
+ // parse uri receives a relative path and resolves abspath
201
+ return Parse (uri )
202
+ }
203
+
204
+ if curDevfile .Ctx .GetURL () != "" {
205
+ u , err := url .Parse (curDevfile .Ctx .GetURL ())
206
+ if err != nil {
207
+ return DevfileObj {}, err
208
+ }
209
+ u .Path = path .Join (u .Path , uri )
210
+ jointURL := u .String ()
211
+ return ParseFromURL (jointURL )
212
+ }
213
+
214
+ return DevfileObj {}, fmt .Errorf ("fail to parse from uri: %s" , uri )
215
+ }
0 commit comments