From 45c782207f49dc06f3d0f610021d4301c9eeeda4 Mon Sep 17 00:00:00 2001 From: shylinux Date: Thu, 9 Mar 2023 11:39:32 +0800 Subject: [PATCH] opt code --- base/cli/system.go | 24 +++++++++++++++-- base/log/debug.go | 2 +- base/mdb/mdb.go | 1 + base/nfs/cat.go | 4 ++- base/nfs/dir.go | 21 ++++++++++++++- base/nfs/tar.go | 2 +- base/tcp/host.go | 10 ++++++++ base/web/broad.go | 19 +++++++------- base/web/dream.go | 7 +++++ base/web/option.go | 8 +++++- base/web/space.go | 9 ++++--- core/chat/favor.go | 18 ++++++------- core/chat/search.go | 13 +++++++++- core/code/compile.go | 16 +++++++----- core/code/inner.go | 11 +++----- core/code/install.go | 3 +-- core/code/publish.go | 45 ++++++++++++-------------------- core/code/sh.go | 4 +++ core/code/upgrade.go | 13 +++++++--- core/code/vimer.go | 61 +++++++++++++++++++++++++++----------------- core/code/xterm.go | 4 +-- core/team/plan.go | 2 +- meta.go | 23 ++++++++++++----- misc/git/server.go | 4 ++- misc/tmux/session.go | 18 +++++++++++-- 25 files changed, 228 insertions(+), 114 deletions(-) diff --git a/base/cli/system.go b/base/cli/system.go index 040aa3b3..1c2d19b2 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -14,6 +14,7 @@ import ( "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/tcp" kit "shylinux.com/x/toolkits" "shylinux.com/x/toolkits/file" ) @@ -161,8 +162,9 @@ const ( CMD_ERR = "cmd_err" CMD_OUT = "cmd_out" - MAN = "man" - GREP = "grep" + MAN = "man" + GREP = "grep" + OPENS = "opens" ) const SYSTEM = "system" @@ -170,6 +172,24 @@ const SYSTEM = "system" func init() { Index.MergeCommands(ice.Commands{ SYSTEM: {Name: "system cmd", Help: "系统命令", Actions: ice.MergeActions(ice.Actions{ + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if runtime.GOOS == DARWIN && tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + list := map[string]bool{"Terminal.app": true, "Docker.app": true, "Google Chrome.app": true} + for _, p := range strings.Split(m.Cmdx("", nfs.SH, "-c", `ps aux|grep /Applications/|grep -v Cache|grep -v Helper|grep -v Widget|grep -v Extension|grep -v Chrome|grep -v com.app|grep -v grep|grep -o "[^/]*.app"|sort|uniq`), ice.NL) { + list[p] = true + } + for p := range list { + m.PushSearch(mdb.TYPE, OPENS, mdb.TEXT, p) + } + } + if arg[0] == m.CommandKey() && arg[1] == OPENS { + for _, p := range []string{"/Applications", "/System/Applications", "/System/Applications/Utilities"} { + m.Cmd(nfs.DIR, p, mdb.NAME, func(value ice.Maps) { m.PushSearch(mdb.TEXT, path.Join(p, value[mdb.NAME]), value) }) + } + } + } + }}, nfs.PUSH: {Hand: func(m *ice.Message, arg ...string) { for _, p := range arg { if !strings.Contains(m.Cmdx(nfs.CAT, ice.ETC_PATH), p) { diff --git a/base/log/debug.go b/base/log/debug.go index 0d56f01f..b2b0aa31 100644 --- a/base/log/debug.go +++ b/base/log/debug.go @@ -15,7 +15,7 @@ const DEBUG = "debug" func init() { Index.MergeCommands(ice.Commands{ - DEBUG: {Name: "debug level=watch,bench,debug,error,watch offset filter auto doc", Help: "后台日志", Actions: ice.Actions{ + DEBUG: {Name: "debug level=error,bench,debug,error,watch offset filter auto doc", Help: "后台日志", Actions: ice.Actions{ "doc": {Help: "文档", Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen("https://pkg.go.dev/std") }}, }, Hand: func(m *ice.Message, arg ...string) { offset := kit.Int(kit.Select("0", arg, 1)) diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index f9846d6c..3dbe0930 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -118,6 +118,7 @@ const ( FIELDS = "fields" PARAMS = "params" + RECENT = "recent" INPUTS = "inputs" CREATE = "create" REMOVE = "remove" diff --git a/base/nfs/cat.go b/base/nfs/cat.go index e127ad70..968d5cef 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -166,7 +166,9 @@ func OptionLoad(m *ice.Message, file string) *ice.Message { return m } -func Template(m *ice.Message, file string) string { return kit.Renders(TemplateText(m, file), m) } +func Template(m *ice.Message, file string, arg ...ice.Any) string { + return kit.Renders(kit.Format(TemplateText(m, file), arg...), m) +} func TemplateText(m *ice.Message, file string) string { return m.Cmdx(CAT, path.Join(ice.SRC_TEMPLATE, m.PrefixKey(), path.Base(file))) } diff --git a/base/nfs/dir.go b/base/nfs/dir.go index db0d204d..9b3110f9 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -4,6 +4,7 @@ import ( "os" "path" "regexp" + "runtime" "strings" ice "shylinux.com/x/icebergs" @@ -152,7 +153,7 @@ const ( DIR_DEEP = "dir_deep" DIR_REG = "dir_reg" - DIR_DEF_FIELDS = "time,path,size,action" + DIR_DEF_FIELDS = "time,size,path,action" DIR_WEB_FIELDS = "time,size,path,link,action" DIR_CLI_FIELDS = "path,size,time" ) @@ -165,6 +166,8 @@ const ( NAME = "name" SIZE = "size" LINE = "line" + + OPENS = "opens" ) const DIR = "dir" @@ -175,6 +178,22 @@ func init() { aaa.White(m, ice.SRC, ice.BIN, ice.USR) aaa.Black(m, ice.USR_LOCAL) }}, mdb.UPLOAD: {}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + m.Debug("what ") + if arg[0] == mdb.FOREACH && arg[1] == "" && runtime.GOOS == "darwin" && m.Cmdx("host", "islocal", m.Option(ice.MSG_USERIP)) == ice.OK { + m.Debug("what ") + for _, p := range []string{"Desktop", "Documents", "Downloads", "Pictures"} { + p := kit.HomePath(p) + m.Cmd(DIR, PWD, mdb.NAME, mdb.TIME, kit.Dict(DIR_ROOT, p)).SortTimeR(mdb.TIME).TablesLimit(5, func(value ice.Maps) { + name := value[mdb.NAME] + if len(kit.TrimExt(name)) > 30 { + name = name[:10] + ".." + name[len(name)-10:] + } + m.PushSearch(mdb.TYPE, OPENS, mdb.NAME, name, mdb.TEXT, path.Join(p, value[mdb.NAME])) + }) + } + } + }}, TRASH: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(TRASH, mdb.CREATE, m.Option(PATH)) }}, }, Hand: func(m *ice.Message, arg ...string) { root, dir := kit.Select(PWD, m.Option(DIR_ROOT)), kit.Select(PWD, arg, 0) diff --git a/base/nfs/tar.go b/base/nfs/tar.go index e7e2cd1f..a4317415 100644 --- a/base/nfs/tar.go +++ b/base/nfs/tar.go @@ -85,7 +85,7 @@ func init() { } if n, e := io.Copy(f, r); !m.Warn(e) { size += n - m.Logs(mdb.EXPORT, LINE, i, SIZE, kit.FmtSize(size), FILE, p, SIZE, kit.FmtSize(n)) + // m.Logs(mdb.EXPORT, LINE, i, SIZE, kit.FmtSize(size), FILE, p, SIZE, kit.FmtSize(n)) os.Chmod(p, os.FileMode(h.Mode)) } } diff --git a/base/tcp/host.go b/base/tcp/host.go index 0a04bf63..eaab0012 100644 --- a/base/tcp/host.go +++ b/base/tcp/host.go @@ -50,6 +50,7 @@ const ( ISLOCAL = "islocal" PUBLISH = "publish" + GATEWAY = "gateway" ) const HOST = "host" @@ -65,6 +66,12 @@ func init() { aaa.BLACK: {Name: "black name text", Help: "黑名单", Hand: func(m *ice.Message, arg ...string) { mdb.HashCreate(m, mdb.TYPE, m.ActionKey(), m.OptionSimple(mdb.NAME, mdb.TEXT)) }}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + ip := m.Cmd("", GATEWAY).Append(aaa.IP) + m.PushSearch(mdb.TYPE, GATEWAY, mdb.NAME, ip, mdb.TEXT, "http://"+ip) + } + }}, ISLOCAL: {Hand: func(m *ice.Message, arg ...string) { if arg[0] = strings.Split(strings.TrimPrefix(arg[0], "["), "]")[0]; arg[0] == "::1" || strings.HasPrefix(arg[0], "127.") { m.Echo(ice.OK) @@ -80,6 +87,9 @@ func init() { } m.Echo(arg[0]) }}, + GATEWAY: {Hand: func(m *ice.Message, arg ...string) { + m.Push(aaa.IP, kit.Keys(kit.Slice(strings.Split(m.Cmd("").Append(aaa.IP), ice.PT), 0, 3), "1")) + }}, }, mdb.HashAction(mdb.SHORT, mdb.TEXT), mdb.ClearHashOnExitAction()), Hand: func(m *ice.Message, arg ...string) { _host_list(m, kit.Select("", arg, 0)) }}, diff --git a/base/web/broad.go b/base/web/broad.go index b92c8ea7..0d2a4496 100644 --- a/base/web/broad.go +++ b/base/web/broad.go @@ -76,19 +76,18 @@ func init() { Index.MergeCommands(ice.Commands{ BROAD: {Name: "broad hash auto", Help: "广播", Actions: ice.MergeActions(ice.Actions{ mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { - host := m.Cmd(tcp.HOST).Append(aaa.IP) - domain := OptionUserWeb(m).Hostname() - m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { - if values[tcp.HOST] == host { - values[tcp.HOST] = domain + if arg[0] == mdb.FOREACH && arg[1] == "" { + host, domain := m.Cmd(tcp.HOST).Append(aaa.IP), OptionUserWeb(m).Hostname() + m.Cmd("", ice.OptionFields(""), func(value ice.Maps) { + if value[tcp.HOST] == host { + value[tcp.HOST] = domain } - switch values[mdb.TYPE] { + switch value[mdb.TYPE] { case "sshd": - m.PushSearch(mdb.NAME, ice.Render(m, ice.RENDER_SCRIPT, kit.Format("ssh -p %s %s@%s", values[tcp.PORT], m.Option(ice.MSG_USERNAME), values[tcp.HOST])), - mdb.TEXT, kit.Format("http://%s:%s", values[tcp.HOST], values[tcp.PORT]), values) + m.PushSearch(mdb.NAME, ice.Render(m, ice.RENDER_SCRIPT, kit.Format("ssh -p %s %s@%s", value[tcp.PORT], m.Option(ice.MSG_USERNAME), value[tcp.HOST])), + mdb.TEXT, kit.Format("http://%s:%s", value[tcp.HOST], value[tcp.PORT]), value) default: - m.PushSearch(mdb.TEXT, kit.Format("http://%s:%s", values[tcp.HOST], values[tcp.PORT]), values) + m.PushSearch(mdb.TEXT, kit.Format("http://%s:%s", value[tcp.HOST], value[tcp.PORT]), value) } }) } diff --git a/base/web/dream.go b/base/web/dream.go index 2425d269..3291a961 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -103,6 +103,13 @@ const DREAM = "dream" func init() { Index.MergeCommands(ice.Commands{ DREAM: {Name: "dream name path auto create", Help: "梦想家", Actions: ice.MergeActions(ice.Actions{ + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + m.Cmd("", ice.OptionFields(), func(value ice.Maps) { + m.PushSearch(mdb.TEXT, MergePods(m, value[mdb.NAME]), value) + }) + } + }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch arg[0] { case mdb.NAME, nfs.TEMPLATE: diff --git a/base/web/option.go b/base/web/option.go index 0d420a3c..e50b6ce4 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -133,11 +133,17 @@ func MergeURL2(m Message, url string, arg ...ice.Any) string { return kit.MergeURL2(m.Option(ice.MSG_USERWEB), url, arg...) } func MergeLink(m Message, url string, arg ...ice.Any) string { - return strings.Split(MergeURL2(m, url, arg...), "?")[0] + return strings.Split(MergeURL2(m, url, arg...), ice.QS)[0] } func MergePod(m Message, pod string, arg ...ice.Any) string { return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...) } +func MergePods(m Message, pod string, arg ...ice.Any) string { + return kit.MergeURL(strings.Split(MergePod(m, pod), ice.QS)[0], arg...) +} +func MergePodCmds(m Message, pod, cmd string, arg ...ice.Any) string { + return kit.MergeURL(strings.Split(MergePodCmd(m, pod, cmd), ice.QS)[0], arg...) +} func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string { p := "/chat" p += path.Join("/pod/", kit.Keys(m.Option(ice.MSG_USERPOD), pod)) diff --git a/base/web/space.go b/base/web/space.go index ffee3524..0f6821a9 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -75,7 +75,7 @@ func _space_handle(m *ice.Message, safe bool, name string, conn *websocket.Conn) } msg := m.Spawn(b) source, target := kit.Simple(msg.Optionv(ice.MSG_SOURCE), name), kit.Simple(msg.Optionv(ice.MSG_TARGET)) - msg.Log("recv", "%v->%v %v %v", source, target, msg.Detailv(), msg.FormatMeta()) + // msg.Log("recv", "%v->%v %v %v", source, target, msg.Detailv(), msg.FormatMeta()) if next := msg.Option(ice.MSG_TARGET); next == "" || len(target) == 0 { if msg.Optionv(ice.MSG_HANDLE, ice.TRUE); safe { // 下行命令 gdb.Event(msg, SPACE_LOGIN) @@ -184,13 +184,14 @@ func init() { _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) }}, mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { - m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + m.Cmd("", ice.OptionFields(""), func(values ice.Maps) { switch values[mdb.TYPE] { case MASTER: m.PushSearch(mdb.TEXT, m.Cmd(SPIDE, values[mdb.NAME], ice.Maps{ice.MSG_FIELDS: ""}).Append(CLIENT_ORIGIN), values) - case SERVER, WORKER: + case SERVER: m.PushSearch(mdb.TEXT, kit.Format(tcp.PublishLocalhost(m, strings.Split(MergePod(m, values[mdb.NAME]), ice.QS)[0])), values) + case aaa.LOGIN: } }) } diff --git a/core/chat/favor.go b/core/chat/favor.go index e467ba98..17516f55 100644 --- a/core/chat/favor.go +++ b/core/chat/favor.go @@ -35,10 +35,15 @@ const FAVOR = "favor" func init() { Index.MergeCommands(ice.Commands{ FAVOR: {Name: "favor hash auto create getClipboardData getLocation scanQRCode record1 record2 upload", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{ + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + m.Cmd("", ice.OptionFields("")).Tables(func(value ice.Maps) { m.PushSearch(value) }) + } + }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch mdb.HashInputs(m, arg); arg[0] { case mdb.TYPE: - m.Push(arg[0], web.LINK, nfs.FILE, mdb.TEXT, ctx.INDEX, ssh.SHELL) + m.Push(arg[0], web.LINK, nfs.FILE, mdb.TEXT, ctx.INDEX, ssh.SHELL, cli.OPENS) case mdb.NAME: switch m.Option(mdb.TYPE) { case ctx.INDEX: @@ -59,11 +64,6 @@ func init() { } mdb.HashCreate(m, m.OptionSimple()) }}, - mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == m.CommandKey() || arg[0] == mdb.FOREACH && arg[1] == "" { - m.Cmd("", ice.Maps{ice.MSG_FIELDS: ""}, func(values ice.Maps) { m.PushSearch(values) }) - } - }}, web.UPLOAD: {Hand: func(m *ice.Message, arg ...string) { m.Cmd("", mdb.CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT)) }}, @@ -95,7 +95,7 @@ func init() { "xterm": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.ProcessField(m, web.CODE_XTERM, []string{m.Option(mdb.TEXT)}, arg...) }}, - "_open": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { + cli.OPENS: {Help: "命令", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(cli.DAEMON, cli.OPEN, "-a", m.Option(mdb.TEXT)).ProcessHold(m) }}, "_new": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { @@ -131,8 +131,8 @@ func init() { return } switch value[mdb.TYPE] { - case "_open": - m.PushButton("_open", "_new", mdb.REMOVE) + case cli.OPENS: + m.PushButton(cli.OPENS, "_new", mdb.REMOVE) case ssh.SHELL: m.PushButton("xterm", mdb.REMOVE) case ctx.INDEX: diff --git a/core/chat/search.go b/core/chat/search.go index 011ce696..a5d72053 100644 --- a/core/chat/search.go +++ b/core/chat/search.go @@ -1,7 +1,10 @@ package chat import ( + "strings" + ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/web" @@ -11,7 +14,15 @@ const SEARCH = "search" func init() { Index.MergeCommands(ice.Commands{ - web.P(SEARCH): {Name: "/search", Help: "搜索框", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) { + web.P(SEARCH): {Name: "/search", Help: "搜索框", Actions: ice.MergeActions(ice.Actions{ + cli.OPENS: {Hand: func(m *ice.Message, arg ...string) { + if strings.HasSuffix(arg[0], ".app") { + m.Cmd(cli.SYSTEM, cli.OPEN, "-a", arg[0]) + } else { + m.Cmd(cli.SYSTEM, cli.OPEN, arg[0]) + } + }}, + }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.Space(m, m.Option(ice.POD)), mdb.SEARCH, arg).StatusTimeCount() }}, }) diff --git a/core/code/compile.go b/core/code/compile.go index 4973ad89..7c297895 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -37,16 +37,19 @@ func _compile_target(m *ice.Message, arg ...string) (string, string, string, str } const ( + SERVICE = "service" VERSION = "version" ) const COMPILE = "compile" func init() { Index.MergeCommands(ice.Commands{ - COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack webpack devpack upgrade", Help: "编译", Actions: ice.MergeActions(ice.Actions{ + COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack webpack devpack upgrade install", Help: "编译", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.IsAlpine(m, GO, "go git") }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch arg[0] { + case SERVICE: + m.Push(arg[0], m.Cmd(web.SPIDE, ice.DEV).Append(web.CLIENT_ORIGIN)+"/publish/") case VERSION: m.Push(arg[0], "1.15.15") default: @@ -57,10 +60,11 @@ func init() { WEBPACK: {Help: "打包", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(AUTOGEN, WEBPACK) }}, DEVPACK: {Help: "开发", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(AUTOGEN, DEVPACK) }}, UPGRADE: {Help: "升级", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(UPGRADE, nfs.TARGET) }}, - INSTALL: {Name: "install version=1.15.15", Help: "安装", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(INSTALL, web.DOWNLOAD, kit.Format("https://golang.google.cn/dl/go%s.%s-%s.%s", m.Option(VERSION), runtime.GOOS, runtime.GOARCH, kit.Select("tar.gz", "zip", runtime.GOOS == cli.WINDOWS)), ice.USR_LOCAL) + INSTALL: {Name: "install service*='https://golang.google.cn/dl/' version*=1.15.15", Help: "安装", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(INSTALL, web.DOWNLOAD, kit.Format("%s/go%s.%s-%s.%s", m.Option(SERVICE), m.Option(VERSION), runtime.GOOS, runtime.GOARCH, kit.Select("tar.gz", "zip", runtime.GOOS == cli.WINDOWS)), ice.USR_LOCAL) }}, }, ctx.ConfAction(cli.ENV, kit.Dict("GOPRIVATE", "shylinux.com,github.com", "GOPROXY", "https://goproxy.cn,direct", "CGO_ENABLED", "0"))), Hand: func(m *ice.Message, arg ...string) { + defer web.ToastProcess(m)() main, file, goos, arch := _compile_target(m, arg...) env := kit.Simple(cli.PATH, kit.Env(cli.PATH), cli.HOME, kit.Select(kit.Path(""), kit.Env(cli.HOME)), m.Configv(cli.ENV), m.Optionv(cli.ENV), cli.GOOS, goos, cli.GOARCH, arch) if runtime.GOOS == cli.WINDOWS { @@ -71,13 +75,13 @@ func init() { m.Cmd(cli.SYSTEM, GO, "get", "shylinux.com/x/ice") } m.Cmd(AUTOGEN, VERSION) - defer m.StatusTime(VERSION, strings.TrimPrefix(m.Cmdx(cli.SYSTEM, GO, VERSION), "go version ")) + defer m.StatusTime(VERSION, strings.TrimPrefix(m.Cmdx(cli.SYSTEM, GO, VERSION), "go version")) if msg := m.Cmd(cli.SYSTEM, GO, cli.BUILD, "-o", file, main, ice.SRC_VERSION_GO, ice.SRC_BINPACK_GO); !cli.IsSuccess(msg) { m.Copy(msg) return } - m.Logs(COMPILE, nfs.TARGET, file, nfs.SOURCE, main) - if m.Cmdy(nfs.DIR, file, "time,path,size,hash,link"); strings.Contains(file, ice.ICE) { + m.Logs(nfs.SAVE, nfs.TARGET, file, nfs.SOURCE, main) + if m.Cmdy(nfs.DIR, file, "time,size,path,hash,link"); strings.Contains(file, ice.ICE) { m.Cmdy(PUBLISH, ice.CONTEXTS) } }}, diff --git a/core/code/inner.go b/core/code/inner.go index 3816dd45..a04f59be 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -117,16 +117,13 @@ func init() { arg[1] = kit.Slice(strings.Split(arg[0], ice.PS), -1)[0] arg[0] = strings.TrimSuffix(arg[0], arg[1]) ctx.ProcessRewrite(m, nfs.PATH, arg[0], nfs.FILE, arg[1]) - return } else if len(arg) < 2 { nfs.Dir(m, nfs.PATH) - return + } else { + arg[1] = strings.Split(arg[1], ice.FS)[0] + _inner_list(m, kit.Ext(arg[1]), arg[1], arg[0]) + ctx.DisplayLocal(m, "").Option(nfs.REPOS, kit.Join(m.Cmd("web.code.git.repos", ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Appendv(nfs.PATH))) } - 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.Option(nfs.REPOS, kit.Join(m.Cmd("web.code.git.repos", ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Appendv(nfs.PATH))) - ctx.DisplayLocal(m, "") }}, }) ctx.AddRunChecker(func(m *ice.Message, cmd, check string, arg ...string) bool { diff --git a/core/code/install.go b/core/code/install.go index ea14ea46..df38614c 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -35,8 +35,7 @@ func _install_download(m *ice.Message) { m.Cmdy(nfs.DIR, file) return } - m.Cmd(nfs.SAVE, file, "") - mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link) + mdb.HashCreate(m.Cmd(nfs.SAVE, file, ""), mdb.NAME, name, nfs.PATH, file, mdb.LINK, link) web.GoToast(m, name, func(toast func(string, int, int)) { defer nfs.TarExport(m, file) begin := time.Now() diff --git a/core/code/publish.go b/core/code/publish.go index 0649f762..9072a4f2 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -16,22 +16,23 @@ import ( kit "shylinux.com/x/toolkits" ) -func _publish_bin_list(m *ice.Message, p string) *ice.Message { - m.Option(cli.CMD_DIR, p) +func _publish_bin_list(m *ice.Message) *ice.Message { defer m.SortTimeR(mdb.TIME) + m.Option(cli.CMD_DIR, ice.USR_PUBLISH) for _, ls := range strings.Split(cli.SystemCmds(m, "ls |xargs file |grep executable"), ice.NL) { if file := strings.TrimSpace(strings.Split(ls, ice.DF)[0]); file != "" { - if s, e := nfs.StatFile(m, path.Join(p, file)); e == nil { + if s, e := nfs.StatFile(m, path.Join(ice.USR_PUBLISH, file)); e == nil { m.Push(mdb.TIME, s.ModTime()).Push(nfs.SIZE, kit.FmtSize(s.Size())).Push(nfs.PATH, file) - m.PushDownload(mdb.LINK, file, path.Join(p, file)).PushButton(nfs.TRASH) + m.PushDownload(mdb.LINK, file, path.Join(ice.USR_PUBLISH, file)).PushButton(nfs.TRASH) } } } return m } func _publish_list(m *ice.Message, arg ...string) *ice.Message { + defer m.SortTimeR(mdb.TIME) m.Option(nfs.DIR_REG, kit.Select("", arg, 0)) - return nfs.DirDeepAll(m, ice.USR_PUBLISH, nfs.PWD, nil, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1)) + return nfs.DirDeepAll(m, ice.USR_PUBLISH, nfs.PWD, nil, nfs.DIR_WEB_FIELDS) } func _publish_file(m *ice.Message, file string, arg ...string) string { if strings.HasSuffix(file, ice.ICE_BIN) { @@ -40,15 +41,15 @@ func _publish_file(m *ice.Message, file string, arg ...string) string { file = m.Cmdx(nfs.TAR, mdb.IMPORT, path.Base(file), file) defer func() { nfs.Remove(m, file) }() } - target := path.Join(ice.USR_PUBLISH, kit.Select(path.Base(file), arg, 0)) - return m.Logs(mdb.EXPORT, PUBLISH, target, nfs.FROM, file).Cmdx(nfs.LINK, target, file) + return m.Cmdx(nfs.LINK, path.Join(ice.USR_PUBLISH, kit.Select(path.Base(file), arg, 0)), file) } func _publish_contexts(m *ice.Message, arg ...string) { + m.Option(nfs.DIR_ROOT, "") for _, k := range kit.Default(arg, ice.MISC) { m.Options(web.DOMAIN, m.Option(ice.MSG_USERHOST), cli.CTX_ENV, kit.Select("", ice.SP+kit.JoinKV(ice.EQ, ice.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != "")) switch k { case INSTALL: - m.Echo(strings.TrimSpace(kit.Renders(m.Config(kit.Keys(ice.CONTEXTS, ice.MISC)), m))) + m.Echo(strings.TrimSpace(nfs.Template(m, kit.Keys(ice.MISC, SH)))) return case ice.BASE: m.Option(web.DOMAIN, m.Cmd(web.SPIDE, ice.SHY).Append(web.CLIENT_ORIGIN)) @@ -57,11 +58,7 @@ func _publish_contexts(m *ice.Message, arg ...string) { default: _publish_file(m, ice.ICE_BIN) } - if s := strings.TrimSpace(kit.Renders(m.Config(kit.Keys(ice.CONTEXTS, k)), m)); k == INSTALL { - m.Echo(s) - } else { - m.EchoScript(s) - } + m.EchoScript(strings.TrimSpace(nfs.Template(m, kit.Keys(k, SH)))) } } @@ -70,33 +67,25 @@ const PUBLISH = "publish" func init() { Index.MergeCommands(ice.Commands{ PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.MergeActions(ice.Actions{ - ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(ice.CONTEXTS, _contexts) }}, ice.VOLCANOS: {Help: "火山架", Hand: func(m *ice.Message, arg ...string) { _publish_list(m, kit.ExtReg(HTML, CSS, JS)).Cmdy("", ice.CONTEXTS, ice.MISC).Echo(ice.NL).EchoQRCode(m.Option(ice.MSG_USERWEB)) }}, ice.ICEBERGS: {Help: "冰山架", Hand: func(m *ice.Message, arg ...string) { - _publish_bin_list(m, ice.USR_PUBLISH).Cmdy("", ice.CONTEXTS, ice.CORE) + _publish_bin_list(m).Cmdy("", ice.CONTEXTS, ice.CORE) }}, ice.INTSHELL: {Help: "神农架", Hand: func(m *ice.Message, arg ...string) { - _publish_list(m, kit.ExtReg(SH, "vim", "conf")).Cmdy("", ice.CONTEXTS, ice.BASE) + _publish_list(m, kit.ExtReg(SH, VIM, CONF)).Cmdy("", ice.CONTEXTS, ice.BASE) }}, ice.CONTEXTS: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, arg...) }}, - mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, arg[1:]).Cut("path,size,time") }}, - mdb.CREATE: {Name: "create file", Hand: func(m *ice.Message, arg ...string) { _publish_file(m, m.Option(nfs.FILE)) }}, + mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, arg[1:], nfs.DIR_CLI_FIELDS) }}, + mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) { _publish_file(m, m.Option(nfs.PATH)) }}, nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH))) }}, - }, ctx.ConfAction(ice.CONTEXTS, _contexts), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { + }, ctx.ConfAction(mdb.FIELD, nfs.PATH), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { if m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH); len(arg) == 0 { - m.Cmdy(nfs.DIR, "", nfs.DIR_WEB_FIELDS).SortTimeR(mdb.TIME) + _publish_list(m) } else { - m.OptionFields(mdb.DETAIL) - m.Cmdy(nfs.DIR, arg[0], "time,path,size,hash,link,action") + m.Cmdy(nfs.DIR, arg[0], "time,size,path,hash,link,action", ice.OptionFields(mdb.DETAIL)) } }}, }) } - -var _contexts = kit.Dict( - ice.MISC, `export ctx_dev={{.Option "domain"}}{{.Option "ctx_env"}}; temp=$(mktemp); if curl -h &>/dev/null; then curl -o $temp -fsSL $ctx_dev; else wget -O $temp -q $ctx_dev; fi; source $temp app username {{.Option "user.name"}} usernick "{{.Option "user.nick"}}"`, - ice.CORE, `temp=$(mktemp); if curl -h &>/dev/null; then curl -o $temp -fsSL {{.Option "domain"}}; else wget -O $temp -q {{.Option "domain"}}; fi; source $temp binary`, - ice.BASE, `temp=$(mktemp); if curl -h &>/dev/null; then curl -o $temp -fsSL {{.Option "domain"}}; else wget -O $temp -q {{.Option "domain"}}; fi; source $temp source`, -) diff --git a/core/code/sh.go b/core/code/sh.go index cf0e361d..86ec2a28 100644 --- a/core/code/sh.go +++ b/core/code/sh.go @@ -20,6 +20,10 @@ func _sh_cmds(m *ice.Message, p string) (string, string) { return cmds, text } +const ( + VIM = "vim" + CONF = "conf" +) const SH = nfs.SH func init() { diff --git a/core/code/upgrade.go b/core/code/upgrade.go index dd9f61f4..ded9a711 100644 --- a/core/code/upgrade.go +++ b/core/code/upgrade.go @@ -21,9 +21,10 @@ func init() { nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, ice.ICE_BIN)), nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")), nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")), + COMPILE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "go1.15.15", nfs.PATH, "usr/local/")), ), mdb.META, kit.Dict(mdb.FIELD, "type,file,path"))}, }, Commands: ice.Commands{ - UPGRADE: {Name: "upgrade item=target,binary,source run restart", Help: "升级", Actions: ice.MergeActions(ice.Actions{ + UPGRADE: {Name: "upgrade item=target,binary,source,compile run restart", Help: "升级", Actions: ice.MergeActions(ice.Actions{ cli.RESTART: {Hand: func(m *ice.Message, arg ...string) { m.Go(func() { m.Sleep300ms(ice.EXIT, 1) }) }}, }), Hand: func(m *ice.Message, arg ...string) { mdb.ZoneSelect(m.Spawn(), kit.Select(nfs.TARGET, arg, 0)).Tables(func(value ice.Maps) { @@ -32,14 +33,18 @@ func init() { defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN) m.Option(ice.EXIT, ice.TRUE) } - dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH]) + if kit.Select("", arg, 0) == COMPILE { + value[nfs.FILE] = kit.Keys(kit.Format(value[nfs.FILE]), runtime.GOOS+"-"+runtime.GOARCH, kit.Select("tar.gz", "zip", runtime.GOOS == cli.WINDOWS)) + } + dir := path.Join(kit.Format(value[nfs.PATH]), kit.Format(value[nfs.FILE])) switch web.SpideSave(m, dir, "/publish/"+kit.Format(value[nfs.FILE]), nil); value[mdb.TYPE] { case nfs.TAR: - m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir)) + m.Cmd(cli.SYSTEM, nfs.TAR, "xf", dir, "-C", path.Dir(dir)) + // m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir)) case ice.BIN: os.Chmod(dir, 0755) } - m.Cmdy(nfs.DIR, dir, "time,path,size,hash") + m.Cmdy(nfs.DIR, dir, "time,size,path,hash") }) if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE { m.Cmd("", cli.RESTART) diff --git a/core/code/vimer.go b/core/code/vimer.go index 78c47d1c..fc72859e 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -9,9 +9,11 @@ import ( "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/log" "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" ) @@ -52,6 +54,12 @@ const VIMER = "vimer" func init() { Index.MergeCommands(ice.Commands{ VIMER: {Name: "vimer path=src/@key file=main.go line=1 list", Help: "编辑器", Meta: kit.Dict(ctx.STYLE, INNER), Actions: ice.MergeActions(ice.Actions{ + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + m.PushSearch(mdb.TYPE, web.LINK, mdb.TEXT, kit.MergeURL(m.Option(ice.MSG_USERHOST)+ice.PS, log.DEBUG, ice.TRUE)) + m.PushSearch(mdb.TYPE, web.LINK, mdb.TEXT, web.MergePodCmds(m, "", web.CODE_VIMER, log.DEBUG, ice.TRUE)) + } + }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch m.Option(ctx.ACTION) { case web.DREAM, AUTOGEN, XTERM: @@ -64,8 +72,8 @@ func init() { for _, ext := range []string{SH, SHY, PY, JS, CSS, HTML} { m.Push(nfs.PATH, kit.ExtChange(p, ext)) } - m.Option(nfs.DIR_REG, kit.FileReg("(sh|shy|py|js|css|html)")) - nfs.DirDeepAll(m, nfs.SRC, "./", nil, nfs.PATH) + m.Option(nfs.DIR_REG, kit.FileReg(SH, SHY, PY, JS, CSS, HTML)) + nfs.DirDeepAll(m, nfs.SRC, nfs.PWD, nil, nfs.PATH) case web.WEBSITE: m.Cmdy(COMPLETE, mdb.FOREACH, kit.Select("", arg, 1), m.Option(ctx.ACTION)) case "extension": @@ -79,40 +87,38 @@ func init() { m.Cmdy(m.Option(ctx.INDEX)) } case nfs.PATH: - m.Cmdy(INNER, mdb.INPUTS, arg).Cut("path,size,time") + m.Cmdy(INNER, mdb.INPUTS, arg).Cut(nfs.DIR_CLI_FIELDS) case nfs.FILE: list := ice.Map{} push := func(k, p string) { kit.IfNoKey(list, kit.Select(k, k+ice.DF, k != "")+p, func(p string) { m.Push(nfs.PATH, p) }) } - m.Cmd(FAVOR, "_recent_file").Tables(func(value ice.Maps) { push("", value[nfs.PATH]+value[nfs.FILE]) }) - m.Cmd(web.CHAT_FAVOR, func(value ice.Maps) { + mdb.HashSelect(m.Spawn()).TablesLimit(10, func(value ice.Maps) { push("", value[nfs.PATH]) }) + m.Cmd(mdb.SEARCH, mdb.FOREACH, "", ice.OptionFields("type,name,text")).Sort("type,name,text").Tables(func(value ice.Maps) { switch value[mdb.TYPE] { - case web.LINK: - push(web.DREAM, value[mdb.TEXT]) case nfs.FILE: push("", value[mdb.TEXT]) + case tcp.GATEWAY: + push(web.SPACE, value[mdb.TEXT]) + case web.LINK: + push(web.SPACE, value[mdb.TEXT]) + case web.SERVER: + push(web.SPACE, value[mdb.TEXT]) + case web.WORKER: + push(web.SPACE, value[mdb.NAME]) case ctx.INDEX: push(ctx.INDEX, value[mdb.TEXT]) case ssh.SHELL: - push(ctx.INDEX+ice.DF+web.CODE_XTERM, value[mdb.TEXT]) + push(ssh.SHELL, value[mdb.TEXT]) + case cli.OPENS: + push(cli.OPENS, value[mdb.TEXT]) } }) - m.Cmd(web.DREAM, ice.Maps{nfs.DIR_DEEP: ice.FALSE}, func(value ice.Maps) { push(web.DREAM, value[mdb.NAME]) }) for _, p := range kit.Split(kit.Select(m.Option(nfs.PATH), m.Option("paths"))) { - nfs.DirDeepAll(m, nfs.PWD, p, func(value ice.Maps) { push("", value[nfs.PATH]) }, nfs.PATH) + nfs.DirDeepAll(m.Spawn(), nfs.PWD, p, func(value ice.Maps) { push("", value[nfs.PATH]) }, nfs.PATH) } m.Cmd(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX)).Tables(func(value ice.Maps) { push(ctx.INDEX, value[ctx.INDEX]) }) - m.Cmd(FAVOR, "_system_app").Tables(func(value ice.Maps) { push("_open", strings.ToLower(kit.Select(value[mdb.TEXT], value[mdb.NAME]))) }) - m.Cmd(nfs.DIR, "/Applications", mdb.NAME, ice.Maps{nfs.DIR_DEEP: ice.FALSE, nfs.DIR_TYPE: ""}, func(value ice.Maps) { - push("_open", value[nfs.NAME]) - }) - m.Cmd(nfs.DIR, "/System/Applications", mdb.NAME, ice.Maps{nfs.DIR_DEEP: ice.FALSE, nfs.DIR_TYPE: ""}, func(value ice.Maps) { - push("_open", value[nfs.NAME]) - }) - m.Cmd(nfs.DIR, "/System/Applications/Utilities", mdb.NAME, ice.Maps{nfs.DIR_DEEP: ice.FALSE, nfs.DIR_TYPE: ""}, func(value ice.Maps) { - push("_open", value[nfs.NAME]) - }) + m.Cmd(mdb.SEARCH, cli.SYSTEM, cli.OPENS, ice.OptionFields("type,name,text")).Sort("type,name,text").Tables(func(value ice.Maps) { push(cli.OPENS, value[nfs.NAME]) }) } } }}, @@ -144,7 +150,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) - }}, + }}, web.SPACE: {Help: "空间"}, nfs.REPOS: {Help: "仓库", Hand: func(m *ice.Message, arg ...string) { m.Option("view", "change") m.Cmd("web.code.git.status", func(value ice.Maps) { @@ -163,8 +169,12 @@ func init() { } }) }}, - "_open": {Help: "打开", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(cli.DAEMON, cli.OPEN, "-a", kit.Split(arg[0], ice.PT, ice.PT)[0]).ProcessHold(m) + cli.OPENS: {Help: "打开", Hand: func(m *ice.Message, arg ...string) { + if strings.HasSuffix(arg[0], ".app") { + m.Cmd(cli.DAEMON, cli.OPEN, "-a", arg[0]) + } else { + m.Cmd(cli.DAEMON, cli.OPEN, arg[0]) + } }}, XTERM: {Name: "xterm type=sh name text", Help: "终端", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(XTERM, mdb.CREATE, arg) @@ -216,8 +226,11 @@ func init() { web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { kit.If(arg[1] == m.CommandKey(), func() { web.ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey()) }) }}, - }, web.DreamAction(), aaa.RoleAction(ctx.COMMAND)), Hand: func(m *ice.Message, arg ...string) { + }, web.DreamAction(), mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path"), aaa.RoleAction(ctx.COMMAND)), Hand: func(m *ice.Message, arg ...string) { if m.Cmdy(INNER, arg); arg[0] != ctx.ACTION { + if len(arg) > 1 { + mdb.HashCreate(m.Spawn(), nfs.PATH, path.Join(kit.Slice(arg, 0, 2)...)) + } m.Action(AUTOGEN, nfs.SCRIPT, nfs.SAVE, COMPILE) m.Options("tabs", m.Config("show.tabs"), "plug", m.Config("show.plug"), "exts", m.Config("show.exts")) ctx.DisplayLocal(m, "") diff --git a/core/code/xterm.go b/core/code/xterm.go index 97529ab6..40aa0eee 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -38,7 +38,7 @@ func _xterm_get(m *ice.Message, h string) _xterm { t := mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE) mdb.HashModify(m, "view", m.Option(ice.MSG_DAEMON)) return mdb.HashSelectTarget(m, h, func() ice.Any { - ls := kit.Split(kit.Select(nfs.SH, t)) + ls := kit.Split(kit.Select(nfs.SH, strings.Split(t, " # ")[0])) cmd := exec.Command(cli.SystemFind(m, ls[0]), ls[1:]...) cmd.Env = append(cmd.Env, os.Environ()...) cmd.Env = append(cmd.Env, "TERM=xterm") @@ -48,7 +48,7 @@ func _xterm_get(m *ice.Message, h string) _xterm { // 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) + m.Option(ice.LOG_DISABLE, ice.TRUE) buf := make([]byte, ice.MOD_BUFS) for { if n, e := tty.Read(buf); !m.Warn(e) && e == nil { diff --git a/core/team/plan.go b/core/team/plan.go index d5182a3d..06b31a06 100644 --- a/core/team/plan.go +++ b/core/team/plan.go @@ -56,7 +56,7 @@ const PLAN = "plan" func init() { Index.MergeCommands(ice.Commands{ - PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date place@province img@img list", Help: "任务计划", Actions: ice.MergeActions(ice.Actions{ + PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date list prev next", Help: "任务计划", Actions: ice.MergeActions(ice.Actions{ mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TODO, mdb.INPUTS, arg) }}, mdb.PLUGIN: {Name: "plugin extra.index extra.args", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TASK, mdb.MODIFY, arg) }}, mdb.INSERT: {Name: "insert zone* type=once,step,week name* text begin_time@date close_time@date", Hand: func(m *ice.Message, arg ...string) { diff --git a/meta.go b/meta.go index 8548ae22..e80f0681 100644 --- a/meta.go +++ b/meta.go @@ -216,6 +216,17 @@ func (m *Message) Length() (max int) { } return max } +func (m *Message) TablesLimit(count int, cbs ...func(value Maps)) *Message { + return m.Table(func(index int, value Maps, head []string) { + if index < count { + for _, cb := range cbs { + if cb != nil { + cb(value) + } + } + } + }) +} func (m *Message) Tables(cbs ...func(value Maps)) *Message { return m.Table(func(index int, value Maps, head []string) { for _, cb := range cbs { @@ -388,12 +399,12 @@ func (m *Message) Sort(key string, arg ...string) *Message { } return m } -func (m *Message) SortInt(key string) { m.Sort(key, INT) } -func (m *Message) SortStr(key string) { m.Sort(key, STR) } -func (m *Message) SortTime(key string) { m.Sort(key, TIME) } -func (m *Message) SortTimeR(key string) { m.Sort(key, TIME_R) } -func (m *Message) SortStrR(key string) { m.Sort(key, STR_R) } -func (m *Message) SortIntR(key string) { m.Sort(key, INT_R) } +func (m *Message) SortInt(key string) { m.Sort(key, INT) } +func (m *Message) SortStr(key string) { m.Sort(key, STR) } +func (m *Message) SortTime(key string) { m.Sort(key, TIME) } +func (m *Message) SortTimeR(key string) *Message { return m.Sort(key, TIME_R) } +func (m *Message) SortStrR(key string) { m.Sort(key, STR_R) } +func (m *Message) SortIntR(key string) { m.Sort(key, INT_R) } func (m *Message) Detail(arg ...Any) string { return kit.Select("", m.meta[MSG_DETAIL], 0) diff --git a/misc/git/server.go b/misc/git/server.go index dadb7361..4fb5ebf6 100644 --- a/misc/git/server.go +++ b/misc/git/server.go @@ -149,7 +149,7 @@ func init() { _repos_cat(m, dir, arg[1], arg[2], kit.Select("", arg, 3)) } }}, - SERVER: {Name: "server repos branch commit path auto create import", Help: "源代码", Actions: ice.MergeActions(ice.Actions{ + SERVER: {Name: "server repos branch commit path auto create import", Help: "代码源", Actions: ice.MergeActions(ice.Actions{ mdb.CREATE: {Name: "create name*=demo", Hand: func(m *ice.Message, arg ...string) { _repos_init(m, path.Join(ice.USR_LOCAL_REPOS, m.Option(mdb.NAME))) }}, @@ -191,6 +191,8 @@ func init() { m.Cmdy(nfs.DIR, nfs.PWD, "time,name,size,action", kit.Dict(nfs.DIR_TYPE, nfs.TYPE_DIR), func(value ice.Maps) { m.PushScript("git clone " + _git_url(m, value[mdb.NAME])) }).Cut("time,name,size,script,action").RenameAppend(mdb.NAME, nfs.REPOS).SortStrR(mdb.TIME) + m.Debug("what %v", m.Cmdx("web.code.publish", "contexts")) + m.Debug("what %v", strings.ReplaceAll(m.Cmdx("web.code.publish", "contexts"), "app username", "dev username")) m.Echo(strings.ReplaceAll(m.Cmdx("web.code.publish", "contexts"), "app username", "dev username")) } else if dir := path.Join(m.Option(nfs.DIR_ROOT), arg[0]); len(arg) == 1 { _repos_branch(m, dir) diff --git a/misc/tmux/session.go b/misc/tmux/session.go index 91b8afb7..b3931b0d 100644 --- a/misc/tmux/session.go +++ b/misc/tmux/session.go @@ -8,7 +8,9 @@ import ( "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/ssh" "shylinux.com/x/icebergs/base/web" + "shylinux.com/x/icebergs/core/code" kit "shylinux.com/x/toolkits" ) @@ -77,8 +79,15 @@ func init() { FIELDS, "id,tag,pane,tty,height,width,cmd", )}, }, Commands: ice.Commands{ - SESSION: {Name: "session session window pane cmds auto", Help: "会话管理", Actions: ice.MergeActions(ice.Actions{ + SESSION: {Name: "session session window pane cmds auto", Help: "会话", Actions: ice.MergeActions(ice.Actions{ web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) { m.Cmd("", mdb.CREATE) }}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + m.Cmd("", ice.OptionFields(""), func(value ice.Maps) { + m.PushSearch(mdb.TYPE, ssh.SHELL, mdb.NAME, value[SESSION], mdb.TEXT, "tmux attach -t "+value[SESSION], value) + }) + } + }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { if m.Option(ctx.ACTION) == SCRIPT { m.Cmdy(SCRIPT, mdb.INPUTS, arg) @@ -142,6 +151,11 @@ func init() { _tmux_cmd(m, SELECT_PANE, "-t", _tmux_key(m.Option(SESSION), m.Option(WINDOW), m.Option(PANE))) } }}, + code.XTERM: {Help: "切入", Hand: func(m *ice.Message, arg ...string) { + if m.Option(WINDOW) == "" { + ctx.ProcessField(m, web.CODE_XTERM, []string{"tmux attach -t " + m.Option(SESSION)}, arg...) + } + }}, SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { m.Cmd(SCRIPT, m.Option(mdb.NAME), func(value ice.Maps) { kit.Fetch(kit.SplitLine(value[mdb.TEXT]), func(line string) { @@ -169,7 +183,7 @@ func init() { m.Split(_tmux_cmd(m, LIST_SESSION, "-F", m.Config(FORMAT)).Result(), m.Config(FIELDS), ice.FS, ice.NL) } m.Tables(func(value ice.Maps) { - kit.If(value["tag"] == "1", func() { m.PushButton("") }, func() { m.PushButton(mdb.SELECT, mdb.REMOVE) }) + kit.If(value["tag"] == "1", func() { m.PushButton("") }, func() { m.PushButton(code.XTERM, mdb.SELECT, mdb.REMOVE) }) }).StatusTimeCount() }}, WINDOW: {Hand: func(m *ice.Message, arg ...string) {