AlecAivazis / survey

A golang library for building interactive and accessible prompts with full support for windows and posix terminals.
MIT License
4.08k stars 351 forks source link

Asking the same set of questions multiple times corrupts the output #270

Open stoggi opened 4 years ago

stoggi commented 4 years ago

When asking multiple surveys but with the same question, the output is corrupted for the second survey. The cursor begins on the same line, and overwrites the previous question each time.

Environments Tested

OS: MacOS, Linux Terminal: iTerm2, xfce4-terminal Shell: bash, zsh, elvish Versions:

Example

package main

import (
    "fmt"

    "github.com/AlecAivazis/survey/v2"
)

type Answers struct {
    Name    string
    Age     int
    Hobbies string
}

var questions = []*survey.Question{
    {
        Name:     "Name",
        Prompt:   &survey.Input{Message: "What's your name?"},
        Validate: survey.Required,
    },
    {
        Name:     "Age",
        Prompt:   &survey.Input{Message: "How old are you?"},
        Validate: survey.Required,
    },
    {
        Name:     "Hobbies",
        Prompt:   &survey.Input{Message: "What are your hobbies?"},
        Validate: survey.Required,
    },
}

func main() {
    a1 := Answers{}
    if err := survey.Ask(questions, &a1); err != nil {
        panic(err)
    }
    a2 := Answers{}
    if err := survey.Ask(questions, &a2); err != nil {
        panic(err)
    }
    fmt.Println(a1, a2)
}

Observed output: survey

What was I expecting to see?

The second survey should appear like the first, instead newlines seem to get lost, and it overwrites the same line for each question.

stoggi commented 4 years ago

After a little more digging, it seems this is because I'm asking the same questions multiple times!

This code is not affected:

package main

import (
    "fmt"

    "github.com/AlecAivazis/survey/v2"
)

type Answers struct {
    Name    string
    Age     int
    Hobbies string
}

var questions1 = []*survey.Question{
    {
        Name:     "Name",
        Prompt:   &survey.Input{Message: "What's your name?"},
        Validate: survey.Required,
    },
    {
        Name:     "Age",
        Prompt:   &survey.Input{Message: "How old are you?"},
        Validate: survey.Required,
    },
    {
        Name:     "Hobbies",
        Prompt:   &survey.Input{Message: "What are your hobbies?"},
        Validate: survey.Required,
    },
}

var questions2 = []*survey.Question{
    {
        Name:     "Name",
        Prompt:   &survey.Input{Message: "What's your name?"},
        Validate: survey.Required,
    },
    {
        Name:     "Age",
        Prompt:   &survey.Input{Message: "How old are you?"},
        Validate: survey.Required,
    },
    {
        Name:     "Hobbies",
        Prompt:   &survey.Input{Message: "What are your hobbies?"},
        Validate: survey.Required,
    },
}

func main() {
    a1 := Answers{}
    if err := survey.Ask(questions1, &a1); err != nil {
        panic(err)
    }
    a2 := Answers{}
    if err := survey.Ask(questions2, &a2); err != nil {
        panic(err)
    }
    fmt.Println(a1, a2)
}

This feels like some internal state is not being cleared.

mislav commented 2 years ago

@stoggi Excellent sleuthing! It looks like some state is being remembered between these prompts that results in extra lines of output being overwritten.

li-jin-gou commented 1 year ago

I had the same problem.