From e460316ede50f4b0919057f267c88022288728ba Mon Sep 17 00:00:00 2001 From: shylinux Date: Sat, 4 Mar 2023 16:46:44 +0800 Subject: [PATCH] opt sh.go --- base/nfs/dir.go | 9 +++++++++ base/ssh/script.go | 1 + base/web/render.go | 3 +-- base/web/serve.go | 8 ++++++++ core/chat/cmd.go | 4 ++++ core/chat/favor.go | 20 ++++++++++++++++++-- core/chat/iframe.go | 2 +- core/code/inner.go | 4 ++-- core/code/sh.go | 29 ++++++++++++++++++----------- core/code/vimer.go | 17 +++++++++++++++-- core/code/xterm.go | 17 ++++++++++++----- misc/git/server.go | 5 ++++- 12 files changed, 93 insertions(+), 26 deletions(-) diff --git a/base/nfs/dir.go b/base/nfs/dir.go index 54fe19c1..1f092813 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -195,6 +195,15 @@ func init() { }) } +func SplitPath(m *ice.Message, p string) []string { + if ls := kit.Split(p, ice.PS); len(ls) == 1 { + return []string{PWD, ls[0]} + } else if ls[0] == ice.USR { + return []string{strings.Join(ls[:2], ice.PS) + ice.PS, strings.Join(ls[2:], ice.PS)} + } else { + return []string{strings.Join(ls[:1], ice.PS) + ice.PS, strings.Join(ls[1:], ice.PS)} + } +} func Dir(m *ice.Message, sort string) *ice.Message { m.Copy(m.Cmd(DIR, PWD, kit.Dict(DIR_TYPE, TYPE_DIR)).Sort(sort)) m.Copy(m.Cmd(DIR, PWD, kit.Dict(DIR_TYPE, TYPE_CAT)).Sort(sort)) diff --git a/base/ssh/script.go b/base/ssh/script.go index 31e07a88..735695b3 100644 --- a/base/ssh/script.go +++ b/base/ssh/script.go @@ -206,6 +206,7 @@ func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server const ( MESSAGE = "message" + SHELL = "shell" FRAME = "frame" STDIO = "stdio" PS1 = "PS1" diff --git a/base/web/render.go b/base/web/render.go index 46663b92..e833d4be 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -26,6 +26,7 @@ const ( CODE_VIMER = "web.code.vimer" CODE_INNER = "web.code.inner" + CODE_XTERM = "web.code.xterm" WIKI_WORD = "web.wiki.word" ) @@ -45,8 +46,6 @@ func Render(m *ice.Message, cmd string, args ...ice.Any) bool { RenderCookie(m, arg[0], arg[1:]...) case STATUS, ice.RENDER_STATUS: // [code [text]] - m.Debug("what %v", m.FormatStack(1, 10)) - m.Debug("what %v", arg) RenderStatus(m.W, kit.Int(kit.Select("200", arg, 0)), strings.Join(kit.Slice(arg, 1), " ")) case ice.RENDER_REDIRECT: // url [arg...] diff --git a/base/web/serve.go b/base/web/serve.go index f40cbbcc..84df4085 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -255,6 +255,14 @@ func init() { m.RenderRedirect("/") }}, PP(ice.REQUIRE): {Name: "/require/shylinux.com/x/volcanos/proto.js", Help: "代码库", Hand: func(m *ice.Message, arg ...string) { + if len(arg) < 4 { + m.RenderStatusBadRequest() + return + } + if path.Join(arg[:3]...) == ice.Info.Make.Module && nfs.ExistsFile(m, path.Join(arg[3:]...)) { + m.RenderDownload(path.Join(arg[3:]...)) + return + } cache := kit.Select(ice.USR_REQUIRE, m.Cmdx(cli.SYSTEM, "go", "env", "GOMODCACHE")) p := path.Join(cache, path.Join(arg...)) if !nfs.ExistsFile(m, p) { diff --git a/core/chat/cmd.go b/core/chat/cmd.go index 4bb72e4e..81d8150d 100644 --- a/core/chat/cmd.go +++ b/core/chat/cmd.go @@ -51,6 +51,10 @@ func init() { if len(arg[0]) == 0 || arg[0] == "" { return } + if m.IsCliUA() { + m.Cmdy(arg, m.Optionv(ice.ARG)).RenderResult() + return + } if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 { web.RenderCmd(m, arg[0], arg[1:]) } diff --git a/core/chat/favor.go b/core/chat/favor.go index f83477a9..971bd51a 100644 --- a/core/chat/favor.go +++ b/core/chat/favor.go @@ -9,6 +9,7 @@ import ( "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/ssh" "shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" @@ -37,7 +38,7 @@ func init() { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch mdb.HashInputs(m, arg); arg[0] { case mdb.TYPE: - m.Push(arg[0], mdb.TEXT, ctx.INDEX) + m.Push(arg[0], web.LINK, nfs.FILE, mdb.TEXT, ctx.INDEX, ssh.SHELL) case mdb.NAME: switch m.Option(mdb.TYPE) { case ctx.INDEX: @@ -81,7 +82,18 @@ func init() { }}, ctx.INDEX: {Help: "命令", Hand: func(m *ice.Message, arg ...string) { msg := mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)) - ctx.ProcessField(m, msg.Append(mdb.NAME), kit.Simple(kit.UnMarshal(msg.Option(mdb.TEXT))), arg...) + ls := kit.Split(msg.Option(mdb.TEXT)) + ctx.ProcessField(m, ls[0], ls[1:], arg...) + }}, + "vimer": {Help: "源码", Hand: func(m *ice.Message, arg ...string) { + args := []string{} + if len(arg) == 0 || arg[0] != ice.RUN { + args = nfs.SplitPath(m, m.Option(mdb.TEXT)) + } + ctx.ProcessField(m, web.CODE_VIMER, args, arg...) + }}, + "xterm": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { + ctx.ProcessField(m, web.CODE_XTERM, []string{m.Option(mdb.TEXT)}, arg...) }}, ice.RUN: {Hand: func(m *ice.Message, arg ...string) { m.Option(mdb.TYPE, mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)).Append(mdb.TYPE)) @@ -113,8 +125,12 @@ func init() { return } switch value[mdb.TYPE] { + case ssh.SHELL: + m.PushButton("xterm", mdb.REMOVE) case ctx.INDEX: m.PushButton(ctx.INDEX, mdb.REMOVE) + case nfs.FILE: + m.PushButton("vimer", mdb.REMOVE) default: if strings.HasPrefix(value[mdb.TEXT], ice.VAR_FILE) { if _favor_is_image(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_video(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_audio(m, value[mdb.NAME], value[mdb.TYPE]) { diff --git a/core/chat/iframe.go b/core/chat/iframe.go index 4670b134..7ab3ec55 100644 --- a/core/chat/iframe.go +++ b/core/chat/iframe.go @@ -32,7 +32,7 @@ func init() { FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) { switch arg[1] { case web.LINK: - m.PushButton(IFRAME, web.OPEN, mdb.REMOVE) + m.PushButton(IFRAME, mdb.REMOVE) } }}, FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) { diff --git a/core/code/inner.go b/core/code/inner.go index 957f135c..3816dd45 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -19,7 +19,7 @@ import ( func _inner_list(m *ice.Message, ext, file, dir string) { kit.If(aaa.Right(m, dir, file), func() { kit.If(nfs.IsSourceFile(m, ext), func() { m.Cmdy(nfs.CAT, path.Join(dir, file)) }) - kit.If(m.IsErrNotFound(), func() { _inner_show(m.RenderResult().SetResult(), ext, file, dir) }) + // kit.If(m.IsErrNotFound(), func() { _inner_show(m.RenderResult().SetResult(), ext, file, dir) }) }) } func _inner_show(m *ice.Message, ext, file, dir string) { @@ -124,7 +124,7 @@ func init() { } arg[1] = strings.Split(arg[1], ice.FS)[0] _inner_list(m, kit.Ext(arg[1]), arg[1], arg[0]) - m.Cmd(FAVOR, mdb.INSERT, mdb.ZONE, "_recent_file", nfs.PATH, arg[0], nfs.FILE, arg[1]) + // m.Cmd(FAVOR, mdb.INSERT, mdb.ZONE, "_recent_file", nfs.PATH, arg[0], nfs.FILE, arg[1]) m.Option(nfs.REPOS, kit.Join(m.Cmd("web.code.git.repos", ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Appendv(nfs.PATH))) ctx.DisplayLocal(m, "") }}, diff --git a/core/code/sh.go b/core/code/sh.go index 8473fb3e..08fd44d1 100644 --- a/core/code/sh.go +++ b/core/code/sh.go @@ -8,13 +8,16 @@ import ( "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/ssh" kit "shylinux.com/x/toolkits" ) -func _sh_exec(m *ice.Message, arg ...string) { - m.Cmdy(cli.SYSTEM, SH, "-c", kit.Format(_sh_template, m.Option(ice.MSG_USERHOST), m.Option(ice.MSG_USERPOD), path.Join(arg[2], arg[1]))) - m.StatusTime("script", kit.Renders(kit.Format(`export ctx_dev={{.Option "user.host"}}%s; temp=$(mktemp); wget -O $temp -q $ctx_dev; source $temp %s`, - kit.Select("", " ctx_pod="+m.Option(ice.MSG_USERPOD), m.Option(ice.MSG_USERPOD) != ""), path.Join(arg[2], arg[1])), m)) +func _sh_cmds(m *ice.Message, arg ...string) (string, string) { + cmds, text := kit.Select(SH, m.Config(ssh.SHELL)), kit.Format(strings.TrimSpace(_sh_cmd_template), m.Option(ice.MSG_USERHOST), m.Option(ice.MSG_USERPOD), path.Join(arg[2], arg[1])) + if head := kit.Select("", strings.Split(m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1])), ice.NL), 0); strings.HasPrefix(head, "#!") { + cmds = strings.TrimSpace(strings.TrimPrefix(head, "#!")) + } + return cmds, text } const SH = nfs.SH @@ -23,21 +26,25 @@ func init() { Index.MergeCommands(ice.Commands{ SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeActions(ice.Actions{ mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { - cmds, text := SH, kit.Format(_sh_template, m.Option(ice.MSG_USERHOST), m.Option(ice.MSG_USERPOD), path.Join(arg[2], arg[1])) - if strings.HasPrefix(text, "#!") { - // cmds = strings.TrimSpace(strings.SplitN(text, ice.NL, 2)[0][2:]) - } - _xterm_show(m, cmds, text) + cmds, text := _sh_cmds(m, arg...) + _xterm_show(m, cmds, text, path.Join(arg[2], arg[1])) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { - _sh_exec(m, arg...) + cmds, text := _sh_cmds(m, arg...) + m.Cmdy(cli.SYSTEM, cmds, "-c", text).Status(ssh.SHELL, strings.ReplaceAll(text, ice.NL, "; ")) }}, + TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_sh_template) }}, NAVIGATE: {Hand: func(m *ice.Message, arg ...string) { _c_tags(m, MAN, "ctags", "-a", "-R", nfs.PWD) }}, }, PlugAction())}, }) } var _sh_template = `#!/bin/sh -export ctx_dev=%s ctx_pod=%s ctx_mod=%s + +demo() { + echo "hello world" +} +` +var _sh_cmd_template = `export ctx_dev=%s ctx_pod=%s ctx_mod=%s temp=$(mktemp); if curl -V &>/dev/null; then curl -o $temp -fsSL $ctx_dev; else wget -O $temp -q $ctx_dev; fi && source $temp $ctx_mod ` diff --git a/core/code/vimer.go b/core/code/vimer.go index 500ec207..985d74ed 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -55,7 +55,17 @@ func init() { switch m.Option(ctx.ACTION) { case web.DREAM, AUTOGEN, XTERM: m.Cmdy(m.Option(ctx.ACTION), mdb.INPUTS, arg) - case web.WEBSITE, nfs.SCRIPT: + case nfs.MODULE: + m.Cmdy(AUTOGEN, mdb.INPUTS, arg) + case nfs.SCRIPT: + // p := path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)) + p := path.Join(m.Option(nfs.FILE)) + for _, ext := range []string{"sh", "shy", "py", "js"} { + m.Push(nfs.PATH, kit.ExtChange(p, ext)) + } + m.Option(nfs.DIR_REG, kit.FileReg("(sh|shy|py|js)")) + nfs.DirDeepAll(m, "src/", "./", nil, nfs.PATH) + case web.WEBSITE: m.Cmdy(COMPLETE, mdb.FOREACH, kit.Select("", arg, 1), m.Option(ctx.ACTION)) case "extension": nfs.DirDeepAll(m, "usr/volcanos/plugin/local/code/", "inner/", nil, nfs.PATH) @@ -106,6 +116,9 @@ func init() { } }}, nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, arg[0]) }}, + nfs.MODULE: {Name: "create name*=h2 help=示例 type*=Zone,Hash,Data,Code main*=main.go zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(AUTOGEN, nfs.MODULE, arg) + }}, nfs.SCRIPT: {Name: "script file*=hi/hi.js", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DEFS, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)), m.Cmdx("", TEMPLATE)) }}, @@ -115,7 +128,7 @@ func init() { web.DREAM: {Name: "dream name*=hi repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.DREAM, cli.START, arg) }}, - nfs.REPOS: {Name: "repos", Help: "仓库", Hand: func(m *ice.Message, arg ...string) { + nfs.REPOS: {Help: "仓库", Hand: func(m *ice.Message, arg ...string) { m.Option("view", "change") m.Cmd("web.code.git.status", func(value ice.Maps) { m.Push(mdb.TYPE, value[mdb.TYPE]) diff --git a/core/code/xterm.go b/core/code/xterm.go index b545706f..97529ab6 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -45,7 +45,8 @@ func _xterm_get(m *ice.Message, h string) _xterm { tty, err := pty.Start(cmd) m.Assert(err) m.Go(func() { - defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) }) + // defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) }) + defer mdb.HashRemove(m, mdb.HASH, h) defer tty.Close() // m.Option("log.disable", ice.TRUE) buf := make([]byte, ice.MOD_BUFS) @@ -85,7 +86,8 @@ func init() { } }}, mdb.CREATE: {Name: "create type=sh name text theme:textarea", Hand: func(m *ice.Message, arg ...string) { - mdb.HashCreate(m, mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0], m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT, "theme")) + m.Debug("what %v", m.FormatChain()) + mdb.HashCreate(m, mdb.NAME, m.OptionDefault(mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0]), m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT, web.THEME)) }}, "resize": {Hand: func(m *ice.Message, arg ...string) { _xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80")) @@ -112,13 +114,18 @@ func init() { if mdb.HashSelect(m, arg...); len(arg) == 0 { m.PushAction(web.WEBSITE, mdb.REMOVE).Action(mdb.CREATE, mdb.PRUNES) } else { - m.Action(INSTALL, "debug", "proxy", "波浪线", "反引号") + if m.Length() == 0 { + arg[0] = m.Cmdx("", mdb.CREATE, mdb.TYPE, arg[0]) + mdb.HashSelect(m, arg[0]) + m.Push(mdb.HASH, arg[0]) + } + m.Action(INSTALL, "debug", "proxy") ctx.DisplayLocal(m, "") } }}, }) } -func _xterm_show(m *ice.Message, cmds, text string) { - m.Cmdy(ctx.COMMAND, XTERM).Push(ctx.ARGS, kit.Format([]string{m.Cmdx(XTERM, mdb.CREATE, mdb.TYPE, cmds, mdb.TEXT, text)})).ProcessField(XTERM) +func _xterm_show(m *ice.Message, cmds, text string, arg ...string) { + m.Cmdy(ctx.COMMAND, XTERM).Push(ctx.ARGS, kit.Format([]string{m.Cmdx(XTERM, mdb.CREATE, mdb.TYPE, cmds, mdb.NAME, kit.Select("", arg, 0), mdb.TEXT, text)})).ProcessField(XTERM) } diff --git a/misc/git/server.go b/misc/git/server.go index d7a9a717..dadb7361 100644 --- a/misc/git/server.go +++ b/misc/git/server.go @@ -99,7 +99,7 @@ func init() { }) return } - if !m.IsCliUA() || strings.Contains(arg[0], ice.AT) { + if !m.IsCliUA() || strings.Contains(arg[0], ice.AT) || arg[1] == "src" { if strings.Contains(arg[0], ice.AT) { ls := strings.Split(arg[0], ice.AT) _repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, ls[0]), "master", ls[1], path.Join(arg[1:]...)) @@ -107,6 +107,9 @@ func init() { } else if strings.HasPrefix(arg[1], "v") && strings.Contains(arg[1], ice.PT) { _repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, arg[0]), "master", arg[1], path.Join(arg[2:]...)) m.RenderResult() + } else if arg[1] == "src" { + _repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, arg[0]), "master", "", path.Join(arg[1:]...)) + m.RenderResult() } else { web.RenderCmds(m, kit.Dict(ctx.DISPLAY, "/plugin/local/code/repos.js", ctx.INDEX, "web.code.git.inner", ctx.ARGS, kit.List(strings.TrimSuffix(arg[0], ".git"), arg[1], "pwd", kit.Select("README.md", path.Join(kit.Slice(arg, 2)...)))))