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
}