@@ -102,7 +102,7 @@ func (doc *YamlDocument) buildJobsDAG(jobRefs []ast.JobRef) map[string][]string
102
102
res := make (map [string ][]string )
103
103
for _ , jobRef := range jobRefs {
104
104
for _ , requirement := range jobRef .Requires {
105
- res [requirement .Text ] = append (res [requirement .Text ], jobRef .StepName )
105
+ res [requirement .Name ] = append (res [requirement .Name ], jobRef .StepName )
106
106
}
107
107
}
108
108
return res
@@ -246,12 +246,70 @@ func (doc *YamlDocument) parseContext(node *sitter.Node) []ast.TextAndRange {
246
246
return doc .getNodeTextArrayWithRange (node )
247
247
}
248
248
249
- func (doc * YamlDocument ) parseSingleJobRequires (node * sitter.Node ) []ast.TextAndRange {
250
- array := doc .getNodeTextArrayWithRange (node )
251
- res := []ast.TextAndRange {}
252
- for _ , require := range array {
253
- res = append (res , ast.TextAndRange {Text : require .Text , Range : require .Range })
249
+ func (doc * YamlDocument ) parseSingleJobRequires (requiresNode * sitter.Node ) []ast.Require {
250
+ blockSequenceNode := GetChildSequence (requiresNode )
251
+ res := make ([]ast.Require , 0 , requiresNode .ChildCount ())
252
+
253
+ if blockSequenceNode == nil {
254
+ return res
254
255
}
256
+
257
+ iterateOnBlockSequence (blockSequenceNode , func (requiresItemNode * sitter.Node ) {
258
+ getRequire := func (node * sitter.Node ) ast.Require {
259
+ defaultStatus := []string {"success" }
260
+ if alias := GetChildOfType (node , "alias" ); alias != nil {
261
+ anchor , ok := doc .YamlAnchors [strings .TrimLeft (doc .GetNodeText (alias ), "*" )]
262
+ if ! ok {
263
+ return ast.Require {Name : "" }
264
+ }
265
+ anchorValueNode := GetFirstChild (anchor .ValueNode )
266
+ text := doc .GetNodeText (anchorValueNode )
267
+ return ast.Require {Name : text , Status : defaultStatus , Range : doc .NodeToRange (anchorValueNode )}
268
+ } else {
269
+ return ast.Require {Name : doc .GetNodeText (node ), Status : defaultStatus , Range : doc .NodeToRange (node )}
270
+ }
271
+ }
272
+
273
+ // If blockSequenceNode is a flow_sequence, then requiresItemNode is directly a flow_node
274
+ if requiresItemNode .Type () == "flow_node" {
275
+ res = append (res , getRequire (requiresItemNode ))
276
+ } else {
277
+ // But if blockSequenceNode is a block_sequence, then requiresItemNode is a block_sequence_item
278
+ // The first child of requiresItemNode is the hyphen node, the second child is what we need
279
+ element := requiresItemNode .Child (1 )
280
+ // If the second child is a flow_node, then it is a simple require
281
+ if element != nil && element .Type () == "flow_node" {
282
+ res = append (res , getRequire (element ))
283
+ } else {
284
+ // Otherwise the second child is a block_mapping, then it is a require with status
285
+ blockMappingNode := GetChildOfType (element , "block_mapping" )
286
+ blockMappingPair := GetChildOfType (blockMappingNode , "block_mapping_pair" )
287
+ key , value := doc .GetKeyValueNodes (blockMappingPair )
288
+
289
+ if key == nil || value == nil {
290
+ return
291
+ }
292
+ if GetFirstChild (value ).Type () == "plain_scalar" {
293
+ status := make ([]string , 1 )
294
+ status [0 ] = doc .GetNodeText (value )
295
+ res = append (res , ast.Require {Name : doc .GetNodeText (key ), Status : status , Range : doc .NodeToRange (key )})
296
+ } else {
297
+ statusesNode := GetFirstChild (value )
298
+ status := make ([]string , 0 , statusesNode .ChildCount ())
299
+ iterateOnBlockSequence (statusesNode , func (statusItemNode * sitter.Node ) {
300
+ if statusItemNode .Type () == "flow_node" {
301
+ status = append (status , doc .GetNodeText (statusItemNode ))
302
+ }
303
+ if statusItemNode .Type () == "block_sequence_item" {
304
+ status = append (status , doc .GetNodeText (statusItemNode .Child (1 )))
305
+ }
306
+ })
307
+ res = append (res , ast.Require {Name : doc .GetNodeText (key ), Status : status , Range : doc .NodeToRange (key )})
308
+ }
309
+ }
310
+ }
311
+ })
312
+
255
313
return res
256
314
}
257
315
0 commit comments