1
0
mirror of https://shylinux.com/x/icebergs synced 2025-05-05 12:47:03 +08:00

opt sh.go

This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-03-04 16:46:44 +08:00
parent b15547d281
commit e460316ede
12 changed files with 93 additions and 26 deletions

View File

@ -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))

View File

@ -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"

View File

@ -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...]

View File

@ -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) {

View File

@ -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:])
}

View File

@ -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]) {

View File

@ -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) {

View File

@ -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, "")
}},

View File

@ -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
`

View File

@ -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])

View File

@ -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)
}

View File

@ -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)...)))))