in internal/ui/stack.go [202:265]
func WaitForStackToSettle(stackName string) (string, []string) {
// Start the timer
spinner.StartTimer("")
stackID := stackName
collectedMessages := make(map[string]bool)
out := strings.Builder{}
outStr := ""
lastOutput := ""
for {
out.Reset()
stack, err := cfn.GetStack(stackID)
if err != nil {
panic(Errorf(err, "operation failed"))
}
// Refresh the stack ID so we can deal with deleted stacks ok
stackID = ptr.ToString(stack.StackId)
output, messages := GetStackOutput(stack)
// Send the output first
out.WriteString(output)
out.WriteString("\n")
if len(messages) > 0 {
out.WriteString(console.Yellow("Messages:\n"))
for _, message := range messages {
collectedMessages[message] = true
out.WriteString(fmt.Sprintf(" - %s\n", message))
}
}
outStr = out.String()
spinner.Pause()
console.ClearLines(console.CountLines(lastOutput))
if console.IsTTY {
fmt.Print(outStr)
}
lastOutput = outStr
spinner.Resume()
// Check to see if we've finished
if StackHasSettled(stack) {
spinner.StopTimer()
console.ClearLines(console.CountLines(lastOutput))
messages := make([]string, 0)
for message := range collectedMessages {
messages = append(messages, message)
}
return string(stack.StackStatus), messages
}
time.Sleep(time.Second * 2)
}
}