From 863ba76494e1aac6ae6fe3685544a36afcdd411d Mon Sep 17 00:00:00 2001 From: greatroar <@> Date: Sat, 29 Feb 2020 15:46:51 +0100 Subject: [PATCH 1/4] Drop mattn/go-isatty in favor of crypto/ssh/terminal --- go.mod | 1 - go.sum | 3 - internal/ui/termstatus/terminal_unix.go | 5 +- vendor/github.com/mattn/go-isatty/.travis.yml | 13 --- vendor/github.com/mattn/go-isatty/LICENSE | 9 -- vendor/github.com/mattn/go-isatty/README.md | 50 ---------- vendor/github.com/mattn/go-isatty/doc.go | 2 - vendor/github.com/mattn/go-isatty/go.mod | 3 - vendor/github.com/mattn/go-isatty/go.sum | 2 - .../mattn/go-isatty/isatty_android.go | 23 ----- .../github.com/mattn/go-isatty/isatty_bsd.go | 24 ----- .../mattn/go-isatty/isatty_linux.go | 19 ---- .../mattn/go-isatty/isatty_others.go | 15 --- .../mattn/go-isatty/isatty_solaris.go | 22 ----- .../mattn/go-isatty/isatty_windows.go | 94 ------------------- vendor/modules.txt | 2 - 16 files changed, 2 insertions(+), 285 deletions(-) delete mode 100644 vendor/github.com/mattn/go-isatty/.travis.yml delete mode 100644 vendor/github.com/mattn/go-isatty/LICENSE delete mode 100644 vendor/github.com/mattn/go-isatty/README.md delete mode 100644 vendor/github.com/mattn/go-isatty/doc.go delete mode 100644 vendor/github.com/mattn/go-isatty/go.mod delete mode 100644 vendor/github.com/mattn/go-isatty/go.sum delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_android.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_linux.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go diff --git a/go.mod b/go.mod index d404a5f4f..d5236b17d 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,6 @@ require ( github.com/kr/pretty v0.1.0 // indirect github.com/kurin/blazer v0.5.3 github.com/marstr/guid v1.1.0 // indirect - github.com/mattn/go-isatty v0.0.7 github.com/minio/minio-go/v6 v6.0.43 github.com/ncw/swift v1.0.47 github.com/pkg/errors v0.8.1 diff --git a/go.sum b/go.sum index 7d18ef20c..65c9132b5 100644 --- a/go.sum +++ b/go.sum @@ -100,8 +100,6 @@ github.com/kurin/blazer v0.5.3 h1:SAgYv0TKU0kN/ETfO5ExjNAPyMt2FocO2s/UlCHfjAk= github.com/kurin/blazer v0.5.3/go.mod h1:4FCXMUWo9DllR2Do4TtBd377ezyAJ51vB5uTBjt0pGU= github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/minio/minio-go/v6 v6.0.43 h1:D7c6Kx0ZB5U8EXJ6SQVOqPzapaLK/qpxQIktCnPHp/o= github.com/minio/minio-go/v6 v6.0.43/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= @@ -205,7 +203,6 @@ golang.org/x/sys v0.0.0-20181021155630-eda9bb28ed51/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/internal/ui/termstatus/terminal_unix.go b/internal/ui/termstatus/terminal_unix.go index d82c032d9..b438aa954 100644 --- a/internal/ui/termstatus/terminal_unix.go +++ b/internal/ui/termstatus/terminal_unix.go @@ -6,9 +6,8 @@ import ( "io" "os" + "golang.org/x/crypto/ssh/terminal" "golang.org/x/sys/unix" - - isatty "github.com/mattn/go-isatty" ) // clearCurrentLine removes all characters from the current line and resets the @@ -25,7 +24,7 @@ func moveCursorUp(wr io.Writer, fd uintptr) func(io.Writer, uintptr, int) { // canUpdateStatus returns true if status lines can be printed, the process // output is not redirected to a file or pipe. func canUpdateStatus(fd uintptr) bool { - if !isatty.IsTerminal(fd) { + if !terminal.IsTerminal(fd) { return false } term := os.Getenv("TERM") diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/mattn/go-isatty/.travis.yml deleted file mode 100644 index 5597e026d..000000000 --- a/vendor/github.com/mattn/go-isatty/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go -go: - - tip - -os: - - linux - - osx - -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 diff --git a/vendor/github.com/mattn/go-isatty/LICENSE b/vendor/github.com/mattn/go-isatty/LICENSE deleted file mode 100644 index 65dc692b6..000000000 --- a/vendor/github.com/mattn/go-isatty/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) Yasuhiro MATSUMOTO - -MIT License (Expat) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md deleted file mode 100644 index 1e69004bb..000000000 --- a/vendor/github.com/mattn/go-isatty/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# go-isatty - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) - -isatty for golang - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/mattn/go-isatty" - "os" -) - -func main() { - if isatty.IsTerminal(os.Stdout.Fd()) { - fmt.Println("Is Terminal") - } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { - fmt.Println("Is Cygwin/MSYS2 Terminal") - } else { - fmt.Println("Is Not Terminal") - } -} -``` - -## Installation - -``` -$ go get github.com/mattn/go-isatty -``` - -## License - -MIT - -## Author - -Yasuhiro Matsumoto (a.k.a mattn) - -## Thanks - -* k-takata: base idea for IsCygwinTerminal - - https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-isatty/doc.go b/vendor/github.com/mattn/go-isatty/doc.go deleted file mode 100644 index 17d4f90eb..000000000 --- a/vendor/github.com/mattn/go-isatty/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package isatty implements interface to isatty -package isatty diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod deleted file mode 100644 index f310320c3..000000000 --- a/vendor/github.com/mattn/go-isatty/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/mattn/go-isatty - -require golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum deleted file mode 100644 index 426c8973c..000000000 --- a/vendor/github.com/mattn/go-isatty/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/mattn/go-isatty/isatty_android.go b/vendor/github.com/mattn/go-isatty/isatty_android.go deleted file mode 100644 index d3567cb5b..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_android.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build android - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go deleted file mode 100644 index 07e93039d..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build darwin freebsd openbsd netbsd dragonfly -// +build !appengine - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TIOCGETA - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux.go b/vendor/github.com/mattn/go-isatty/isatty_linux.go deleted file mode 100644 index 4f8af4652..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_linux.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build linux -// +build !appengine -// +build !android - -package isatty - -import "golang.org/x/sys/unix" - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - _, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go deleted file mode 100644 index f02849c56..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build appengine js - -package isatty - -// IsTerminal returns true if the file descriptor is terminal which -// is always false on js and appengine classic which is a sandboxed PaaS. -func IsTerminal(fd uintptr) bool { - return false -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/mattn/go-isatty/isatty_solaris.go deleted file mode 100644 index bdd5c79a0..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_solaris.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build solaris -// +build !appengine - -package isatty - -import ( - "golang.org/x/sys/unix" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c -func IsTerminal(fd uintptr) bool { - var termio unix.Termio - err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go deleted file mode 100644 index af51cbcaa..000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_windows.go +++ /dev/null @@ -1,94 +0,0 @@ -// +build windows -// +build !appengine - -package isatty - -import ( - "strings" - "syscall" - "unicode/utf16" - "unsafe" -) - -const ( - fileNameInfo uintptr = 2 - fileTypePipe = 3 -) - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") - procGetFileType = kernel32.NewProc("GetFileType") -) - -func init() { - // Check if GetFileInformationByHandleEx is available. - if procGetFileInformationByHandleEx.Find() != nil { - procGetFileInformationByHandleEx = nil - } -} - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -} - -// Check pipe name is used for cygwin/msys2 pty. -// Cygwin/MSYS2 PTY has a name like: -// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master -func isCygwinPipeName(name string) bool { - token := strings.Split(name, "-") - if len(token) < 5 { - return false - } - - if token[0] != `\msys` && token[0] != `\cygwin` { - return false - } - - if token[1] == "" { - return false - } - - if !strings.HasPrefix(token[2], "pty") { - return false - } - - if token[3] != `from` && token[3] != `to` { - return false - } - - if token[4] != "master" { - return false - } - - return true -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. -func IsCygwinTerminal(fd uintptr) bool { - if procGetFileInformationByHandleEx == nil { - return false - } - - // Cygwin/msys's pty is a pipe. - ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) - if ft != fileTypePipe || e != 0 { - return false - } - - var buf [2 + syscall.MAX_PATH]uint16 - r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), - 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), - uintptr(len(buf)*2), 0, 0) - if r == 0 || e != 0 { - return false - } - - l := *(*uint32)(unsafe.Pointer(&buf)) - return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) -} diff --git a/vendor/modules.txt b/vendor/modules.txt index e663bbe7a..d923e1fcf 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -57,8 +57,6 @@ github.com/kurin/blazer/internal/blog github.com/kurin/blazer/x/window # github.com/marstr/guid v1.1.0 github.com/marstr/guid -# github.com/mattn/go-isatty v0.0.7 -github.com/mattn/go-isatty # github.com/minio/minio-go/v6 v6.0.43 github.com/minio/minio-go/v6 github.com/minio/minio-go/v6/pkg/credentials From c8a672fa2903d560a74c5bd68a4137f2e8d5741b Mon Sep 17 00:00:00 2001 From: greatroar <@> Date: Sat, 29 Feb 2020 15:56:26 +0100 Subject: [PATCH 2/4] Remove code copy-pasted from x/crypto/ssh/terminal --- internal/ui/termstatus/status.go | 4 +++- internal/ui/termstatus/terminal_unix.go | 13 +------------ internal/ui/termstatus/terminal_windows.go | 18 +++--------------- 3 files changed, 7 insertions(+), 28 deletions(-) diff --git a/internal/ui/termstatus/status.go b/internal/ui/termstatus/status.go index d997d6bb1..b15a881e5 100644 --- a/internal/ui/termstatus/status.go +++ b/internal/ui/termstatus/status.go @@ -8,6 +8,8 @@ import ( "io" "os" "strings" + + "golang.org/x/crypto/ssh/terminal" ) // Terminal is used to write messages and display status lines which can be @@ -310,7 +312,7 @@ func (t *Terminal) SetStatus(lines []string) { return } - width, _, err := getTermSize(t.fd) + width, _, err := terminal.GetSize(int(t.fd)) if err != nil || width <= 0 { // use 80 columns by default width = 80 diff --git a/internal/ui/termstatus/terminal_unix.go b/internal/ui/termstatus/terminal_unix.go index b438aa954..3f0061c01 100644 --- a/internal/ui/termstatus/terminal_unix.go +++ b/internal/ui/termstatus/terminal_unix.go @@ -7,7 +7,6 @@ import ( "os" "golang.org/x/crypto/ssh/terminal" - "golang.org/x/sys/unix" ) // clearCurrentLine removes all characters from the current line and resets the @@ -24,7 +23,7 @@ func moveCursorUp(wr io.Writer, fd uintptr) func(io.Writer, uintptr, int) { // canUpdateStatus returns true if status lines can be printed, the process // output is not redirected to a file or pipe. func canUpdateStatus(fd uintptr) bool { - if !terminal.IsTerminal(fd) { + if !terminal.IsTerminal(int(fd)) { return false } term := os.Getenv("TERM") @@ -34,13 +33,3 @@ func canUpdateStatus(fd uintptr) bool { // TODO actually read termcap db and detect if terminal supports what we need return term != "dumb" } - -// getTermSize returns the dimensions of the given terminal. -// the code is taken from "golang.org/x/crypto/ssh/terminal" -func getTermSize(fd uintptr) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) - if err != nil { - return -1, -1, err - } - return int(ws.Col), int(ws.Row), nil -} diff --git a/internal/ui/termstatus/terminal_windows.go b/internal/ui/termstatus/terminal_windows.go index 5a46169c9..6ef87bf51 100644 --- a/internal/ui/termstatus/terminal_windows.go +++ b/internal/ui/termstatus/terminal_windows.go @@ -6,6 +6,8 @@ import ( "io" "syscall" "unsafe" + + "golang.org/x/crypto/ssh/terminal" ) // clearCurrentLine removes all characters from the current line and resets the @@ -50,7 +52,6 @@ var ( procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") procGetFileType = kernel32.NewProc("GetFileType") ) @@ -106,22 +107,9 @@ func windowsMoveCursorUp(wr io.Writer, fd uintptr, n int) { procSetConsoleCursorPosition.Call(fd, uintptr(*(*int32)(unsafe.Pointer(&info.cursorPosition)))) } -// getTermSize returns the dimensions of the given terminal. -// the code is taken from "golang.org/x/crypto/ssh/terminal" -func getTermSize(fd uintptr) (width, height int, err error) { - var info consoleScreenBufferInfo - _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, fd, uintptr(unsafe.Pointer(&info)), 0) - if e != 0 { - return 0, 0, error(e) - } - return int(info.size.x), int(info.size.y), nil -} - // isWindowsTerminal return true if the file descriptor is a windows terminal (cmd, psh). func isWindowsTerminal(fd uintptr) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 + return terminal.IsTerminal(int(fd)) } const fileTypePipe = 0x0003 From 7447c44484515fc32f5b7675375bd066934c4917 Mon Sep 17 00:00:00 2001 From: greatroar <@> Date: Sat, 29 Feb 2020 17:22:38 +0100 Subject: [PATCH 3/4] Use golang.org/x/sys/windows in termstatus Some functionality is missing, but at least the types are all defined. Replaced short, word, dword by their Go names to match the x/sys convention. --- internal/ui/termstatus/terminal_windows.go | 72 ++++++---------------- 1 file changed, 20 insertions(+), 52 deletions(-) diff --git a/internal/ui/termstatus/terminal_windows.go b/internal/ui/termstatus/terminal_windows.go index 6ef87bf51..fbd099497 100644 --- a/internal/ui/termstatus/terminal_windows.go +++ b/internal/ui/termstatus/terminal_windows.go @@ -8,6 +8,7 @@ import ( "unsafe" "golang.org/x/crypto/ssh/terminal" + "golang.org/x/sys/windows" ) // clearCurrentLine removes all characters from the current line and resets the @@ -19,7 +20,7 @@ func clearCurrentLine(wr io.Writer, fd uintptr) func(io.Writer, uintptr) { } // check if the output file type is a pipe (0x0003) - if getFileType(fd) != fileTypePipe { + if isPipe(fd) { // return empty func, update state is not possible on this terminal return func(io.Writer, uintptr) {} } @@ -36,7 +37,7 @@ func moveCursorUp(wr io.Writer, fd uintptr) func(io.Writer, uintptr, int) { } // check if the output file type is a pipe (0x0003) - if getFileType(fd) != fileTypePipe { + if isPipe(fd) { // return empty func, update state is not possible on this terminal return func(io.Writer, uintptr, int) {} } @@ -48,63 +49,37 @@ func moveCursorUp(wr io.Writer, fd uintptr) func(io.Writer, uintptr, int) { var kernel32 = syscall.NewLazyDLL("kernel32.dll") var ( - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") - procGetFileType = kernel32.NewProc("GetFileType") -) - -type ( - short int16 - word uint16 - dword uint32 - - coord struct { - x short - y short - } - smallRect struct { - left short - top short - right short - bottom short - } - consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes word - window smallRect - maximumWindowSize coord - } ) // windowsClearCurrentLine removes all characters from the current line and // resets the cursor position to the first column. func windowsClearCurrentLine(wr io.Writer, fd uintptr) { - var info consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(fd, uintptr(unsafe.Pointer(&info))) + var info windows.ConsoleScreenBufferInfo + windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info) // clear the line - cursor := coord{ - x: info.window.left, - y: info.cursorPosition.y, + cursor := windows.Coord{ + X: info.Window.Left, + Y: info.CursorPosition.Y, } - var count, w dword - count = dword(info.size.x) - procFillConsoleOutputAttribute.Call(fd, uintptr(info.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&w))) + var count, w uint32 + count = uint32(info.Size.X) + procFillConsoleOutputAttribute.Call(fd, uintptr(info.Attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&w))) procFillConsoleOutputCharacter.Call(fd, uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&w))) } // windowsMoveCursorUp moves the cursor to the line n lines above the current one. func windowsMoveCursorUp(wr io.Writer, fd uintptr, n int) { - var info consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(fd, uintptr(unsafe.Pointer(&info))) + var info windows.ConsoleScreenBufferInfo + windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info) // move cursor up by n lines and to the first column - info.cursorPosition.y -= short(n) - info.cursorPosition.x = 0 - procSetConsoleCursorPosition.Call(fd, uintptr(*(*int32)(unsafe.Pointer(&info.cursorPosition)))) + info.CursorPosition.Y -= int16(n) + info.CursorPosition.X = 0 + procSetConsoleCursorPosition.Call(fd, uintptr(*(*int32)(unsafe.Pointer(&info.CursorPosition)))) } // isWindowsTerminal return true if the file descriptor is a windows terminal (cmd, psh). @@ -112,16 +87,9 @@ func isWindowsTerminal(fd uintptr) bool { return terminal.IsTerminal(int(fd)) } -const fileTypePipe = 0x0003 - -// getFileType returns the file type for the given fd. -// https://msdn.microsoft.com/de-de/library/windows/desktop/aa364960(v=vs.85).aspx -func getFileType(fd uintptr) int { - r, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) - if e != 0 { - return 0 - } - return int(r) +func isPipe(fd uintptr) bool { + typ, err := windows.GetFileType(windows.Handle(fd)) + return err == nil && typ == windows.FILE_TYPE_PIPE } // canUpdateStatus returns true if status lines can be printed, the process @@ -133,7 +101,7 @@ func canUpdateStatus(fd uintptr) bool { } // check if the output file type is a pipe (0x0003) - if getFileType(fd) != fileTypePipe { + if isPipe(fd) { return false } From 751eba0e686d8d62e889827abc11fdd8e9a87a1c Mon Sep 17 00:00:00 2001 From: greatroar <@> Date: Sat, 29 Feb 2020 17:37:36 +0100 Subject: [PATCH 4/4] Remove unnecessary pipe checks in termstatus canUpdateStatus has already determined that the file descriptor is not a pipe. --- internal/ui/termstatus/terminal_windows.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/internal/ui/termstatus/terminal_windows.go b/internal/ui/termstatus/terminal_windows.go index fbd099497..b6331619c 100644 --- a/internal/ui/termstatus/terminal_windows.go +++ b/internal/ui/termstatus/terminal_windows.go @@ -19,12 +19,6 @@ func clearCurrentLine(wr io.Writer, fd uintptr) func(io.Writer, uintptr) { return windowsClearCurrentLine } - // check if the output file type is a pipe (0x0003) - if isPipe(fd) { - // return empty func, update state is not possible on this terminal - return func(io.Writer, uintptr) {} - } - // assume we're running in mintty/cygwin return posixClearCurrentLine } @@ -36,12 +30,6 @@ func moveCursorUp(wr io.Writer, fd uintptr) func(io.Writer, uintptr, int) { return windowsMoveCursorUp } - // check if the output file type is a pipe (0x0003) - if isPipe(fd) { - // return empty func, update state is not possible on this terminal - return func(io.Writer, uintptr, int) {} - } - // assume we're running in mintty/cygwin return posixMoveCursorUp }