diff --git a/cli/cliui/cliui_darwin.go b/cli/cliui/cliui_darwin.go new file mode 100644 index 0000000000000..0fd9a57f61729 --- /dev/null +++ b/cli/cliui/cliui_darwin.go @@ -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 +} diff --git a/cli/cliui/cliui_other.go b/cli/cliui/cliui_other.go new file mode 100644 index 0000000000000..a9c10a1df4f6b --- /dev/null +++ b/cli/cliui/cliui_other.go @@ -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") +} diff --git a/cli/cliui/prompt.go b/cli/cliui/prompt.go index 951ceef02cb84..82aa2a07cbffe 100644 --- a/cli/cliui/prompt.go +++ b/cli/cliui/prompt.go @@ -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')