func()

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
}