~ruther/guix-local

e46bb5fd5af3adb931e0930326c60a7c2e4cbe4e — Maxim Cournoyer 3 years ago 68d79a8
guix-install.sh: Restore compatibility with "yes" invocation.

Commit 6a2e303d3a had modified prompt_yes_no to only read a single character,
aiming to ease the user experience.  This was, in retrospect, a bad idea, as
it makes user input error more likely and introduces complexity.

This commit reverts to line-oriented input, while preserving the default yes
value so that a user can simply hit 'Enter' at the prompt in place of typing
"yes".

* etc/guix-install.sh (_flush): Delete function.
(prompt_yes_no): Restore line-oriented read.  Remove loop.  Make anything else
than yes means no.  Use Bash features to streamline definition.

Reported-by: Lars-Dominik Braun <lars@6xq.net> and others.
1 files changed, 6 insertions(+), 19 deletions(-)

M etc/guix-install.sh
M etc/guix-install.sh => etc/guix-install.sh +6 -19
@@ 92,33 92,20 @@ _debug()
    fi
}

_flush()
{
    while read -t0; do
        read -N1
    done
}

die()
{
    _err "${ERR}$*"
    exit 1
}

# Return true if user answered yes, false otherwise.  It defaults to "yes"
# when a single newline character is input.
# Return true if user answered yes, false otherwise.  The prompt is
# yes-biased, that is, when the user simply enter newline, it is equivalent to
# answering "yes".
# $1: The prompt question.
prompt_yes_no() {
    while true; do
        _flush
        read -N1 -rsp "$1 [Y/n]" yn
        case $yn in
            $'\n') echo && return 0;;
            [Yy]*) echo && return 0;;
            [Nn]*) echo && return 1;;
            *) echo && _msg "Please answer yes or no."
        esac
    done
    local -l yn
    read -rp "$1 [Y/n]" yn
    [[ ! $yn || $yn = y || $yn = yes ]] || return 1
}

chk_require()