github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/hud/terminal_stream.go (about) 1 package hud 2 3 import ( 4 "context" 5 6 "github.com/tilt-dev/tilt/internal/store" 7 "github.com/tilt-dev/tilt/pkg/model/logstore" 8 ) 9 10 type TerminalStream struct { 11 ProcessedLogs logstore.Checkpoint 12 printer *IncrementalPrinter 13 store store.RStore 14 } 15 16 func NewTerminalStream(printer *IncrementalPrinter, store store.RStore) *TerminalStream { 17 return &TerminalStream{printer: printer, store: store} 18 } 19 20 // TODO(nick): We should change this API so that TearDown gets 21 // the RStore one last time. 22 func (h *TerminalStream) TearDown(ctx context.Context) { 23 if !h.isEnabled(h.store) { 24 return 25 } 26 27 _ = h.OnChange(ctx, h.store, store.LegacyChangeSummary()) 28 29 state := h.store.RLockState() 30 uncompleted := state.LogStore.IsLastSegmentUncompleted() 31 h.store.RUnlockState() 32 33 if uncompleted { 34 h.printer.PrintNewline() 35 } 36 } 37 38 func (h *TerminalStream) isEnabled(st store.RStore) bool { 39 state := st.RLockState() 40 defer st.RUnlockState() 41 return state.TerminalMode == store.TerminalModeStream 42 } 43 44 func (h *TerminalStream) OnChange(ctx context.Context, st store.RStore, _ store.ChangeSummary) error { 45 if !h.isEnabled(st) { 46 return nil 47 } 48 49 state := st.RLockState() 50 lines := state.LogStore.ContinuingLines(h.ProcessedLogs) 51 checkpoint := state.LogStore.Checkpoint() 52 st.RUnlockState() 53 54 h.printer.Print(lines) 55 h.ProcessedLogs = checkpoint 56 return nil 57 } 58 59 var _ store.TearDowner = &TerminalStream{}