func WaitForStackToSettle()

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)
	}
}