From 5f6de80ddb98b1eab4c2ba4907ca71bd0c58b88a Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 22 Jul 2021 18:20:20 +0300 Subject: [PATCH 1/9] pb pool --- v3/pb.go | 7 +++ v3/pool.go | 105 ++++++++++++++++++++++++++++++++++++++++++ v3/pool_win.go | 44 ++++++++++++++++++ v3/pool_x.go | 42 +++++++++++++++++ v3/termutil/term_x.go | 10 +++- 5 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 v3/pool.go create mode 100644 v3/pool_win.go create mode 100644 v3/pool_x.go diff --git a/v3/pb.go b/v3/pb.go index 963f700..76440e1 100644 --- a/v3/pb.go +++ b/v3/pb.go @@ -408,6 +408,13 @@ func (pb *ProgressBar) IsStarted() bool { return pb.finish != nil } +// IsFinished indicates progress bar is finished +func (pb *ProgressBar) IsFinished() bool { + pb.mu.RLock() + defer pb.mu.RUnlock() + return pb.finished +} + // SetTemplateString sets ProgressBar tempate string and parse it func (pb *ProgressBar) SetTemplateString(tmpl string) *ProgressBar { pb.mu.Lock() diff --git a/v3/pool.go b/v3/pool.go new file mode 100644 index 0000000..69cc825 --- /dev/null +++ b/v3/pool.go @@ -0,0 +1,105 @@ +// +build linux darwin freebsd netbsd openbsd solaris dragonfly windows plan9 aix + +package pb + +import ( + "io" + "sync" + "time" + + "github.com/cheggaaa/pb/v3/termutil" +) + +// Create and start new pool with given bars +// You need call pool.Stop() after work +func StartPool(pbs ...*ProgressBar) (pool *Pool, err error) { + pool = new(Pool) + if err = pool.Start(); err != nil { + return + } + pool.Add(pbs...) + return +} + +// NewPool initialises a pool with progress bars, but +// doesn't start it. You need to call Start manually +func NewPool(pbs ...*ProgressBar) (pool *Pool) { + pool = new(Pool) + pool.Add(pbs...) + return +} + +type Pool struct { + Output io.Writer + RefreshRate time.Duration + bars []*ProgressBar + lastBarsCount int + shutdownCh chan struct{} + workerCh chan struct{} + m sync.Mutex + finishOnce sync.Once +} + +// Add progress bars. +func (p *Pool) Add(pbs ...*ProgressBar) { + p.m.Lock() + defer p.m.Unlock() + for _, bar := range pbs { + bar.Set(Static, true) + bar.Start() + p.bars = append(p.bars, bar) + } +} + +func (p *Pool) Start() (err error) { + p.RefreshRate = defaultRefreshRate + p.shutdownCh, err = termutil.RawModeOn() + if err != nil { + return + } + p.workerCh = make(chan struct{}) + go p.writer() + return +} + +func (p *Pool) writer() { + var first = true + defer func() { + if first == false { + p.print(false) + } else { + p.print(true) + p.print(false) + } + close(p.workerCh) + }() + + for { + select { + case <-time.After(p.RefreshRate): + if p.print(first) { + p.print(false) + return + } + first = false + case <-p.shutdownCh: + return + } + } +} + +// Restore terminal state and close pool +func (p *Pool) Stop() error { + p.finishOnce.Do(func() { + if p.shutdownCh != nil { + close(p.shutdownCh) + } + }) + + // Wait for the worker to complete + select { + case <-p.workerCh: + } + + return termutil.RawModeOff() +} diff --git a/v3/pool_win.go b/v3/pool_win.go new file mode 100644 index 0000000..8e47bb6 --- /dev/null +++ b/v3/pool_win.go @@ -0,0 +1,44 @@ +// +build windows + +package pb + +import ( + "fmt" + "log" +) + +func (p *Pool) print(first bool) bool { + p.m.Lock() + defer p.m.Unlock() + var out string + if !first { + coords, err := getCursorPos() + if err != nil { + log.Panic(err) + } + coords.Y -= int16(p.lastBarsCount) + if coords.Y < 0 { + coords.Y = 0 + } + coords.X = 0 + + err = setCursorPos(coords) + if err != nil { + log.Panic(err) + } + } + isFinished := true + for _, bar := range p.bars { + if !bar.IsFinished() { + isFinished = false + } + out += fmt.Sprintf("\r%s\n", bar.String()) + } + if p.Output != nil { + fmt.Fprint(p.Output, out) + } else { + fmt.Print(out) + } + p.lastBarsCount = len(p.bars) + return isFinished +} diff --git a/v3/pool_x.go b/v3/pool_x.go new file mode 100644 index 0000000..8410e79 --- /dev/null +++ b/v3/pool_x.go @@ -0,0 +1,42 @@ +// +build linux darwin freebsd netbsd openbsd solaris dragonfly plan9 aix + +package pb + +import ( + "fmt" + "os" + + "github.com/cheggaaa/pb/v3/termutil" +) + +func (p *Pool) print(first bool) bool { + p.m.Lock() + defer p.m.Unlock() + var out string + if !first { + out = fmt.Sprintf("\033[%dA", p.lastBarsCount) + } + isFinished := true + bars := p.bars + rows, cols, err := termutil.TerminalSize() + if err != nil { + cols = defaultBarWidth + } + if rows > 0 && len(bars) > rows { + bars = bars[:rows] + } + for _, bar := range bars { + if !bar.IsFinished() { + isFinished = false + } + bar.SetWidth(cols) + out += fmt.Sprintf("\r%s\n", bar.String()) + } + if p.Output != nil { + fmt.Fprint(p.Output, out) + } else { + fmt.Fprint(os.Stderr, out) + } + p.lastBarsCount = len(p.bars) + return isFinished +} diff --git a/v3/termutil/term_x.go b/v3/termutil/term_x.go index 6937755..1674d3e 100644 --- a/v3/termutil/term_x.go +++ b/v3/termutil/term_x.go @@ -35,6 +35,12 @@ func init() { // TerminalWidth returns width of the terminal. func TerminalWidth() (int, error) { + _, c, err := TerminalSize() + return c, err +} + +// TerminalSize returns size of the terminal. +func TerminalSize() (rows, cols int, err error) { w := new(window) res, _, err := syscall.Syscall(sysIoctl, tty.Fd(), @@ -42,9 +48,9 @@ func TerminalWidth() (int, error) { uintptr(unsafe.Pointer(w)), ) if int(res) == -1 { - return 0, err + return 0, 0, err } - return int(w.Col), nil + return int(w.Row), int(w.Col), nil } var oldState syscall.Termios From 2eee34d7b539dea2697db01bd251c40f8da5c831 Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 22 Jul 2021 19:03:24 +0300 Subject: [PATCH 2/9] fix win pool --- v3/pool_win.go | 6 ++++-- v3/termutil/term_win.go | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/v3/pool_win.go b/v3/pool_win.go index 8e47bb6..35a6147 100644 --- a/v3/pool_win.go +++ b/v3/pool_win.go @@ -5,6 +5,8 @@ package pb import ( "fmt" "log" + + "github.com/cheggaaa/pb/v3/termutil" ) func (p *Pool) print(first bool) bool { @@ -12,7 +14,7 @@ func (p *Pool) print(first bool) bool { defer p.m.Unlock() var out string if !first { - coords, err := getCursorPos() + coords, err := termutil.GetCursorPos() if err != nil { log.Panic(err) } @@ -22,7 +24,7 @@ func (p *Pool) print(first bool) bool { } coords.X = 0 - err = setCursorPos(coords) + err = termutil.SetCursorPos(coords) if err != nil { log.Panic(err) } diff --git a/v3/termutil/term_win.go b/v3/termutil/term_win.go index c867d27..3150dfd 100644 --- a/v3/termutil/term_win.go +++ b/v3/termutil/term_win.go @@ -111,7 +111,7 @@ func termWidthTPut() (width int, err error) { return strconv.Atoi(string(res)) } -func getCursorPos() (pos coordinates, err error) { +func GetCursorPos() (pos coordinates, err error) { var info consoleScreenBufferInfo _, _, e := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(syscall.Stdout), uintptr(unsafe.Pointer(&info)), 0) if e != 0 { @@ -120,7 +120,7 @@ func getCursorPos() (pos coordinates, err error) { return info.dwCursorPosition, nil } -func setCursorPos(pos coordinates) error { +func SetCursorPos(pos coordinates) error { _, _, e := syscall.Syscall(setConsoleCursorPosition.Addr(), 2, uintptr(syscall.Stdout), uintptr(uint32(uint16(pos.Y))<<16|uint32(uint16(pos.X))), 0) if e != 0 { return error(e) From 6336041c275e6c3ac20c8db0bfdd4d36064b28dc Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Thu, 22 Jul 2021 19:15:37 +0300 Subject: [PATCH 3/9] hide bars that overflow terminal height --- v3/pool_x.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/v3/pool_x.go b/v3/pool_x.go index 8410e79..4350301 100644 --- a/v3/pool_x.go +++ b/v3/pool_x.go @@ -23,7 +23,8 @@ func (p *Pool) print(first bool) bool { cols = defaultBarWidth } if rows > 0 && len(bars) > rows { - bars = bars[:rows] + // we need to hide bars that overflow terminal height + bars = bars[len(bars)-rows:] } for _, bar := range bars { if !bar.IsFinished() { @@ -37,6 +38,6 @@ func (p *Pool) print(first bool) bool { } else { fmt.Fprint(os.Stderr, out) } - p.lastBarsCount = len(p.bars) + p.lastBarsCount = len(bars) return isFinished } From 90c02fa07ea4ee9edb93588b7bd22e8e96b10aad Mon Sep 17 00:00:00 2001 From: Sergey Cherepanov Date: Wed, 22 Dec 2021 10:54:16 +0300 Subject: [PATCH 4/9] configurable os.Signal catching --- v3/termutil/term.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/v3/termutil/term.go b/v3/termutil/term.go index 02b5279..c838d4f 100644 --- a/v3/termutil/term.go +++ b/v3/termutil/term.go @@ -10,6 +10,16 @@ import ( var echoLocked bool var echoLockMutex sync.Mutex var errLocked = errors.New("terminal locked") +var autoTerminate = true + +// AutoTerminate enables or disables automatic terminate signal catching. +// It's needed to restore the terminal state after the pool was used. +// By default, it's enabled. +func AutoTerminate(enable bool) { + echoLockMutex.Lock() + defer echoLockMutex.Unlock() + autoTerminate = enable +} // RawModeOn switches terminal to raw mode func RawModeOn() (quit chan struct{}, err error) { @@ -45,8 +55,10 @@ func RawModeOff() (err error) { // listen exit signals and restore terminal state func catchTerminate(quit chan struct{}) { sig := make(chan os.Signal, 1) - signal.Notify(sig, unlockSignals...) - defer signal.Stop(sig) + if autoTerminate { + signal.Notify(sig, unlockSignals...) + defer signal.Stop(sig) + } select { case <-quit: RawModeOff() From e1c53e35c24489ac08bbc4dcda8cacced8180912 Mon Sep 17 00:00:00 2001 From: dmitryk-dk Date: Sun, 8 May 2022 12:44:33 +0300 Subject: [PATCH 5/9] Update dependencies, use term instead of Syscall --- v3/go.mod | 8 ++++++-- v3/go.sum | 6 ++++-- v3/termutil/term_appengine.go | 2 +- v3/termutil/term_bsd.go | 3 +-- v3/termutil/term_linux.go | 3 +-- v3/termutil/term_nix.go | 3 +-- v3/termutil/term_solaris.go | 3 +-- v3/termutil/term_win.go | 2 +- v3/termutil/term_x.go | 34 +++++++++++++--------------------- 9 files changed, 29 insertions(+), 35 deletions(-) diff --git a/v3/go.mod b/v3/go.mod index ec2b67b..4d47460 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -6,8 +6,12 @@ require ( github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-runewidth v0.0.12 + golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 +) + +require ( github.com/rivo/uniseg v0.2.0 // indirect - golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect + golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect ) -go 1.12 +go 1.18 diff --git a/v3/go.sum b/v3/go.sum index 70a1b2b..4d5f9e0 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -13,5 +13,7 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 h1:F5Gozwx4I1xtr/sr/8CFbb57iKi3297KFs0QDbGN60A= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 h1:EH1Deb8WZJ0xc0WK//leUHXcX9aLE5SymusoTmMZye8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/v3/termutil/term_appengine.go b/v3/termutil/term_appengine.go index 4b7b20e..765ff2b 100644 --- a/v3/termutil/term_appengine.go +++ b/v3/termutil/term_appengine.go @@ -1,4 +1,4 @@ -// +build appengine +//go:build appengine package termutil diff --git a/v3/termutil/term_bsd.go b/v3/termutil/term_bsd.go index 272659a..d29404a 100644 --- a/v3/termutil/term_bsd.go +++ b/v3/termutil/term_bsd.go @@ -1,5 +1,4 @@ -// +build darwin freebsd netbsd openbsd dragonfly -// +build !appengine +//go:build (darwin || freebsd || netbsd || openbsd || dragonfly) && !appengine package termutil diff --git a/v3/termutil/term_linux.go b/v3/termutil/term_linux.go index 2f59e53..bec62af 100644 --- a/v3/termutil/term_linux.go +++ b/v3/termutil/term_linux.go @@ -1,5 +1,4 @@ -// +build linux -// +build !appengine +//go:build linux && !appengine package termutil diff --git a/v3/termutil/term_nix.go b/v3/termutil/term_nix.go index 14277e7..4513e37 100644 --- a/v3/termutil/term_nix.go +++ b/v3/termutil/term_nix.go @@ -1,5 +1,4 @@ -// +build linux darwin freebsd netbsd openbsd dragonfly -// +build !appengine +//go:build (linux || darwin || freebsd || netbsd || openbsd || dragonfly) && !appengine package termutil diff --git a/v3/termutil/term_solaris.go b/v3/termutil/term_solaris.go index fc96c2b..02cfabf 100644 --- a/v3/termutil/term_solaris.go +++ b/v3/termutil/term_solaris.go @@ -1,5 +1,4 @@ -// +build solaris -// +build !appengine +//go:build solaris && !appengine package termutil diff --git a/v3/termutil/term_win.go b/v3/termutil/term_win.go index 3150dfd..1ccf131 100644 --- a/v3/termutil/term_win.go +++ b/v3/termutil/term_win.go @@ -1,4 +1,4 @@ -// +build windows +//go:build windows package termutil diff --git a/v3/termutil/term_x.go b/v3/termutil/term_x.go index 1674d3e..2484fa0 100644 --- a/v3/termutil/term_x.go +++ b/v3/termutil/term_x.go @@ -1,5 +1,4 @@ -// +build linux darwin freebsd netbsd openbsd solaris dragonfly -// +build !appengine +//go:build (linux || darwin || freebsd || netbsd || openbsd || solaris || dragonfly) && !appengine package termutil @@ -8,6 +7,8 @@ import ( "os" "syscall" "unsafe" + + "golang.org/x/term" ) var ( @@ -16,6 +17,7 @@ var ( unlockSignals = []os.Signal{ os.Interrupt, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGKILL, } + termState *term.State ) type window struct { @@ -53,30 +55,20 @@ func TerminalSize() (rows, cols int, err error) { return int(w.Row), int(w.Col), nil } -var oldState syscall.Termios - -func lockEcho() (err error) { +func lockEcho() error { fd := tty.Fd() - if _, _, e := syscall.Syscall6(sysIoctl, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); e != 0 { - err = fmt.Errorf("Can't get terminal settings: %v", e) - return - } - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - if _, _, e := syscall.Syscall6(sysIoctl, fd, ioctlWriteTermios, uintptr(unsafe.Pointer(&newState)), 0, 0, 0); e != 0 { - err = fmt.Errorf("Can't set terminal settings: %v", e) - return + var err error + if termState, err = term.MakeRaw(int(fd)); err != nil { + return fmt.Errorf("error when puts the terminal connected to the given file descriptor: %v", err) } - return + return nil } -func unlockEcho() (err error) { +func unlockEcho() error { fd := tty.Fd() - if _, _, e := syscall.Syscall6(sysIoctl, fd, ioctlWriteTermios, uintptr(unsafe.Pointer(&oldState)), 0, 0, 0); e != 0 { - err = fmt.Errorf("Can't set terminal settings") + if err := term.Restore(int(fd), termState); err != nil { + return fmt.Errorf("error restores the terminal connected to the given file descriptor: %w", err) } - return + return nil } From f435c2ccd63371cf55b463e6d778c37b69692e8e Mon Sep 17 00:00:00 2001 From: dmitryk-dk Date: Sun, 8 May 2022 15:34:32 +0300 Subject: [PATCH 6/9] used syscall --- v3/go.mod | 1 - v3/go.sum | 2 -- 2 files changed, 3 deletions(-) diff --git a/v3/go.mod b/v3/go.mod index 4d47460..dc8f265 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -6,7 +6,6 @@ require ( github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-runewidth v0.0.12 - golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 ) require ( diff --git a/v3/go.sum b/v3/go.sum index 4d5f9e0..49d2b3d 100644 --- a/v3/go.sum +++ b/v3/go.sum @@ -15,5 +15,3 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 h1:EH1Deb8WZJ0xc0WK//leUHXcX9aLE5SymusoTmMZye8= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From 684eb1bf7ce3f682a1d927815043957974cfa220 Mon Sep 17 00:00:00 2001 From: dmitryk-dk Date: Sun, 8 May 2022 15:34:25 +0300 Subject: [PATCH 7/9] used syscall --- v3/termutil/term_x.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/v3/termutil/term_x.go b/v3/termutil/term_x.go index 2484fa0..0b48aae 100644 --- a/v3/termutil/term_x.go +++ b/v3/termutil/term_x.go @@ -7,8 +7,6 @@ import ( "os" "syscall" "unsafe" - - "golang.org/x/term" ) var ( @@ -17,7 +15,7 @@ var ( unlockSignals = []os.Signal{ os.Interrupt, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGKILL, } - termState *term.State + oldState syscall.Termios ) type window struct { @@ -58,16 +56,23 @@ func TerminalSize() (rows, cols int, err error) { func lockEcho() error { fd := tty.Fd() - var err error - if termState, err = term.MakeRaw(int(fd)); err != nil { + if _, _, err := syscall.Syscall(sysIoctl, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&oldState))); err != 0 { return fmt.Errorf("error when puts the terminal connected to the given file descriptor: %v", err) } + + newState := oldState + newState.Lflag &^= syscall.ECHO + newState.Lflag |= syscall.ICANON | syscall.ISIG + newState.Iflag |= syscall.ICRNL + if _, _, e := syscall.Syscall(sysIoctl, fd, ioctlWriteTermios, uintptr(unsafe.Pointer(&newState))); e != 0 { + return fmt.Errorf("error update terminal settings: %v", e) + } return nil } func unlockEcho() error { fd := tty.Fd() - if err := term.Restore(int(fd), termState); err != nil { + if _, _, err := syscall.Syscall(sysIoctl, fd, ioctlWriteTermios, uintptr(unsafe.Pointer(&oldState))); err != 0 { return fmt.Errorf("error restores the terminal connected to the given file descriptor: %w", err) } return nil From 55fa2cccddcccf3d3643dda37ff2246a9d7110e3 Mon Sep 17 00:00:00 2001 From: dmitryk-dk Date: Mon, 9 May 2022 15:33:34 +0300 Subject: [PATCH 8/9] rollback old build rules --- v3/termutil/term_appengine.go | 1 + v3/termutil/term_bsd.go | 2 ++ v3/termutil/term_linux.go | 1 + v3/termutil/term_nix.go | 2 ++ v3/termutil/term_solaris.go | 1 + v3/termutil/term_win.go | 1 + v3/termutil/term_x.go | 6 ++++-- 7 files changed, 12 insertions(+), 2 deletions(-) diff --git a/v3/termutil/term_appengine.go b/v3/termutil/term_appengine.go index 765ff2b..6bc5c51 100644 --- a/v3/termutil/term_appengine.go +++ b/v3/termutil/term_appengine.go @@ -1,4 +1,5 @@ //go:build appengine +// +build appengine package termutil diff --git a/v3/termutil/term_bsd.go b/v3/termutil/term_bsd.go index d29404a..e16380f 100644 --- a/v3/termutil/term_bsd.go +++ b/v3/termutil/term_bsd.go @@ -1,4 +1,6 @@ //go:build (darwin || freebsd || netbsd || openbsd || dragonfly) && !appengine +// +build darwin freebsd netbsd openbsd dragonfly +// +build !appengine package termutil diff --git a/v3/termutil/term_linux.go b/v3/termutil/term_linux.go index bec62af..f4c5325 100644 --- a/v3/termutil/term_linux.go +++ b/v3/termutil/term_linux.go @@ -1,4 +1,5 @@ //go:build linux && !appengine +// +build linux,!appengine package termutil diff --git a/v3/termutil/term_nix.go b/v3/termutil/term_nix.go index 4513e37..471d5a9 100644 --- a/v3/termutil/term_nix.go +++ b/v3/termutil/term_nix.go @@ -1,4 +1,6 @@ //go:build (linux || darwin || freebsd || netbsd || openbsd || dragonfly) && !appengine +// +build linux darwin freebsd netbsd openbsd dragonfly +// +build !appengine package termutil diff --git a/v3/termutil/term_solaris.go b/v3/termutil/term_solaris.go index 02cfabf..45f3055 100644 --- a/v3/termutil/term_solaris.go +++ b/v3/termutil/term_solaris.go @@ -1,4 +1,5 @@ //go:build solaris && !appengine +// +build solaris,!appengine package termutil diff --git a/v3/termutil/term_win.go b/v3/termutil/term_win.go index 1ccf131..75c7e2c 100644 --- a/v3/termutil/term_win.go +++ b/v3/termutil/term_win.go @@ -1,4 +1,5 @@ //go:build windows +// +build windows package termutil diff --git a/v3/termutil/term_x.go b/v3/termutil/term_x.go index 0b48aae..4746e9b 100644 --- a/v3/termutil/term_x.go +++ b/v3/termutil/term_x.go @@ -1,4 +1,6 @@ //go:build (linux || darwin || freebsd || netbsd || openbsd || solaris || dragonfly) && !appengine +// +build linux darwin freebsd netbsd openbsd solaris dragonfly +// +build !appengine package termutil @@ -57,7 +59,7 @@ func lockEcho() error { fd := tty.Fd() if _, _, err := syscall.Syscall(sysIoctl, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&oldState))); err != 0 { - return fmt.Errorf("error when puts the terminal connected to the given file descriptor: %v", err) + return fmt.Errorf("error when puts the terminal connected to the given file descriptor: %w", err) } newState := oldState @@ -65,7 +67,7 @@ func lockEcho() error { newState.Lflag |= syscall.ICANON | syscall.ISIG newState.Iflag |= syscall.ICRNL if _, _, e := syscall.Syscall(sysIoctl, fd, ioctlWriteTermios, uintptr(unsafe.Pointer(&newState))); e != 0 { - return fmt.Errorf("error update terminal settings: %v", e) + return fmt.Errorf("error update terminal settings: %w", e) } return nil } From 8830ba567c836907da6999d470e8c8e02b28ed31 Mon Sep 17 00:00:00 2001 From: dmitryk-dk Date: Mon, 9 May 2022 15:51:16 +0300 Subject: [PATCH 9/9] rollback go version --- v3/go.mod | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/v3/go.mod b/v3/go.mod index dc8f265..7f0eb4f 100644 --- a/v3/go.mod +++ b/v3/go.mod @@ -6,11 +6,8 @@ require ( github.com/mattn/go-colorable v0.1.8 github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-runewidth v0.0.12 -) - -require ( github.com/rivo/uniseg v0.2.0 // indirect golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect ) -go 1.18 +go 1.12