func chooseStateOutputsToMerge()

in cmd/hub/state/merge.go [63:133]


func chooseStateOutputsToMerge(state *StateManifest, componentName string, order []string,
	isDeploy bool) ([]parameters.CapturedOutput, time.Time) {

	outputsToMerge := state.CapturedOutputs
	mergedTimestamp := state.Timestamp

	componentStateName := ""
	componentStateExist := false
	var componentState *StateStep
	if state.Components != nil {
		if componentName == "" && len(outputsToMerge) == 0 {
			componentName = order[len(order)-1] // if global state is empty then start search with the last component
		}

		if componentName != "" {
			found := -1
			for i, name := range order {
				if componentName == name {
					found = i
					break
				}
			}
			if isDeploy {
				if found == 0 {
					// first component is a special case
					outputsToMerge = nil
				}
				found--
			}
			for found >= 0 {
				componentStateName = order[found]
				st, exist := state.Components[componentStateName]
				if exist && len(st.CapturedOutputs) > 0 {
					break
				}
				found--
			}
			if found < 0 {
				componentStateName = ""
			}
		}

		if componentStateName != "" {
			componentState, componentStateExist = state.Components[componentStateName]
		}
	}

	if componentStateExist {
		outputsToMerge = componentState.CapturedOutputs
		mergedTimestamp = componentState.Timestamp
		if config.Verbose {
			log.Printf("Loading state after component `%s` deployment", componentStateName)
		}
	} else {
		if config.Verbose && outputsToMerge != nil {
			log.Print("Loading global state")
		}
	}

	if len(outputsToMerge) == 0 && config.Verbose && outputsToMerge != nil {
		label := "Global"
		hint := ""
		if componentStateExist {
			label = fmt.Sprintf("Component `%s`", componentStateName)
			hint = " (try --load-global-state / -g)"
		}
		log.Printf("%s outputs state is empty%s ", label, hint)
	}

	return outputsToMerge, mergedTimestamp
}