fix: Remove line length limit on MacOS for input prompts (#839)

This caused inputs to be truncated on MacOS terminals.
This commit is contained in:
Kyle Carberry 2022-04-03 13:09:55 -05:00 committed by GitHub
parent 2a7ab08bab
commit ccba2ba99d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 0 deletions

31
cli/cliui/cliui_darwin.go Normal file
View File

@ -0,0 +1,31 @@
//go:build darwin
// +build darwin
package cliui
import (
"golang.org/x/sys/unix"
"golang.org/x/xerrors"
)
func removeLineLengthLimit(inputFD int) (func(), error) {
termios, err := unix.IoctlGetTermios(inputFD, unix.TIOCGETA)
if err != nil {
return nil, xerrors.Errorf("get termios: %w", err)
}
newState := *termios
// MacOS has a default line limit of 1024. See:
// https://unix.stackexchange.com/questions/204815/terminal-does-not-accept-pasted-or-typed-lines-of-more-than-1024-characters
//
// This removes canonical input processing, so deletes will not function
// as expected. This _seems_ fine for most use-cases, but is unfortunate.
newState.Lflag &^= unix.ICANON
err = unix.IoctlSetTermios(inputFD, unix.TIOCSETA, &newState)
if err != nil {
return nil, xerrors.Errorf("set termios: %w", err)
}
return func() {
_ = unix.IoctlSetTermios(inputFD, unix.TIOCSETA, termios)
}, nil
}

10
cli/cliui/cliui_other.go Normal file
View File

@ -0,0 +1,10 @@
//go:build !darwin
// +build !darwin
package cliui
import "golang.org/x/xerrors"
func removeLineLengthLimit(_ int) (func(), error) {
return nil, xerrors.New("not implemented")
}

View File

@ -8,6 +8,7 @@ import (
"io"
"os"
"os/signal"
"runtime"
"strings"
"github.com/bgentry/speakeasy"
@ -42,10 +43,21 @@ func Prompt(cmd *cobra.Command, opts PromptOptions) (string, error) {
go func() {
var line string
var err error
inFile, valid := cmd.InOrStdin().(*os.File)
if opts.Secret && valid && isatty.IsTerminal(inFile.Fd()) {
line, err = speakeasy.Ask("")
} else {
if runtime.GOOS == "darwin" && valid {
var restore func()
restore, err = removeLineLengthLimit(int(inFile.Fd()))
if err != nil {
errCh <- err
return
}
defer restore()
}
reader := bufio.NewReader(cmd.InOrStdin())
line, err = reader.ReadString('\n')