mirror of
https://github.com/wavetermdev/waveterm.git
synced 2025-02-19 02:11:47 +01:00
move some sh parsing to shexec
This commit is contained in:
parent
3b7dd7c01e
commit
c9195b3cfd
@ -39,7 +39,7 @@ var ColorNames = []string{"black", "red", "green", "yellow", "blue", "magenta",
|
||||
var RemoteColorNames = []string{"red", "green", "yellow", "blue", "magenta", "cyan", "white", "orange"}
|
||||
var RemoteSetArgs = []string{"alias", "connectmode", "key", "password", "autoinstall", "color"}
|
||||
|
||||
var WindowCmds = []string{"run", "comment", "cd", "cr", "setenv", "unset", "clear", "sw", "alias", "unalias", "function", "source"}
|
||||
var WindowCmds = []string{"run", "comment", "cd", "cr", "setenv", "unset", "clear", "sw", "alias", "unalias", "function", "source", "reset"}
|
||||
var NoHistCmds = []string{"compgen", "line", "history"}
|
||||
var GlobalCmds = []string{"session", "screen", "remote"}
|
||||
|
||||
@ -78,6 +78,7 @@ func init() {
|
||||
registerCmdFn("setenv", SetEnvCommand)
|
||||
registerCmdFn("unset", UnSetCommand)
|
||||
registerCmdFn("clear", ClearCommand)
|
||||
registerCmdFn("reset", ResetCommand)
|
||||
|
||||
registerCmdFn("session", SessionCommand)
|
||||
registerCmdFn("session:open", SessionOpenCommand)
|
||||
@ -947,7 +948,7 @@ func SetEnvCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstor
|
||||
if len(pk.Args) == 0 {
|
||||
var infoLines []string
|
||||
for varName, varVal := range envMap {
|
||||
line := fmt.Sprintf("%s=%s", varName, shellescape.Quote(varVal))
|
||||
line := fmt.Sprintf("%s=%s", shellescape.Quote(varName), shellescape.Quote(varVal))
|
||||
infoLines = append(infoLines, line)
|
||||
}
|
||||
update := sstore.ModelUpdate{
|
||||
@ -1563,6 +1564,10 @@ func SessionCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (ssto
|
||||
return update, nil
|
||||
}
|
||||
|
||||
func ResetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func ClearCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sstore.UpdatePacket, error) {
|
||||
ids, err := resolveUiIds(ctx, pk, R_Session|R_Screen|R_Window)
|
||||
if err != nil {
|
||||
|
@ -3,40 +3,15 @@ package cmdrunner
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/scripthaus-dev/mshell/pkg/shexec"
|
||||
"github.com/scripthaus-dev/sh2-server/pkg/scpacket"
|
||||
"mvdan.cc/sh/v3/expand"
|
||||
"mvdan.cc/sh/v3/syntax"
|
||||
)
|
||||
|
||||
type parseEnviron struct {
|
||||
Env map[string]string
|
||||
}
|
||||
|
||||
func (e *parseEnviron) Get(name string) expand.Variable {
|
||||
val, ok := e.Env[name]
|
||||
if !ok {
|
||||
return expand.Variable{}
|
||||
}
|
||||
return expand.Variable{
|
||||
Exported: true,
|
||||
Kind: expand.String,
|
||||
Str: val,
|
||||
}
|
||||
}
|
||||
|
||||
func (e *parseEnviron) Each(fn func(name string, vr expand.Variable) bool) {
|
||||
for key, _ := range e.Env {
|
||||
rtn := fn(key, e.Get(key))
|
||||
if !rtn {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func DumpPacket(pk *scpacket.FeCommandPacketType) {
|
||||
if pk == nil || pk.MetaCmd == "" {
|
||||
fmt.Printf("[no metacmd]\n")
|
||||
@ -55,14 +30,6 @@ func DumpPacket(pk *scpacket.FeCommandPacketType) {
|
||||
}
|
||||
}
|
||||
|
||||
func doCmdSubst(commandStr string, w io.Writer, word *syntax.CmdSubst) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func doProcSubst(w *syntax.ProcSubst) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func isQuoted(source string, w *syntax.Word) bool {
|
||||
if w == nil {
|
||||
return false
|
||||
@ -99,6 +66,7 @@ var BareMetaCmds = []BareMetaCmdDecl{
|
||||
BareMetaCmdDecl{"clear", "clear"},
|
||||
BareMetaCmdDecl{".", "source"},
|
||||
BareMetaCmdDecl{"source", "source"},
|
||||
BareMetaCmdDecl{"reset", "reset"},
|
||||
}
|
||||
|
||||
func SubMetaCmd(cmd string) string {
|
||||
@ -186,15 +154,7 @@ func EvalMetaCommand(ctx context.Context, origPk *scpacket.FeCommandPacketType)
|
||||
return nil, fmt.Errorf("parsing metacmd, position %v", err)
|
||||
}
|
||||
envMap := make(map[string]string) // later we can add vars like session, window, screen, remote, and user
|
||||
cfg := &expand.Config{
|
||||
Env: &parseEnviron{Env: envMap},
|
||||
GlobStar: false,
|
||||
NullGlob: false,
|
||||
NoUnset: false,
|
||||
CmdSubst: func(w io.Writer, word *syntax.CmdSubst) error { return doCmdSubst(commandArgs, w, word) },
|
||||
ProcSubst: doProcSubst,
|
||||
ReadDir: nil,
|
||||
}
|
||||
cfg := shexec.GetParserConfig(envMap)
|
||||
// process arguments
|
||||
for idx, w := range words {
|
||||
literalVal, err := expand.Literal(cfg, w)
|
||||
@ -234,7 +194,7 @@ func parseAliasStmt(stmt *syntax.Stmt) (string, string, error) {
|
||||
return "", "", fmt.Errorf("invalid alias cmd word (not 'alias')")
|
||||
}
|
||||
secondWord := callExpr.Args[1]
|
||||
val, err := quotedLitToStr(secondWord)
|
||||
val, err := shexec.QuotedLitToStr(secondWord)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
@ -245,19 +205,6 @@ func parseAliasStmt(stmt *syntax.Stmt) (string, string, error) {
|
||||
return val[0:eqIdx], val[eqIdx+1:], nil
|
||||
}
|
||||
|
||||
func quotedLitToStr(word *syntax.Word) (string, error) {
|
||||
cfg := &expand.Config{
|
||||
Env: &parseEnviron{Env: make(map[string]string)},
|
||||
GlobStar: false,
|
||||
NullGlob: false,
|
||||
NoUnset: false,
|
||||
CmdSubst: func(w io.Writer, word *syntax.CmdSubst) error { return doCmdSubst("", w, word) },
|
||||
ProcSubst: doProcSubst,
|
||||
ReadDir: nil,
|
||||
}
|
||||
return expand.Literal(cfg, word)
|
||||
}
|
||||
|
||||
func ParseAliases(aliases string) (map[string]string, error) {
|
||||
r := strings.NewReader(aliases)
|
||||
parser := syntax.NewParser(syntax.Variant(syntax.LangBash))
|
||||
|
Loading…
Reference in New Issue
Block a user