in pkg/apis/camel/v1/build_types_support.go [284:363]
func (bl *BuildList) HasMatchingBuild(build *Build) (bool, *Build) {
required := build.BuilderDependencies()
if len(required) == 0 {
return false, nil
}
requiredMap := make(map[string]int, len(required))
for i, item := range required {
requiredMap[item] = i
}
runtimeVersion := build.RuntimeVersion()
var bestBuild Build
bestBuildCommonDependencies := 0
buildLoop:
for i := range bl.Items {
b := bl.Items[i]
if b.Name == build.Name || b.Status.IsFinished() {
continue
}
bRuntimeVersion := b.RuntimeVersion()
if *runtimeVersion != *bRuntimeVersion {
continue
}
dependencies := b.BuilderDependencies()
dependencyMap := make(map[string]int, len(dependencies))
for i, item := range dependencies {
dependencyMap[item] = i
}
// check if this build has any extra dependency. If it does, we can't use it
for _, item := range dependencies {
if _, ok := requiredMap[item]; !ok {
continue buildLoop
}
}
// now check how many common dependencies this build has
missing := 0
commonDependencies := 0
for _, item := range required {
if _, ok := dependencyMap[item]; !ok {
missing++
} else {
commonDependencies++
}
}
if commonDependencies == 0 {
// no common dependencies
continue
}
switch b.Status.Phase {
case BuildPhasePending, BuildPhaseRunning:
// handle suitable build that has started already
return true, &b
case BuildPhaseInitialization, BuildPhaseScheduling:
// handle suitable scheduled build
if missing == 0 {
// seems like both builds require exactly the same list of dependencies
// additionally check for the creation timestamp
if compareBuilds(&b, build) < 0 {
return true, &b
}
} else if commonDependencies > bestBuildCommonDependencies {
bestBuildCommonDependencies = commonDependencies
bestBuild = b
continue
}
}
}
if bestBuildCommonDependencies > 0 {
return true, &bestBuild
}
return false, nil
}