From 398be033244d972ff23a853e659a0ba222d84cb9 Mon Sep 17 00:00:00 2001 From: sawka Date: Thu, 13 Apr 2023 12:53:15 -0700 Subject: [PATCH] simplify screen focus types (remove cmd-fg). send all screen focus updates. fix display issue with rtnstate (prompt vars) --- pkg/cmdrunner/cmdrunner.go | 6 ++--- pkg/remote/remote.go | 30 +++++++++++++++++++------ pkg/rtnstate/rtnstate.go | 8 +++++++ pkg/sstore/dbops.go | 45 ++++++++++++++++++++++++++++---------- pkg/sstore/fileops.go | 2 +- pkg/sstore/sstore.go | 1 - 6 files changed, 68 insertions(+), 24 deletions(-) diff --git a/pkg/cmdrunner/cmdrunner.go b/pkg/cmdrunner/cmdrunner.go index a20bec26..fcf89b9a 100644 --- a/pkg/cmdrunner/cmdrunner.go +++ b/pkg/cmdrunner/cmdrunner.go @@ -671,8 +671,8 @@ func ScreenSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (ss } if pk.Kwargs["focus"] != "" { focusVal := pk.Kwargs["focus"] - if focusVal != sstore.ScreenFocusInput && focusVal != sstore.ScreenFocusCmd && focusVal != sstore.ScreenFocusCmdFg { - return nil, fmt.Errorf("/screen:set invalid focus argument %q, must be %s", focusVal, formatStrs([]string{sstore.ScreenFocusInput, sstore.ScreenFocusCmd, sstore.ScreenFocusCmdFg}, "or", false)) + if focusVal != sstore.ScreenFocusInput && focusVal != sstore.ScreenFocusCmd { + return nil, fmt.Errorf("/screen:set invalid focus argument %q, must be %s", focusVal, formatStrs([]string{sstore.ScreenFocusInput, sstore.ScreenFocusCmd}, "or", false)) } varsUpdated = append(varsUpdated, "focus") updateMap[sstore.ScreenField_Focus] = focusVal @@ -1367,7 +1367,7 @@ func addLineForCmd(ctx context.Context, metaCmd string, shouldFocus bool, ids re updateMap := make(map[string]interface{}) updateMap[sstore.ScreenField_SelectedLine] = rtnLine.LineNum if shouldFocus { - updateMap[sstore.ScreenField_Focus] = sstore.ScreenFocusCmdFg + updateMap[sstore.ScreenField_Focus] = sstore.ScreenFocusCmd } screen, err = sstore.UpdateScreen(ctx, ids.ScreenId, updateMap) if err != nil { diff --git a/pkg/remote/remote.go b/pkg/remote/remote.go index cfd786dc..592c298b 100644 --- a/pkg/remote/remote.go +++ b/pkg/remote/remote.go @@ -1106,7 +1106,6 @@ func (msh *MShellProc) ReInit(ctx context.Context) (*packet.InitPacketType, erro msh.StateMap[hval] = initPk.State }) msh.updateRemoteStateVars(ctx, msh.RemoteId, initPk) - return initPk, nil } @@ -1144,6 +1143,7 @@ func stripScVarsFromStateDiff(stateDiff *packet.ShellStateDiff) *packet.ShellSta var mapDiff statediff.MapDiffType err := mapDiff.Decode(stateDiff.VarsDiff) if err != nil { + log.Printf("error decoding statediff in stripScVarsFromStateDiff: %v\n", err) return stateDiff } delete(mapDiff.ToAdd, "PROMPT") @@ -1645,9 +1645,9 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) { msh.WriteToPtyBuffer("*error updating cmddone: %v\n", err) return } - screen, err := sstore.UpdateScreenWithCmdFg(context.Background(), donePk.CK.GetGroupId(), donePk.CK.GetCmdId()) + screen, err := sstore.UpdateScreenFocusForDoneCmd(context.Background(), donePk.CK.GetGroupId(), donePk.CK.GetCmdId()) if err != nil { - msh.WriteToPtyBuffer("*error trying to update cmd-fg screens: %v\n", err) + msh.WriteToPtyBuffer("*error trying to update screen focus type: %v\n", err) // fall-through (nothing to do) } if screen != nil { @@ -1692,7 +1692,7 @@ func (msh *MShellProc) handleCmdDonePacket(donePk *packet.CmdDonePacketType) { // fall-through (nothing to do) } } - sstore.MainBus.SendScreenUpdate(donePk.CK.GetGroupId(), update) + sstore.MainBus.SendUpdate(update) return } @@ -1707,7 +1707,11 @@ func (msh *MShellProc) handleCmdFinalPacket(finalPk *packet.CmdFinalPacketType) return } log.Printf("finalpk %s (hangup): %s\n", finalPk.CK, finalPk.Error) - sstore.HangupCmd(context.Background(), finalPk.CK) + screen, err := sstore.HangupCmd(context.Background(), finalPk.CK) + if err != nil { + log.Printf("error in hangup-cmd in handleCmdFinalPacket: %v\n", err) + return + } rtnCmd, err = sstore.GetCmdByScreenId(context.Background(), finalPk.CK.GetGroupId(), finalPk.CK.GetCmdId()) if err != nil { log.Printf("error getting cmd(2) in handleCmdFinalPacket: %v\n", err) @@ -1718,7 +1722,10 @@ func (msh *MShellProc) handleCmdFinalPacket(finalPk *packet.CmdFinalPacketType) return } update := &sstore.ModelUpdate{Cmd: rtnCmd} - sstore.MainBus.SendScreenUpdate(finalPk.CK.GetGroupId(), update) + if screen != nil { + update.Screens = []*sstore.ScreenType{screen} + } + sstore.MainBus.SendUpdate(update) } // TODO notify FE about cmd errors @@ -1777,17 +1784,26 @@ func (msh *MShellProc) makeHandleCmdFinalPacketClosure(finalPk *packet.CmdFinalP } } +func sendScreenUpdates(screens []*sstore.ScreenType) { + for _, screen := range screens { + sstore.MainBus.SendUpdate(&sstore.ModelUpdate{Screens: []*sstore.ScreenType{screen}}) + } +} + func (msh *MShellProc) ProcessPackets() { defer msh.WithLock(func() { if msh.Status == StatusConnected { msh.Status = StatusDisconnected } - err := sstore.HangupRunningCmdsByRemoteId(context.Background(), msh.Remote.RemoteId) + screens, err := sstore.HangupRunningCmdsByRemoteId(context.Background(), msh.Remote.RemoteId) if err != nil { msh.writeToPtyBuffer_nolock("error calling HUP on cmds %v\n", err) } msh.notifyHangups_nolock() go msh.NotifyRemoteUpdate() + if len(screens) > 0 { + go sendScreenUpdates(screens) + } }) dataPosMap := make(map[base.CommandKey]int64) for pk := range msh.ServerProc.Output.MainCh { diff --git a/pkg/rtnstate/rtnstate.go b/pkg/rtnstate/rtnstate.go index 42e2314c..e882cab5 100644 --- a/pkg/rtnstate/rtnstate.go +++ b/pkg/rtnstate/rtnstate.go @@ -102,6 +102,8 @@ func ParseFuncs(funcs string) (map[string]string, error) { const MaxDiffKeyLen = 40 const MaxDiffValLen = 50 +var IgnoreVars = map[string]bool{"PROMPT": true, "PROMPT_VERSION": true, "MSHELL": true} + func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newState packet.ShellState) { if newState.Cwd != oldState.Cwd { buf.WriteString(fmt.Sprintf("cwd %s\n", newState.Cwd)) @@ -110,6 +112,9 @@ func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newSt newEnvMap := shexec.DeclMapFromState(&newState) oldEnvMap := shexec.DeclMapFromState(&oldState) for key, newVal := range newEnvMap { + if IgnoreVars[key] { + continue + } oldVal, found := oldEnvMap[key] if !found || !shexec.DeclsEqual(false, oldVal, newVal) { var exportStr string @@ -120,6 +125,9 @@ func displayStateUpdateDiff(buf *bytes.Buffer, oldState packet.ShellState, newSt } } for key, _ := range oldEnvMap { + if IgnoreVars[key] { + continue + } _, found := newEnvMap[key] if !found { buf.WriteString(fmt.Sprintf("unset %s\n", utilfn.EllipsisStr(key, MaxDiffKeyLen))) diff --git a/pkg/sstore/dbops.go b/pkg/sstore/dbops.go index 03b0e3b6..c1883dad 100644 --- a/pkg/sstore/dbops.go +++ b/pkg/sstore/dbops.go @@ -940,32 +940,52 @@ func HangupAllRunningCmds(ctx context.Context) error { query = `UPDATE cmd SET status = ? WHERE status = ?` tx.Exec(query, CmdStatusHangup, CmdStatusRunning) for _, cmdPtr := range cmdPtrs { - insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus) + if isWebShare(tx, cmdPtr.ScreenId) { + insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus) + } } return nil }) } -func HangupRunningCmdsByRemoteId(ctx context.Context, remoteId string) error { - return WithTx(ctx, func(tx *TxWrap) error { +// TODO send update +func HangupRunningCmdsByRemoteId(ctx context.Context, remoteId string) ([]*ScreenType, error) { + return WithTxRtn(ctx, func(tx *TxWrap) ([]*ScreenType, error) { var cmdPtrs []CmdPtr query := `SELECT screenid, cmdid FROM cmd WHERE status = ? AND remoteid = ?` tx.Select(&cmdPtrs, query, CmdStatusRunning, remoteId) query = `UPDATE cmd SET status = ? WHERE status = ? AND remoteid = ?` tx.Exec(query, CmdStatusHangup, CmdStatusRunning, remoteId) + var rtn []*ScreenType for _, cmdPtr := range cmdPtrs { - insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus) + if isWebShare(tx, cmdPtr.ScreenId) { + insertScreenCmdUpdate(tx, cmdPtr.ScreenId, cmdPtr.CmdId, UpdateType_CmdStatus) + } + screen, err := UpdateScreenFocusForDoneCmd(tx.Context(), cmdPtr.ScreenId, cmdPtr.CmdId) + if err != nil { + return nil, err + } + if screen != nil { + rtn = append(rtn, screen) + } } - return nil + return rtn, nil }) } -func HangupCmd(ctx context.Context, ck base.CommandKey) error { - return WithTx(ctx, func(tx *TxWrap) error { +// TODO send update +func HangupCmd(ctx context.Context, ck base.CommandKey) (*ScreenType, error) { + return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenType, error) { query := `UPDATE cmd SET status = ? WHERE screenid = ? AND cmdid = ?` tx.Exec(query, CmdStatusHangup, ck.GetGroupId(), ck.GetCmdId()) - insertScreenCmdUpdate(tx, ck.GetGroupId(), ck.GetCmdId(), UpdateType_CmdStatus) - return nil + if isWebShare(tx, ck.GetGroupId()) { + insertScreenCmdUpdate(tx, ck.GetGroupId(), ck.GetCmdId(), UpdateType_CmdStatus) + } + screen, err := UpdateScreenFocusForDoneCmd(tx.Context(), ck.GetGroupId(), ck.GetCmdId()) + if err != nil { + return nil, err + } + return screen, nil }) } @@ -1777,14 +1797,14 @@ func GetLineResolveItems(ctx context.Context, screenId string) ([]ResolveItem, e return rtn, nil } -func UpdateScreenWithCmdFg(ctx context.Context, screenId string, cmdId string) (*ScreenType, error) { +func UpdateScreenFocusForDoneCmd(ctx context.Context, screenId string, cmdId string) (*ScreenType, error) { return WithTxRtn(ctx, func(tx *TxWrap) (*ScreenType, error) { query := `SELECT screenid FROM screen s - WHERE s.screenid = ? AND s.focustype = 'cmd-fg' + WHERE s.screenid = ? AND s.focustype = ? AND s.selectedline IN (SELECT linenum FROM line l WHERE l.screenid = s.screenid AND l.cmdid = ?) ` - if !tx.Exists(query, screenId, cmdId) { + if !tx.Exists(query, screenId, ScreenFocusCmd, cmdId) { return nil, nil } editMap := make(map[string]interface{}) @@ -1803,6 +1823,7 @@ func StoreStateBase(ctx context.Context, state *packet.ShellState) error { Ts: time.Now().UnixMilli(), } stateBase.BaseHash, stateBase.Data = state.EncodeAndHash() + // envMap := shexec.DeclMapFromState(state) txErr := WithTx(ctx, func(tx *TxWrap) error { query := `SELECT basehash FROM state_base WHERE basehash = ?` if tx.Exists(query, stateBase.BaseHash) { diff --git a/pkg/sstore/fileops.go b/pkg/sstore/fileops.go index 0c521f87..c6d11828 100644 --- a/pkg/sstore/fileops.go +++ b/pkg/sstore/fileops.go @@ -173,6 +173,6 @@ func DeleteScreenDir(ctx context.Context, screenId string) error { if err != nil { return fmt.Errorf("error getting screendir: %w", err) } - fmt.Printf("remove-all %s\n", screenDir) + log.Printf("remove-all %s\n", screenDir) return os.RemoveAll(screenDir) } diff --git a/pkg/sstore/sstore.go b/pkg/sstore/sstore.go index d18ac79e..c969093d 100644 --- a/pkg/sstore/sstore.go +++ b/pkg/sstore/sstore.go @@ -82,7 +82,6 @@ const ( const ( ScreenFocusInput = "input" ScreenFocusCmd = "cmd" - ScreenFocusCmdFg = "cmd-fg" ) const (