mirror of
https://github.com/wavetermdev/backup.git
synced 2026-04-22 15:26:58 -07:00
Compare commits
9 Commits
v0.6.1
...
evan/newton
| Author | SHA1 | Date | |
|---|---|---|---|
| 417c2106c9 | |||
| 05707de824 | |||
| 1c9bce6d50 | |||
| f5cd591539 | |||
| d9778652ce | |||
| 8f2c8b5bbe | |||
| 5e4f2e2dcf | |||
| be376deb54 | |||
| 9d8d112c79 |
@@ -1,4 +1,7 @@
|
||||
go 1.18
|
||||
go 1.21
|
||||
|
||||
toolchain go1.21.5
|
||||
|
||||
use ./wavesrv
|
||||
use ./waveshell
|
||||
|
||||
use ./waveshell
|
||||
|
||||
+14
@@ -1,11 +1,25 @@
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
||||
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
|
||||
github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4=
|
||||
github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
|
||||
github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/wavetermdev/ssh_config v0.0.0-20240109090616-36c8da3d7376 h1:tFhJgTu7lgd+hldLfPSzDCoWUpXI8wHKR3rxq5jTLkQ=
|
||||
github.com/wavetermdev/ssh_config v0.0.0-20240109090616-36c8da3d7376/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
|
||||
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
||||
+9
-2
@@ -1,17 +1,19 @@
|
||||
module github.com/wavetermdev/waveterm/wavesrv
|
||||
|
||||
go 1.18
|
||||
go 1.21
|
||||
|
||||
toolchain go1.21.5
|
||||
|
||||
require (
|
||||
github.com/alessio/shellescape v1.4.1
|
||||
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2
|
||||
github.com/creack/pty v1.1.18
|
||||
github.com/kevinburke/ssh_config v1.2.0
|
||||
github.com/golang-migrate/migrate/v4 v4.16.2
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/gorilla/mux v1.8.0
|
||||
github.com/gorilla/websocket v1.5.0
|
||||
github.com/jmoiron/sqlx v1.3.5
|
||||
github.com/kevinburke/ssh_config v1.2.0
|
||||
github.com/mattn/go-sqlite3 v1.14.16
|
||||
github.com/sashabaranov/go-openai v1.9.0
|
||||
github.com/sawka/txwrap v0.1.2
|
||||
@@ -26,8 +28,13 @@ require (
|
||||
github.com/google/go-github/v57 v57.0.0 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/hashicorp/go-set/v2 v2.1.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/spf13/cobra v1.8.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
go.uber.org/atomic v1.7.0 // indirect
|
||||
)
|
||||
|
||||
replace github.com/wavetermdev/waveterm/waveshell => ../waveshell
|
||||
|
||||
replace github.com/kevinburke/ssh_config => github.com/wavetermdev/ssh_config v0.0.0-20240109090616-36c8da3d7376
|
||||
|
||||
@@ -2,6 +2,7 @@ github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVK
|
||||
github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
|
||||
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2 h1:7Ip0wMmLHLRJdrloDxZfhMm0xrLXZS8+COSu2bXmEQs=
|
||||
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@@ -27,6 +28,10 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY
|
||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
github.com/hashicorp/go-set/v2 v2.1.0 h1:iERPCQWks+I+4bTgy0CT2myZsCqNgBg79ZHqwniohXo=
|
||||
github.com/hashicorp/go-set/v2 v2.1.0/go.mod h1:6q4nh8UCVZODn2tJ5RbJi8+ki7pjZBsAEYGt6yaGeTo=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
|
||||
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
@@ -39,13 +44,19 @@ github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 h1:3RPlVWzZ/PDqmVuf/FKHARG5EMid/tl7cv54Sw/QRVY=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/sashabaranov/go-openai v1.9.0 h1:NoiO++IISxxJ1pRc0n7uZvMGMake0G+FJ1XPwXtprsA=
|
||||
github.com/sashabaranov/go-openai v1.9.0/go.mod h1:lj5b/K+zjTSFxVLijLSTDZuP7adOgerWeFyZLUhAKRg=
|
||||
github.com/sawka/txwrap v0.1.2 h1:v8xS0Z1LE7/6vMZA81PYihI+0TSR6Zm1MalzzBIuXKc=
|
||||
github.com/sawka/txwrap v0.1.2/go.mod h1:T3nlw2gVpuolo6/XEetvBbk1oMXnY978YmBFy1UyHvw=
|
||||
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
|
||||
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||
github.com/wavetermdev/ssh_config v0.0.0-20240109090616-36c8da3d7376/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
|
||||
@@ -59,6 +70,8 @@ golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
mvdan.cc/sh/v3 v3.7.0 h1:lSTjdP/1xsddtaKfGg7Myu7DnlHItd3/M2tomOcNNBg=
|
||||
mvdan.cc/sh/v3 v3.7.0/go.mod h1:K2gwkaesF/D7av7Kxl0HbF5kGOd2ArupNTX3X44+8l8=
|
||||
|
||||
@@ -0,0 +1,168 @@
|
||||
package newton
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/hashicorp/go-set/v2"
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/utilfn"
|
||||
"mvdan.cc/sh/v3/syntax"
|
||||
)
|
||||
|
||||
// Recurse through a syntax.Stmt and find the last statement that wraps an expression.
|
||||
func findLastStmtWithExpr(stmt *syntax.Stmt) *syntax.Stmt {
|
||||
switch x := stmt.Cmd.(type) {
|
||||
case *syntax.BinaryCmd:
|
||||
if x.Y != nil {
|
||||
return findLastStmtWithExpr(x.Y)
|
||||
} else {
|
||||
return findLastStmtWithExpr(x.X)
|
||||
}
|
||||
case *syntax.CallExpr:
|
||||
return stmt
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// Parse a syntax.Word into a complete string.
|
||||
func getWordStr(word *syntax.Word) string {
|
||||
wordBuf := new(bytes.Buffer)
|
||||
for _, part := range word.Parts {
|
||||
switch x := part.(type) {
|
||||
case *syntax.Lit:
|
||||
wordBuf.WriteString(x.Value)
|
||||
case *syntax.SglQuoted:
|
||||
wordBuf.WriteString(fmt.Sprintf("'%s'", x.Value))
|
||||
case *syntax.DblQuoted:
|
||||
wordBuf.WriteByte('"')
|
||||
for _, part := range x.Parts {
|
||||
switch x := part.(type) {
|
||||
case *syntax.Lit:
|
||||
wordBuf.WriteString(x.Value)
|
||||
case *syntax.ParamExp:
|
||||
wordBuf.WriteString(x.Param.Value)
|
||||
}
|
||||
}
|
||||
wordBuf.WriteByte('"')
|
||||
}
|
||||
}
|
||||
return wordBuf.String()
|
||||
}
|
||||
|
||||
type CmdList []string
|
||||
type CmdSet struct {
|
||||
// OnceValue gets the CmdSet singleton.
|
||||
get func() *set.Set[string]
|
||||
}
|
||||
|
||||
const NewtonDir = "/Users/evan/source/newton/x"
|
||||
|
||||
// Initialize the CmdSet singleton.
|
||||
func getCmdSet() CmdSet {
|
||||
return CmdSet{
|
||||
get: sync.OnceValue[*set.Set[string]](func() *set.Set[string] {
|
||||
var cmds CmdList
|
||||
err := utilfn.ReadJsonFile(filepath.Join(NewtonDir, "index.json"), &cmds)
|
||||
if err != nil {
|
||||
fmt.Printf("error reading json file: %v\n", err)
|
||||
return nil
|
||||
}
|
||||
return set.From[string](cmds)
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
// Parses a command string to exract the last command and its arguments.
|
||||
func parseCommand(cmdStr string) (cmd string, args []string, err error) {
|
||||
cmdReader := strings.NewReader(cmdStr)
|
||||
parser := syntax.NewParser(syntax.Variant(syntax.LangBash))
|
||||
file, err := parser.Parse(cmdReader, "")
|
||||
if err != nil {
|
||||
return "", nil, fmt.Errorf("error parsing command: %w", err)
|
||||
}
|
||||
|
||||
// syntax.DebugPrint(os.Stdout, file)
|
||||
|
||||
// Take the last statement and recurse it to find the last statement that wraps an expression.
|
||||
lastStmt := findLastStmtWithExpr(file.Stmts[len(file.Stmts)-1])
|
||||
|
||||
if lastStmt == nil {
|
||||
return "", nil, fmt.Errorf("error finding last statement")
|
||||
}
|
||||
|
||||
if lastStmt.Redirs != nil {
|
||||
fmt.Println("contains redirects, ignoring parsing")
|
||||
return "", nil, nil
|
||||
}
|
||||
|
||||
cmd = getWordStr(lastStmt.Cmd.(*syntax.CallExpr).Args[0])
|
||||
args = make([]string, len(lastStmt.Cmd.(*syntax.CallExpr).Args)-1)
|
||||
|
||||
for i, arg := range lastStmt.Cmd.(*syntax.CallExpr).Args[1:] {
|
||||
args[i] = getWordStr(arg)
|
||||
}
|
||||
|
||||
return cmd, args, nil
|
||||
}
|
||||
|
||||
type CmdSuggestion interface{}
|
||||
|
||||
func getCmdSuggestion(cmd string) (CmdSuggestion, error) {
|
||||
var cmdSuggestion CmdSuggestion
|
||||
err := utilfn.ReadJsonFile(filepath.Join(NewtonDir, fmt.Sprintf("%s.json", cmd)), &cmdSuggestion)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error reading json file: %v", err)
|
||||
}
|
||||
return cmdSuggestion, nil
|
||||
}
|
||||
|
||||
// CmdSet singleton.
|
||||
var cmdSet = getCmdSet()
|
||||
|
||||
// GetSuggestions takes a StrWithPos and returns autocomplete suggestions for the command.
|
||||
func GetSuggestions(cmdStr utilfn.StrWithPos) error {
|
||||
if cmdStr.Str == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
// cmd, args, err := parseCommand(cmdStr.Str)
|
||||
// if err != nil {
|
||||
// return fmt.Errorf("error parsing command: %w", err)
|
||||
// }
|
||||
|
||||
// cmdAlt := ""
|
||||
// if len(args) > 0 {
|
||||
// cmdAlt = fmt.Sprintf("%s/%s", cmd, args[0])
|
||||
// }
|
||||
|
||||
// fmt.Printf("cmd: %s\n", cmd)
|
||||
// fmt.Printf("args: %v\n", args)
|
||||
|
||||
// if cmdSet.get().Contains(cmdAlt) {
|
||||
// // If the cmdAlt is available, use it and adjust the args.
|
||||
// fmt.Printf("cmdAlt \"%s\" is available\n", cmdAlt)
|
||||
// cmd = cmdAlt
|
||||
// args = args[1:]
|
||||
// } else if cmdSet.get().Contains(cmd) {
|
||||
// fmt.Printf("cmd \"%s\" available\n", cmd)
|
||||
// } else {
|
||||
// fmt.Printf("neither cmd \"%s\" nor cmdAlt \"%s\" are available\n", cmd, cmdAlt)
|
||||
// return nil
|
||||
// }
|
||||
|
||||
// fmt.Printf("using cmd \"%s\" and args \"%v\"", cmd, args)
|
||||
// cmdSuggestion, err := getCmdSuggestion(cmd)
|
||||
// if err != nil {
|
||||
// return fmt.Errorf("error getting cmd suggestion: %w", err)
|
||||
// }
|
||||
|
||||
// fmt.Printf("cmdSuggestion: %v\n", cmdSuggestion)
|
||||
cmdCobra = cobra.
|
||||
carapace.Gen(cmdStr.Str)
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package newton
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/utilfn"
|
||||
)
|
||||
|
||||
func TestNewtonParse(t *testing.T) {
|
||||
testStr := utilfn.StrWithPos{
|
||||
// Str: `echo "hello world" | cat -n | grep "hello" | sed 's/hello/hi/g' > /tmp/test.txt`,
|
||||
// Str: `git commit -m "hello world"`,
|
||||
Str: `gcloud active-directory`,
|
||||
Pos: 1,
|
||||
}
|
||||
err := GetSuggestions(testStr)
|
||||
t.Error()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/wavetermdev/waveterm/waveshell/pkg/packet"
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/mapqueue"
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/newton"
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/remote"
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/scpacket"
|
||||
"github.com/wavetermdev/waveterm/wavesrv/pkg/sstore"
|
||||
@@ -276,6 +277,9 @@ func (ws *WSState) processMessage(msgBytes []byte) error {
|
||||
}
|
||||
// no need for goroutine for memory ops
|
||||
sstore.ScreenMemSetCmdInputText(cmdInputPk.ScreenId, cmdInputPk.Text, cmdInputPk.SeqNum)
|
||||
go func() {
|
||||
newton.GetSuggestions(cmdInputPk.Text)
|
||||
}()
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("got ws bad message: %v", pk.GetType())
|
||||
|
||||
@@ -4,10 +4,15 @@
|
||||
package utilfn
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"crypto/sha1"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
@@ -247,3 +252,33 @@ func AddIntSlice(vals ...int) (int, error) {
|
||||
}
|
||||
return rtn, nil
|
||||
}
|
||||
|
||||
// Read a file into a byte slice.
|
||||
func ReadFileToBuf(path string) ([]byte, error) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error opening file: %v", err)
|
||||
}
|
||||
// Get the file size
|
||||
stat, err := file.Stat()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error getting file stat: %v", err)
|
||||
}
|
||||
|
||||
// Read the file into a byte slice
|
||||
bs := make([]byte, stat.Size())
|
||||
_, err = bufio.NewReader(file).Read(bs)
|
||||
if err != nil && err != io.EOF {
|
||||
return nil, fmt.Errorf("error reading file: %v", err)
|
||||
}
|
||||
return bs, nil
|
||||
}
|
||||
|
||||
// Read a JSON file into a struct.
|
||||
func ReadJsonFile(path string, v interface{}) error {
|
||||
bs, err := ReadFileToBuf(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return json.Unmarshal(bs, v)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user