2026-06-05 01:29:07 +02:00
|
|
|
package linter
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
|
2026-06-10 22:40:42 +02:00
|
|
|
"git.k3nny.fr/glint/internal/model"
|
2026-06-05 01:29:07 +02:00
|
|
|
)
|
|
|
|
|
|
2026-06-25 00:25:09 +02:00
|
|
|
func checkDependencies(p *model.Pipeline, skipped map[string]bool) []Finding {
|
2026-06-05 01:29:07 +02:00
|
|
|
stageIndex := make(map[string]int, len(p.Stages))
|
|
|
|
|
for i, s := range p.Stages {
|
|
|
|
|
stageIndex[s] = i
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var findings []Finding
|
|
|
|
|
for name, job := range p.Jobs {
|
2026-06-25 00:25:09 +02:00
|
|
|
if skipped[name] {
|
|
|
|
|
continue
|
|
|
|
|
}
|
2026-06-05 01:29:07 +02:00
|
|
|
if len(job.Dependencies) == 0 {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
jobStageIdx, jobHasStage := stageIndex[job.Stage]
|
|
|
|
|
for _, dep := range job.Dependencies {
|
|
|
|
|
depJob, exists := p.Jobs[dep]
|
|
|
|
|
if !exists {
|
|
|
|
|
findings = append(findings, Finding{
|
|
|
|
|
Severity: Error,
|
2026-06-11 22:56:24 +02:00
|
|
|
Rule: RuleUnknownDependency,
|
2026-06-05 01:29:07 +02:00
|
|
|
Job: name,
|
2026-06-11 21:24:18 +02:00
|
|
|
File: job.File,
|
|
|
|
|
Line: job.Line,
|
2026-06-05 01:29:07 +02:00
|
|
|
Message: fmt.Sprintf("'dependencies' references unknown job %q", dep),
|
|
|
|
|
})
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if len(p.Stages) > 0 && jobHasStage && depJob.Stage != "" {
|
|
|
|
|
depIdx, depHasStage := stageIndex[depJob.Stage]
|
|
|
|
|
if depHasStage && depIdx >= jobStageIdx {
|
|
|
|
|
findings = append(findings, Finding{
|
|
|
|
|
Severity: Error,
|
2026-06-11 22:56:24 +02:00
|
|
|
Rule: RuleDependencyStage,
|
2026-06-05 01:29:07 +02:00
|
|
|
Job: name,
|
2026-06-11 21:24:18 +02:00
|
|
|
File: job.File,
|
|
|
|
|
Line: job.Line,
|
2026-06-05 01:29:07 +02:00
|
|
|
Message: fmt.Sprintf("'dependencies' job %q must be in an earlier stage (in %q, current job is in %q)", dep, depJob.Stage, job.Stage),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return findings
|
|
|
|
|
}
|