forgejo/services/actions/job_parser.go
Earl Warren 6bc1803c70
fix: de-duplicate Forgejo Actions job names when needed
The status of two jobs by the same name shadow each other, they need
to be distinct. If two jobs by the same name are found, they are made
distinct by adding a -<occurence number> suffix.

Resolves forgejo/forgejo#8648
2025-08-12 15:47:10 +02:00

31 lines
997 B
Go

// Copyright 2025 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: GPL-3.0-or-later
package actions
import (
"fmt"
"code.forgejo.org/forgejo/runner/v9/act/jobparser"
)
func jobParser(workflow []byte, options ...jobparser.ParseOption) ([]*jobparser.SingleWorkflow, error) {
singleWorkflows, err := jobparser.Parse(workflow, false, options...)
if err != nil {
return nil, err
}
nameToSingleWorkflows := make(map[string][]*jobparser.SingleWorkflow, len(singleWorkflows))
duplicates := make(map[string]int, len(singleWorkflows))
for _, singleWorkflow := range singleWorkflows {
id, job := singleWorkflow.Job()
nameToSingleWorkflows[job.Name] = append(nameToSingleWorkflows[job.Name], singleWorkflow)
if len(nameToSingleWorkflows[job.Name]) > 1 {
duplicates[job.Name]++
job.Name = fmt.Sprintf("%s-%d", job.Name, duplicates[job.Name])
if err := singleWorkflow.SetJob(id, job); err != nil {
return nil, err
}
}
}
return singleWorkflows, nil
}