Revert "Use SIGWINCH to update terminal size"
This reverts commit 49036be4076851c4ef2003339ffd1bf022dfc844.
Reason for revert: TestSmartStatusOutputWidthChange is flaky
Change-Id: Ie5231dbbab2887ce4c4697f3fe6e52cfd6f4dd17
diff --git a/ui/terminal/smart_status.go b/ui/terminal/smart_status.go
index 999a2d0..8fa9eff 100644
--- a/ui/terminal/smart_status.go
+++ b/ui/terminal/smart_status.go
@@ -17,11 +17,8 @@
import (
"fmt"
"io"
- "os"
- "os/signal"
"strings"
"sync"
- "syscall"
"android/soong/ui/status"
)
@@ -33,29 +30,18 @@
lock sync.Mutex
haveBlankLine bool
-
- termWidth int
- sigwinch chan os.Signal
}
// NewSmartStatusOutput returns a StatusOutput that represents the
// current build status similarly to Ninja's built-in terminal
// output.
func NewSmartStatusOutput(w io.Writer, formatter formatter) status.StatusOutput {
- s := &smartStatusOutput{
+ return &smartStatusOutput{
writer: w,
formatter: formatter,
haveBlankLine: true,
-
- sigwinch: make(chan os.Signal),
}
-
- s.updateTermSize()
-
- s.startSigwinch()
-
- return s
}
func (s *smartStatusOutput) Message(level status.MsgLevel, message string) {
@@ -115,8 +101,6 @@
s.lock.Lock()
defer s.lock.Unlock()
- s.stopSigwinch()
-
s.requestLine()
}
@@ -153,8 +137,16 @@
// Limit line width to the terminal width, otherwise we'll wrap onto
// another line and we won't delete the previous line.
- if s.termWidth > 0 {
- str = s.elide(str)
+ //
+ // Run this on every line in case the window has been resized while
+ // we're printing. This could be optimized to only re-run when we get
+ // SIGWINCH if it ever becomes too time consuming.
+ if max, ok := termWidth(s.writer); ok {
+ if len(str) > max {
+ // TODO: Just do a max. Ninja elides the middle, but that's
+ // more complicated and these lines aren't that important.
+ str = str[:max]
+ }
}
// Move to the beginning on the line, turn on bold, print the output,
@@ -164,35 +156,3 @@
fmt.Fprint(s.writer, start, str, end)
s.haveBlankLine = false
}
-
-func (s *smartStatusOutput) elide(str string) string {
- if len(str) > s.termWidth {
- // TODO: Just do a max. Ninja elides the middle, but that's
- // more complicated and these lines aren't that important.
- str = str[:s.termWidth]
- }
-
- return str
-}
-
-func (s *smartStatusOutput) startSigwinch() {
- signal.Notify(s.sigwinch, syscall.SIGWINCH)
- go func() {
- for _ = range s.sigwinch {
- s.lock.Lock()
- s.updateTermSize()
- s.lock.Unlock()
- }
- }()
-}
-
-func (s *smartStatusOutput) stopSigwinch() {
- signal.Stop(s.sigwinch)
- close(s.sigwinch)
-}
-
-func (s *smartStatusOutput) updateTermSize() {
- if w, ok := termWidth(s.writer); ok {
- s.termWidth = w
- }
-}