diff --git a/base/cli/mirrors.go b/base/cli/mirrors.go index 8ac1e932..7ee3a04a 100644 --- a/base/cli/mirrors.go +++ b/base/cli/mirrors.go @@ -63,7 +63,7 @@ func init() { } }}, ALPINE: {Name: "alpine cli cmd", Hand: func(m *ice.Message, arg ...string) { IsAlpine(m, arg...) }}, - }, mdb.ZoneAction(mdb.SHORT, CLI, mdb.FIELD, "time,id,osid,cmd"), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ZoneAction(mdb.SHORT, CLI, mdb.FIELDS, "time,id,osid,cmd"), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) == 0 { m.Table(func(value ice.Maps) { p := SystemFind(m, value[CLI]) diff --git a/base/gdb/event.go b/base/gdb/event.go index 0516bbb0..c42e4114 100644 --- a/base/gdb/event.go +++ b/base/gdb/event.go @@ -27,7 +27,7 @@ func init() { m.Cmdy(kit.Split(value[ice.CMD]), arg[1], arg[2:], ice.OptionFields("")) }) }}, - }, mdb.ZoneAction(mdb.SHORT, EVENT, mdb.FIELD, "time,id,cmd"), mdb.ClearOnExitHashAction())}, + }, mdb.ZoneAction(mdb.SHORT, EVENT, mdb.FIELDS, "time,id,cmd"), mdb.ClearOnExitHashAction())}, }) } diff --git a/base/log/tail.go b/base/log/tail.go index ccd0b73d..290b5fa3 100644 --- a/base/log/tail.go +++ b/base/log/tail.go @@ -35,6 +35,6 @@ func init() { } }}, mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) { _tail_create(m, arg...) }}, - }, mdb.PageZoneAction(mdb.SHORT, mdb.NAME, mdb.FIELDS, "time,name,file,count", mdb.FIELD, "time,id,file,size,text"))}, + }, mdb.PageZoneAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,file,count", mdb.FIELDS, "time,id,file,size,text"))}, }) } diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 3b9982cc..974487b0 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -255,16 +255,10 @@ func AutoConfig(arg ...Any) *ice.Action { return } if cmd.Actions[INSERT] != nil { - if cmd.Meta[INSERT] == nil { - m.Design(INSERT, "", add(kit.Simple(Config(m, SHORT), kit.Split(ListField(m))))...) - } - if cmd.Meta[CREATE] == nil { - m.Design(CREATE, "", add(kit.Split(Config(m, SHORT)))...) - } + kit.If(cmd.Meta[INSERT] == nil, func() { m.Design(INSERT, "", add(kit.Simple(Config(m, SHORT), kit.Split(ListField(m))))...) }) + kit.If(cmd.Meta[CREATE] == nil, func() { m.Design(CREATE, "", add(kit.Split(Config(m, SHORT)))...) }) } else if cmd.Actions[CREATE] != nil { - if cmd.Meta[CREATE] == nil { - m.Design(CREATE, "", add(kit.Split(HashField(m)))...) - } + kit.If(cmd.Meta[CREATE] == nil, func() { m.Design(CREATE, "", add(kit.Split(HashField(m)))...) }) } } }} diff --git a/base/mdb/render.go b/base/mdb/render.go index e8ca8ca6..2a584e7a 100644 --- a/base/mdb/render.go +++ b/base/mdb/render.go @@ -17,7 +17,7 @@ func RenderAction(arg ...ice.Any) ice.Actions { HashSelect(m, arg...) return } - m.OptionDefault(ice.MSG_FIELDS, kit.Select("", arg, 2)) + m.OptionDefault(ice.MSG_FIELDS, kit.Select("type,name,text", arg, 2)) kit.For(kit.Split(arg[0]), func(k string) { HashSelects(m.Spawn(), k).Table(func(value ice.Maps) { m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), k, arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) diff --git a/base/mdb/zone.go b/base/mdb/zone.go index 5398b855..a3f5c228 100644 --- a/base/mdb/zone.go +++ b/base/mdb/zone.go @@ -4,6 +4,7 @@ import ( "encoding/csv" "os" "path" + "strings" ice "shylinux.com/x/icebergs" kit "shylinux.com/x/toolkits" @@ -146,21 +147,50 @@ const ( ) const ZONE = "zone" +func ZoneConfig(arg ...Any) *ice.Action { + return &ice.Action{Hand: func(m *ice.Message, args ...string) { + if cs := m.Target().Configs; cs[m.CommandKey()] == nil { + cs[m.CommandKey()] = &ice.Config{Value: kit.Data(arg...)} + } else { + kit.For(kit.Dict(arg...), func(k string, v Any) { Config(m, k, v) }) + } + if cmd := m.Target().Commands[m.CommandKey()]; cmd == nil { + return + } else { + s := kit.Select(ZONE, Config(m, SHORT)) + kit.If(s == UNIQ || strings.Contains(s, ","), func() { s = HASH }) + if cmd.Name == "" { + cmd.Name = kit.Format("%s %s id auto", m.CommandKey(), s) + cmd.List = ice.SplitCmd(cmd.Name, cmd.Actions) + } + add := func(list []string) (inputs []Any) { + kit.For(list, func(k string) { + kit.If(!kit.IsIn(k, TIME, HASH, COUNT, ID), func() { + inputs = append(inputs, k+kit.Select("", "*", strings.Contains(s, k))) + }) + }) + return + } + kit.If(cmd.Meta[INSERT] == nil, func() { m.Design(INSERT, "", add(kit.Simple(kit.Split(s), kit.Split(ZoneField(m))))...) }) + kit.If(cmd.Meta[CREATE] == nil, func() { m.Design(CREATE, "", add(kit.Split(kit.Select(s, Config(m, FIELD))))...) }) + } + }} +} func ZoneAction(arg ...ice.Any) ice.Actions { - return ice.Actions{ice.CTX_INIT: AutoConfig(append(kit.List(SHORT, ZONE, FIELD, ZONE_FIELD), arg...)...), + return ice.Actions{ice.CTX_INIT: ZoneConfig(append(kit.List(SHORT, ZONE, FIELDS, ZONE_FIELD), arg...)...), INPUTS: {Hand: func(m *ice.Message, arg ...string) { ZoneInputs(m, arg) }}, CREATE: {Hand: func(m *ice.Message, arg ...string) { ZoneCreate(m, arg) }}, REMOVE: {Hand: func(m *ice.Message, arg ...string) { ZoneRemove(m, arg) }}, INSERT: {Hand: func(m *ice.Message, arg ...string) { ZoneInsert(m, arg) }}, MODIFY: {Hand: func(m *ice.Message, arg ...string) { ZoneModify(m, arg) }}, - SELECT: {Name: "select zone id auto insert", Hand: func(m *ice.Message, arg ...string) { ZoneSelect(m, arg...) }}, + SELECT: {Hand: func(m *ice.Message, arg ...string) { ZoneSelect(m, arg...) }}, EXPORT: {Hand: func(m *ice.Message, arg ...string) { ZoneExport(m, arg) }}, IMPORT: {Hand: func(m *ice.Message, arg ...string) { ZoneImport(m, arg) }}, } } func PageZoneAction(arg ...ice.Any) ice.Actions { return ice.MergeActions(ice.Actions{ - SELECT: {Name: "select zone id auto insert page", Hand: func(m *ice.Message, arg ...string) { PageZoneSelect(m, arg...) }}, + SELECT: {Hand: func(m *ice.Message, arg ...string) { PageZoneSelect(m, arg...) }}, PREV: {Hand: func(m *ice.Message, arg ...string) { PrevPageLimit(m, arg[0], arg[1:]...) }}, NEXT: {Hand: func(m *ice.Message, arg ...string) { NextPage(m, arg[0], arg[1:]...) }}, }, ZoneAction(arg...)) @@ -174,7 +204,7 @@ func ZoneKey(m *ice.Message) string { func ZoneShort(m *ice.Message) string { return kit.Select(ZONE, Config(m, SHORT), Config(m, SHORT) != UNIQ) } -func ZoneField(m *ice.Message) string { return kit.Select(ZONE_FIELD, Config(m, FIELD)) } +func ZoneField(m *ice.Message) string { return kit.Select(ZONE_FIELD, Config(m, FIELDS)) } func ZoneInputs(m *ice.Message, arg ...Any) { m.Cmdy(INPUTS, m.PrefixKey(), "", ZONE, m.Option(ZoneKey(m)), arg) } @@ -205,7 +235,7 @@ func ZoneModify(m *ice.Message, arg ...Any) { } func ZoneSelect(m *ice.Message, arg ...string) *ice.Message { arg = kit.Slice(arg, 0, 2) - m.Fields(len(arg), kit.Select(kit.Fields(TIME, Config(m, SHORT), COUNT), Config(m, FIELDS)), ZoneField(m)) + m.Fields(len(arg), kit.Select(kit.Fields(TIME, Config(m, SHORT), COUNT), Config(m, FIELD)), ZoneField(m)) if m.Cmdy(SELECT, m.PrefixKey(), "", ZONE, arg, logs.FileLineMeta(-1)); len(arg) == 0 { m.Sort(ZoneShort(m)).PushAction(Config(m, ACTION), REMOVE).Action(CREATE).StatusTimeCount() } else if len(arg) == 1 { @@ -235,5 +265,10 @@ func ZoneSelectCB(m *ice.Message, zone string, cb Any) *ice.Message { } func PageZoneSelect(m *ice.Message, arg ...string) *ice.Message { OptionPages(m, kit.Slice(arg, 2)...) - return ZoneSelect(m, arg...) + if ZoneSelect(m, arg...); len(kit.Slice(arg, 0, 2)) == 0 { + m.Action(CREATE) + } else { + m.Action(INSERT, "page") + } + return m } diff --git a/base/nfs/cat.go b/base/nfs/cat.go index 8cd7433f..6f1073d7 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -49,6 +49,8 @@ func _cat_list(m *ice.Message, p string) { kit.For(f, cb) case func([]string, string): kit.For(f, cb) + case func([]string): + kit.For(f, cb) case nil: if b, e := ioutil.ReadAll(f); !m.Warn(e) { m.Echo(string(b)).StatusTime(FILE, p, SIZE, len(b)) diff --git a/core/chat/favor.go b/core/chat/favor.go index d2d9f09b..8ebf01af 100644 --- a/core/chat/favor.go +++ b/core/chat/favor.go @@ -98,9 +98,9 @@ func init() { } if len(arg) == 0 { if m.IsMobileUA() { - m.Action("upload", "getClipboardData", "getLocation", "scanQRCode") + m.Action(mdb.CREATE, web.UPLOAD, "getClipboardData", "getLocation", "scanQRCode") } else { - m.Action("getClipboardData", "upload", "record1", "record2") + m.Action(mdb.CREATE, web.UPLOAD, "getClipboardData", "record1", "record2") } } m.Table(func(value ice.Maps) { diff --git a/core/chat/flows.go b/core/chat/flows.go index 5c40f135..0a5b3c3f 100644 --- a/core/chat/flows.go +++ b/core/chat/flows.go @@ -13,7 +13,7 @@ func init() { FLOWS: {Name: "flows zone hash auto", Icon: "Automator.png", Help: "工作流", Actions: ice.MergeActions(ice.Actions{ mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { if mdb.IsSearchPreview(m, arg) { - mdb.HashSelect(m.Spawn(ice.OptionFields(""))).Table(func(value ice.Maps) { + mdb.HashSelects(m).Table(func(value ice.Maps) { m.PushSearch(mdb.TYPE, "", mdb.NAME, value[mdb.ZONE], mdb.TEXT, value[mdb.ZONE], value) }) } diff --git a/core/chat/flows.js b/core/chat/flows.js index c974932f..cf0f8aa9 100644 --- a/core/chat/flows.js +++ b/core/chat/flows.js @@ -149,7 +149,9 @@ Volcanos(chat.ONDETAIL, { can.Update(can.request(event, can.Action("direct") == "horizon"? {from: item.hash}: {prev: item.hash}), [ctx.ACTION, mdb.INSERT]); break default: can.ondetail._select(event, can, item) } can.onkeymap.prevent(event) }, - oncontextmenu: function(event, can, _sub, item) { can.user.carteItem(event, can, item) }, + oncontextmenu: function(event, can, _sub, item) { + can.user.carteItem(event, can, can.base.CopyStr({action: item.action, zone: can.Option(mdb.ZONE)}, item)) + }, }) Volcanos(chat.ONEXPORT, { margin: function(can) { var margin = can.Action(html.MARGIN); return parseFloat(margin) }, diff --git a/core/chat/iframe.go b/core/chat/iframe.go index 68a105b0..f2bc0a22 100644 --- a/core/chat/iframe.go +++ b/core/chat/iframe.go @@ -14,7 +14,7 @@ const IFRAME = "iframe" func init() { Index.MergeCommands(ice.Commands{ - IFRAME: {Name: "iframe hash@key auto app", Help: "浏览器", Icon: "Safari.png", Actions: ice.MergeActions(ice.Actions{ + IFRAME: {Name: "iframe hash@key auto", Help: "浏览器", Icon: "Safari.png", Actions: ice.MergeActions(ice.Actions{ mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch mdb.HashInputs(m, arg); arg[0] { case mdb.NAME: diff --git a/core/chat/keyboard.go b/core/chat/keyboard.go index af61ad00..3c3c51c0 100644 --- a/core/chat/keyboard.go +++ b/core/chat/keyboard.go @@ -12,7 +12,7 @@ const KEYBOARD = "keyboard" func init() { Index.MergeCommands(ice.Commands{ - KEYBOARD: {Name: "keyboard hash auto", Help: "键盘", Actions: ice.MergeActions(ice.Actions{ + KEYBOARD: {Help: "键盘", Actions: ice.MergeActions(ice.Actions{ web.SPACE: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.SPACE, m.Option(web.SPACE), arg) }}, }, mdb.HashAction(mdb.FIELD, "time,hash,space,index,input")), Hand: func(m *ice.Message, arg ...string) { if mdb.HashSelect(m, arg...); len(arg) > 0 { diff --git a/core/code/autogen.go b/core/code/autogen.go index 192da07f..e84e1cf8 100644 --- a/core/code/autogen.go +++ b/core/code/autogen.go @@ -84,10 +84,9 @@ func _autogen_gits(m *ice.Message, arg ...string) string { func _autogen_git(m *ice.Message, arg ...string) ice.Map { msg := m.Cmd("web.code.git.repos", "remote") return kit.Dict(arg, aaa.USERNAME, ice.Info.Username, tcp.HOSTNAME, ice.Info.Hostname, nfs.PATH, kit.Path("")+nfs.PS, mdb.TIME, m.Time(), - GIT, m.Cmdx(cli.SYSTEM, GIT, VERSION), GO, m.Cmdx(cli.SYSTEM, GO, VERSION), + GIT, m.Cmdx(cli.SYSTEM, GIT, VERSION), GO, m.Cmdx(cli.SYSTEM, GO, VERSION), nfs.MODULE, _autogen_mod(m, ice.GO_MOD), msg.AppendSimple("remote,branch,version,forword,author,email,hash,when,message"), - web.DOMAIN, strings.ReplaceAll(tcp.PublishLocalhost(m, m.Option(ice.MSG_USERWEB)), "%2F", "/"), - nfs.MODULE, _autogen_mod(m, ice.GO_MOD), + web.DOMAIN, strings.ReplaceAll(tcp.PublishLocalhost(m, m.Option(ice.MSG_USERWEB)), "%2F", nfs.PS), cli.SYSTEM, ice.Info.System, ) } diff --git a/core/code/bench.go b/core/code/bench.go index 2af230f5..c2184caa 100644 --- a/core/code/bench.go +++ b/core/code/bench.go @@ -8,8 +8,7 @@ import ( "sync/atomic" ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/ctx" - "shylinux.com/x/icebergs/base/lex" + "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" @@ -17,11 +16,14 @@ import ( ) func _bench_http(m *ice.Message, target string, arg ...string) { + list := []*http.Request{} nconn := kit.Int64(kit.Select("10", m.Option(NCONN))) nreqs := kit.Int64(kit.Select("100", m.Option(NREQS))) - list := []*http.Request{} - for _, v := range strings.Split(target, lex.NL) { - switch ls := kit.Split(v); ls[0] { + m.Cmd(nfs.CAT, "", kit.Dict(nfs.CAT_CONTENT, target), func(ls []string, text string) { + if len(ls) == 0 || strings.HasPrefix(text, "#") { + return + } + switch ls[0] { case http.MethodPost: if f, e := nfs.OpenFile(m, ls[2]); m.Assert(e) { defer f.Close() @@ -29,12 +31,15 @@ func _bench_http(m *ice.Message, target string, arg ...string) { list = append(list, req) } } + case http.MethodGet: + ls = ls[1:] + fallthrough default: - if req, err := http.NewRequest(http.MethodGet, v, nil); m.Assert(err) { + if req, err := http.NewRequest(http.MethodGet, ls[0], nil); m.Assert(err) { list = append(list, req) } } - } + }) var ndata int64 if s, e := bench.HTTP(nconn, nreqs, list, func(req *http.Request, res *http.Response) { n, _ := io.Copy(ioutil.Discard, res.Body) @@ -58,9 +63,9 @@ const BENCH = "bench" func init() { Index.MergeCommands(ice.Commands{ - BENCH: {Name: "bench zone id auto insert", Help: "压测", Actions: ice.MergeActions(ice.Actions{ - mdb.INSERT: {Name: "insert zone*=demo type*=http,redis name=demo text*='http://localhost:9020/chat/cmd/run/web.chat.favor' nconn=10 nreqs=100"}, - ctx.RUN: {Hand: func(m *ice.Message, arg ...string) { + BENCH: {Help: "压测", Actions: ice.MergeActions(ice.Actions{ + mdb.INSERT: {Name: "insert zone*=demo type*=http,redis name=demo text*='http://localhost:9020/chat/cmd/web.chat.favor' nconn=10 nreqs=100"}, + cli.START: {Hand: func(m *ice.Message, arg ...string) { switch m.Option(mdb.TYPE) { case HTTP: _bench_http(m, m.Option(mdb.TEXT)) @@ -68,8 +73,8 @@ func init() { _bench_redis(m, m.Option(mdb.TEXT)) } }}, - }, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text,nconn,nreqs")), Hand: func(m *ice.Message, arg ...string) { - mdb.ZoneSelect(m, arg...).PushAction(kit.Select(ctx.RUN, mdb.REMOVE, len(arg) == 0)) + }, mdb.ZoneAction(mdb.FIELDS, "time,id,type,name,text,nconn,nreqs")), Hand: func(m *ice.Message, arg ...string) { + mdb.ZoneSelect(m, arg...).PushAction(kit.Select(cli.START, mdb.REMOVE, len(arg) == 0)) }}, }) } diff --git a/core/code/binpack.go b/core/code/binpack.go index a6d23b07..2fc67d3f 100644 --- a/core/code/binpack.go +++ b/core/code/binpack.go @@ -19,11 +19,9 @@ import ( func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { if kit.IsIn(kit.Ext(arg[0]), "zip", "gz") { return - } - if kit.Contains(arg[0], "/dist/", "/bin/", "/log/") { + } else if kit.Contains(arg[0], "/dist/", "/bin/", "/log/") { return - } - if strings.HasPrefix(arg[0], "usr/volcanos/publish/") && !strings.HasSuffix(arg[0], "/proto.js") { + } else if strings.HasPrefix(arg[0], "usr/volcanos/publish/") && !strings.HasSuffix(arg[0], "/proto.js") { return } switch arg[0] { @@ -36,9 +34,7 @@ func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { if f, e := nfs.OpenFile(m, arg[0]); !m.Warn(e, ice.ErrNotFound, arg[0]) { defer f.Close() if b, e := ioutil.ReadAll(f); !m.Warn(e, ice.ErrNotValid, arg[0]) { - if len(b) > 1<<20 { - m.Warn("too larger %s %s", arg[0], len(b)) - } + kit.If(len(b) > 1<<20, func() { m.Warn("too larger %s %s", arg[0], len(b)) }) fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b)) } } diff --git a/core/code/case.go b/core/code/case.go index 6c7d36c7..85406214 100644 --- a/core/code/case.go +++ b/core/code/case.go @@ -49,7 +49,7 @@ func init() { m.Cmdy(web.SPIDE, m.Option(ice.DEV), web.SPIDE_RAW, m.Option(ice.CMD), m.Option(cli.API), web.SPIDE_DATA, m.Option(ice.ARG)).ProcessInner() m.StatusTime(nfs.SCRIPT, `curl "`+kit.MergeURL2(m.Cmd(web.SPIDE, m.Option(ice.DEV)).Append(web.CLIENT_ORIGIN), m.Option(cli.API))+`" -H "Content-Type: application/json"`+` -d '`+m.Option(ice.ARG)+`'`) }}, - }, mdb.ZoneAction(mdb.FIELD, "time,id,name,cmd,api,arg,res")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ZoneAction(mdb.FIELDS, "time,id,name,cmd,api,arg,res")), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { m.Cmdy(web.SPIDE).RenameAppend(web.CLIENT_NAME, ice.DEV, web.CLIENT_URL, "address") } else if mdb.ZoneSelect(m, arg[1:]...); len(arg) > 1 { diff --git a/core/code/code.shy b/core/code/code.shy index c62e4a0a..169dd8c0 100644 --- a/core/code/code.shy +++ b/core/code/code.shy @@ -9,14 +9,14 @@ publish.go upgrade.go install.go -vimer.go -inner.go -xterm.go xterm.shy +xterm.go +inner.go +vimer.go +repos.go +favor.go bench.go pprof.go -favor.go -repos.go case.go c.go diff --git a/core/code/compile.go b/core/code/compile.go index 89a6abb8..cb3965df 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -51,26 +51,8 @@ func _compile_get(m *ice.Message, main string) { } } }) - _list := map[string]bool{} - m.Cmd(lex.SPLIT, ice.GO_MOD, func(ls []string) { - switch ls[0] { - case "module": - _list[ls[1]] = true - case "require": - if ls[1] == "(" { - block = true - } else { - _list[ls[1]] = true - } - case ")": - block = false - default: - if block { - _list[kit.Select("", ls, 0)] = true - } - } - }) kit.For(list, func(p string) { + _list := _compile_mod(m) if _, ok := _list[p]; ok { return } else if ls := kit.Slice(strings.Split(p, nfs.PS), 0, 3); _list[path.Join(ls...)] { @@ -79,6 +61,28 @@ func _compile_get(m *ice.Message, main string) { m.Cmd(cli.SYSTEM, GO, "get", p) }) } +func _compile_mod(m *ice.Message) map[string]bool { + block, list := false, map[string]bool{} + m.Cmd(lex.SPLIT, ice.GO_MOD, func(ls []string) { + switch ls[0] { + case "module": + list[ls[1]] = true + case "require": + if ls[1] == "(" { + block = true + } else { + list[ls[1]] = true + } + case ")": + block = false + default: + if block { + list[kit.Select("", ls, 0)] = true + } + } + }) + return list +} const COMPILE = "compile" @@ -90,11 +94,6 @@ 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 install", Icon: "go.png", Help: "编译", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.IsAlpine(m, GO, "go git") }}, - mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - mdb.IsSearchPreview(m, arg, func() []string { - return []string{ice.CMD, m.CommandKey(), kit.Format(kit.Simple(runtime.GOARCH, runtime.GOOS))} - }) - }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch arg[0] { case SERVICE: diff --git a/core/code/favor.go b/core/code/favor.go index 3f237093..8c57b440 100644 --- a/core/code/favor.go +++ b/core/code/favor.go @@ -12,7 +12,8 @@ const FAVOR = "favor" func init() { Index.MergeCommands(ice.Commands{ - FAVOR: {Name: "favor zone id auto insert page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{ + FAVOR: {Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{ + mdb.CREATE: {Name: "create zone*=数据结构"}, mdb.INSERT: {Name: "insert zone*=数据结构 type=go name*=hi text*=hello path file line"}, XTERM: {Help: "命令", Hand: func(m *ice.Message, arg ...string) { msg := mdb.ZoneSelects(m.Spawn(), m.Option(mdb.ZONE), m.Option(mdb.ID)) @@ -22,9 +23,10 @@ func init() { msg := mdb.ZoneSelects(m.Spawn(), m.Option(mdb.ZONE), m.Option(mdb.ID)) ctx.Process(m, "", msg.OptionSplit(nfs.PATH, nfs.FILE, nfs.LINE), arg...) }}, - }, mdb.PageZoneAction(mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.PageZoneAction(mdb.FIELDS, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) { if mdb.PageZoneSelect(m, arg...); len(arg) > 0 && arg[0] != "" { - m.Table(func(value ice.Maps) { m.PushButton(kit.Select(INNER, XTERM, value[nfs.FILE] == "")) }).Option(ctx.STYLE, arg[0]) + m.Table(func(value ice.Maps) { m.PushButton(kit.Select(INNER, XTERM, value[nfs.FILE] == "")) }) + m.Option(ctx.STYLE, arg[0]) } }}, }) diff --git a/core/code/inner.go b/core/code/inner.go index c19de5e9..24c1516e 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -68,7 +68,6 @@ const ( OPERATOR = lex.OPERATOR PREFIX = lex.PREFIX SUFFIX = lex.SUFFIX - INCLUDE = "include" ) const ( COMMENT = "comment" diff --git a/core/code/install.go b/core/code/install.go index b8f01df3..6032d58c 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -31,37 +31,33 @@ func _install_download(m *ice.Message) { link := m.Option(web.LINK) name := path.Base(kit.ParseURL(link).Path) file := path.Join(kit.Select(ice.USR_INSTALL, m.Option(nfs.PATH)), name) + defer m.Cmdy(nfs.DIR, file) if nfs.Exists(m, file) { - m.Cmdy(nfs.DIR, file) return } mdb.HashCreate(m.Cmd(nfs.SAVE, file, ""), mdb.NAME, name, nfs.PATH, file, web.LINK, link) web.GoToast(m, name, func(toast func(string, int, int)) (list []string) { - defer nfs.TarExport(m, file) begin := time.Now() - if mdb.Config(m, "repos") != "" { - web.SpideSave(m, file, mdb.Config(m, "repos")+path.Base(link), func(count, total, value int) { - cost := time.Now().Sub(begin) - mdb.HashSelectUpdate(m, name, func(value ice.Map) { value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, value }) - toast(kit.FormatShow(nfs.FROM, begin.Format("15:04:05"), cli.COST, kit.FmtDuration(cost), cli.REST, kit.FmtDuration(cost*time.Duration(101)/time.Duration(value+1)-cost)), count, total) - }) + _toast := func(count, total, value int) { + cost := time.Now().Sub(begin) + toast(kit.FormatShow(nfs.FROM, begin.Format("15:04:05"), cli.COST, kit.FmtDuration(cost), cli.REST, kit.FmtDuration(cost*time.Duration(101)/time.Duration(value+1)-cost)), count, total) + mdb.HashSelectUpdate(m, name, func(value ice.Map) { value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, value }) + } + defer nfs.TarExport(m, file) + if mdb.Config(m, nfs.REPOS) != "" { + web.SpideSave(m, file, mdb.Config(m, nfs.REPOS)+path.Base(link), _toast) if s, e := nfs.StatFile(m, file); e == nil && s.Size() > 0 { return } } - web.SpideSave(m, file, link, func(count, total, value int) { - cost := time.Now().Sub(begin) - mdb.HashSelectUpdate(m, name, func(value ice.Map) { value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, value }) - toast(kit.FormatShow(nfs.FROM, begin.Format("15:04:05"), cli.COST, kit.FmtDuration(cost), cli.REST, kit.FmtDuration(cost*time.Duration(101)/time.Duration(value+1)-cost)), count, total) - }) + web.SpideSave(m, file, link, _toast) return }) if s, e := nfs.StatFile(m, file); e == nil && s.Size() > 0 { - m.Cmdy(nfs.DIR, file) web.ToastSuccess(m) } else { - nfs.Trash(m, file) web.ToastFailure(m) + nfs.Trash(m, file) } } func _install_build(m *ice.Message, arg ...string) string { @@ -106,9 +102,7 @@ func _install_spawn(m *ice.Message, arg ...string) { target, source := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)), _install_path(m, "") nfs.MkdirAll(m, target) defer m.Echo(target) - if m.Option(INSTALL) == "" && nfs.Exists(m, kit.Path(source, _INSTALL)) { - m.Option(INSTALL, _INSTALL) - } + kit.If(m.Option(INSTALL) == "" && nfs.Exists(m, kit.Path(source, _INSTALL)), func() { m.Option(INSTALL, _INSTALL) }) nfs.DirDeepAll(m.Spawn(), path.Join(source, m.Option(INSTALL)), "", func(value ice.Maps) { m.Cmd(nfs.LINK, path.Join(target, value[nfs.PATH]), path.Join(source, m.Option(INSTALL), value[nfs.PATH]), kit.Dict(ice.LOG_DISABLE, ice.TRUE)) }) @@ -222,7 +216,3 @@ func InstallAction(args ...ice.Any) ice.Actions { nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, m.Option(nfs.PATH)) }}, } } -func init() { - return - ice.Info.Stack[Prefix(InstallAction)] = func(m *ice.Message, key string, arg ...ice.Any) ice.Any { return InstallAction(arg...) } -} diff --git a/core/code/pprof.go b/core/code/pprof.go index db062216..09940353 100644 --- a/core/code/pprof.go +++ b/core/code/pprof.go @@ -9,6 +9,7 @@ import ( "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/lex" + "shylinux.com/x/icebergs/base/log" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" @@ -24,12 +25,14 @@ func init() { SERVICE = "service" SECONDS = "seconds" ) - web.Index.MergeCommands(ice.Commands{"/debug/": {Actions: aaa.WhiteAction(), Hand: func(m *ice.Message, arg ...string) { - defer m.Render(ice.RENDER_VOID) - http.DefaultServeMux.ServeHTTP(m.W, m.R) - }}}) + web.Index.MergeCommands(ice.Commands{ + web.PP(log.DEBUG): {Hand: func(m *ice.Message, arg ...string) { + http.DefaultServeMux.ServeHTTP(m.W, m.R) + m.Render(ice.RENDER_VOID) + }}, + }) Index.MergeCommands(ice.Commands{ - PPROF: {Name: "pprof zone id auto", Help: "优化", Actions: ice.MergeActions(ice.Actions{ + PPROF: {Help: "优化", Actions: ice.MergeActions(ice.Actions{ mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch arg[0] { case BINNARY: @@ -38,16 +41,15 @@ func init() { m.Cmd(web.SPIDE, func(value ice.Maps) { m.Push(SERVICE, kit.MergeURL2(value[web.CLIENT_URL], "/debug/pprof/profile")) }) } }}, - mdb.CREATE: {Name: "create zone*=some binnary*=bin/ice.bin service*='http://localhost:9020/debug/pprof/profile' seconds*=30"}, + mdb.CREATE: {Name: "create zone*=demo binnary*=bin/ice.bin service*='http://localhost:9020/debug/pprof/profile' seconds*=30"}, cli.START: {Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if m.Option(BINNARY) == "" { - return - } - msg := m.Cmd(web.SPIDE, ice.DEV, web.SPIDE_CACHE, http.MethodGet, m.Option(SERVICE), m.OptionSimple(SECONDS)) - cmd := kit.Simple(mdb.Configv(m, PPROF), "-text", m.Option(BINNARY), msg.Append(nfs.FILE)) + defer web.ToastProcess(m)() + mdb.HashSelect(m, m.Option(mdb.ZONE)) + msg := m.Cmd(web.SPIDE, ice.DEV, web.SPIDE_CACHE, http.MethodGet, m.Append(SERVICE), m.AppendSimple(SECONDS)) + cmd := kit.Simple(mdb.Configv(m, PPROF), "-text", m.Append(BINNARY), msg.Append(nfs.FILE)) m.Option(mdb.TEXT, strings.Join(kit.Slice(strings.Split(m.Cmdx(cli.SYSTEM, cmd), lex.NL), 0, 20), lex.NL)) mdb.ZoneInsert(m, m.OptionSimple("zone,text"), msg.AppendSimple(nfs.FILE)) - m.Echo(m.Option(mdb.TEXT)).ProcessInner() + m.SetAppend().Echo(m.Option(mdb.TEXT)).ProcessInner() }}, web.SERVE: {Help: "展示", Hand: func(m *ice.Message, arg ...string) { u := web.UserWeb(m) @@ -55,12 +57,13 @@ func init() { m.Cmd(cli.DAEMON, mdb.Configv(m, PPROF), "-http="+p, m.Option(BINNARY), m.Option(nfs.FILE)) m.Sleep3s().ProcessOpen(kit.Format("http://%s/ui/top", p)) }}, - }, mdb.ZoneAction(mdb.FIELDS, "time,zone,count,binnary,service,seconds", mdb.FIELD, "time,id,text,file", PPROF, kit.List(GO, "tool", PPROF))), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ZoneAction(mdb.FIELD, "time,zone,count,binnary,service,seconds", mdb.FIELDS, "time,id,text,file", PPROF, kit.List(GO, "tool", PPROF))), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) == 0 { m.EchoAnchor(web.MergeLink(m, "/debug/pprof/")) m.PushAction(cli.START, mdb.REMOVE).Action(mdb.CREATE) } else { m.Table(func(value ice.Maps) { m.PushDownload(mdb.LINK, "pprof.pd.gz", value[nfs.FILE]).PushButton(web.SERVE) }) + m.Action(cli.START) } }}, }) diff --git a/core/code/publish.go b/core/code/publish.go index 434156aa..e7dfd39f 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -37,14 +37,12 @@ func _publish_file(m *ice.Message, file string, arg ...string) string { 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, "") - m.OptionDefault(ice.MSG_USERNAME, "demo") + m.Options(nfs.DIR_ROOT, "").OptionDefault(ice.MSG_USERNAME, "demo") for _, k := range kit.Default(arg, ice.MISC) { m.Options(web.DOMAIN, web.UserHost(m), cli.CTX_ENV, kit.Select("", lex.SP+kit.JoinKV(mdb.EQ, lex.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != "")) switch k { case INSTALL: - m.Echo(strings.TrimSpace(nfs.Template(m, kit.Keys(ice.MISC, SH)))) - return + m.Option("format", "raw") case ice.BASE: m.Option(web.DOMAIN, m.Cmd(web.SPIDE, ice.SHY).Append(web.CLIENT_ORIGIN)) case ice.CORE: @@ -52,12 +50,9 @@ func _publish_contexts(m *ice.Message, arg ...string) { case nfs.SOURCE, "dev": m.Options(nfs.SOURCE, ice.Info.Make.Remote) case nfs.BINARY, "app": - - case "wget", "curl": + case "curl", "wget": case "manual": m.Options(nfs.BINARY, "ice.linux.amd64") - default: - // _publish_file(m, ice.ICE_BIN) } if m.Option("format") == "raw" { m.Echo(strings.TrimSpace(nfs.Template(m, kit.Keys(k, SH)))) @@ -70,57 +65,44 @@ func _publish_contexts(m *ice.Message, arg ...string) { const PUBLISH = "publish" func init() { - web.Index.MergeCommands(ice.Commands{ - web.PP(ice.PUBLISH): {Name: "/publish/", Help: "定制化", Actions: aaa.WhiteAction(), Hand: func(m *ice.Message, arg ...string) { + Index.MergeCommands(ice.Commands{ + web.PP(ice.PUBLISH): {Actions: aaa.WhiteAction(), Hand: func(m *ice.Message, arg ...string) { web.ShareLocalFile(m, ice.USR_PUBLISH, path.Join(arg...)) }}, - }) - Index.MergeCommands(ice.Commands{ PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.MergeActions(ice.Actions{ - ice.VOLCANOS: {Help: "火山架", Hand: func(m *ice.Message, arg ...string) { - _publish_list(m, kit.ExtReg(HTML, CSS, JS)).EchoQRCode(m.Option(ice.MSG_USERWEB)) - }}, - ice.ICEBERGS: {Help: "冰山架", Hand: func(m *ice.Message, arg ...string) { - _publish_bin_list(m).Cmdy("", ice.CONTEXTS) - }}, - ice.INTSHELL: {Help: "神农架", Hand: func(m *ice.Message, arg ...string) { - _publish_list(m, kit.ExtReg(SH, VIM, CONF)) - }}, + ice.VOLCANOS: {Help: "火山架", Hand: func(m *ice.Message, arg ...string) { _publish_list(m, kit.ExtReg(HTML, CSS, JS)) }}, + ice.ICEBERGS: {Help: "冰山架", Hand: func(m *ice.Message, arg ...string) { _publish_bin_list(m).Cmdy("", ice.CONTEXTS) }}, + ice.INTSHELL: {Help: "神农架", Hand: func(m *ice.Message, arg ...string) { _publish_list(m, kit.ExtReg(SH, VIM, CONF)) }}, ice.CONTEXTS: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, arg...) }}, nfs.SOURCE: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, nfs.SOURCE) }}, nfs.BINARY: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, nfs.BINARY) }}, + "curl": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "curl") }}, + "wget": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "wget") }}, "manual": {Hand: func(m *ice.Message, arg ...string) { - host := web.UserHost(m) - args := "" - if m.Option(ice.MSG_USERPOD) != "" { - args = "?pod=" + m.Option(ice.MSG_USERPOD) - } + host, args := web.UserHost(m), "" + kit.If(m.Option(ice.MSG_USERPOD), func(p string) { args = "?pod=" + p }) m.Cmdy("web.wiki.spark", "shell", cli.LINUX, kit.Format(`curl -fSL -O "%s/publish/ice.linux.amd64%s"`, host, args), cli.DARWIN, kit.Format(`curl -fSL -O "%s/publish/ice.darwin.amd64%s"`, host, args), cli.WINDOWS, kit.Format(`curl -fSL -O "%s/publish/ice.windows.amd64%s"`, host, args), ) }}, - "wget": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "wget") }}, - "curl": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "curl") }}, - "version": {Hand: func(m *ice.Message, arg ...string) { + nfs.VERSION: {Hand: func(m *ice.Message, arg ...string) { defer m.Echo("").Echo("
") - for _, cpu := range []string{cli.AMD64, cli.X86, cli.ARM} { - m.Echo("") - for _, sys := range []string{cli.LINUX, cli.WINDOWS, cli.DARWIN} { - m.Echo("") - if file := fmt.Sprintf("ice.%s.%s", sys, cpu); nfs.Exists(m, "usr/publish/"+file) { + kit.For([]string{cli.AMD64, cli.X86, cli.ARM}, func(cpu string) { + defer m.Echo("").Echo("") + kit.For([]string{cli.LINUX, cli.WINDOWS, cli.DARWIN}, func(sys string) { + defer m.Echo("").Echo("") + if file := fmt.Sprintf("ice.%s.%s", sys, cpu); nfs.Exists(m, ice.USR_PUBLISH+file) { m.EchoAnchor(file, "/publish/"+file) } - m.Echo("") - } - m.Echo("") - } + }) + }) }}, 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(mdb.FIELD, nfs.PATH), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { + }, aaa.RoleAction(), ctx.ConfAction(mdb.FIELD, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) { if m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH); len(arg) == 0 { _publish_list(m).Cmdy("", ice.CONTEXTS, ice.APP) } else { diff --git a/core/code/repos.go b/core/code/repos.go index 0c1c852c..b2c72201 100644 --- a/core/code/repos.go +++ b/core/code/repos.go @@ -2,7 +2,9 @@ package code import ( ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/web" ) const ( @@ -11,7 +13,9 @@ const ( const REPOS = nfs.REPOS func init() { - Index.MergeCommands(ice.Commands{REPOS: {Name: "repos repos auto", Actions: ice.Actions{ - "status": {Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.code.git.status", arg) }}, - }, Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.code.git.repos", arg) }}}) + Index.MergeCommands(ice.Commands{ + REPOS: {Name: "repos repos branch commit file auto", Actions: ice.Actions{ + mdb.STATUS: {Help: "状态", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.CODE_GIT_STATUS, arg) }}, + }, Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.CODE_GIT_REPOS, arg) }}, + }) } diff --git a/core/code/upgrade.go b/core/code/upgrade.go index 3c1d443e..6d022c75 100644 --- a/core/code/upgrade.go +++ b/core/code/upgrade.go @@ -18,17 +18,20 @@ const UPGRADE = "upgrade" func init() { Index.Merge(&ice.Context{Configs: ice.Configs{ - UPGRADE: {Value: kit.Dict(mdb.HASH, kit.Dict( - 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")), - ctx.CONFIG, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.SHY, nfs.FILE, ice.ETC_LOCAL_SHY)), - COMPILE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "go1.15.5", nfs.PATH, ice.USR_LOCAL)), - ), mdb.META, kit.Dict(mdb.FIELD, "type,file,path"))}, + UPGRADE: {Value: kit.Dict( + mdb.META, kit.Dict(mdb.FIELD, "type,file,path"), + mdb.HASH, kit.Dict( + nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, ice.ICE_BIN)), + ctx.CONFIG, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.SHY, nfs.FILE, ice.ETC_LOCAL_SHY)), + 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.5", nfs.PATH, ice.USR_LOCAL)), + )), + }, }, Commands: ice.Commands{ - UPGRADE: {Name: "upgrade item=target,config,binary,source,compile run restart", Help: "升级", Actions: ice.MergeActions(ice.Actions{ + UPGRADE: {Name: "upgrade item=target,config,binary,source,compile run restart", Help: "升级", Actions: ice.Actions{ cli.RESTART: {Hand: func(m *ice.Message, arg ...string) { m.Go(func() { m.Sleep30ms(ice.EXIT, 1) }) }}, - }), Hand: func(m *ice.Message, arg ...string) { + }, Hand: func(m *ice.Message, arg ...string) { mdb.ZoneSelect(m.Spawn(), kit.Select(nfs.TARGET, arg, 0)).Table(func(value ice.Maps) { 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)) @@ -39,9 +42,9 @@ func init() { m.Option(ice.EXIT, ice.TRUE) } uri := "/publish/" + kit.Format(value[nfs.FILE]) - if os.Getenv(cli.CTX_POD) != "" { - uri = kit.MergeURL2(os.Getenv(cli.CTX_DEV), "/chat/pod/"+os.Getenv(cli.CTX_POD), cli.GOOS, runtime.GOOS, cli.GOARCH, runtime.GOARCH) - } + kit.If(os.Getenv(cli.CTX_POD), func(p string) { + uri = kit.MergeURL2(os.Getenv(cli.CTX_DEV), web.CHAT_POD+p, cli.GOOS, runtime.GOOS, cli.GOARCH, runtime.GOARCH) + }) dir := path.Join(kit.Format(value[nfs.PATH]), kit.Format(value[nfs.FILE])) switch web.SpideSave(m, dir, uri, nil); value[mdb.TYPE] { case nfs.TAR: @@ -53,8 +56,8 @@ func init() { m.Cmdy(nfs.DIR, dir, "time,size,path,hash") }) if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE { - m.Cmd("", cli.RESTART) web.Toast(m, cli.RESTART) + m.Cmd("", cli.RESTART) } }}, }}) diff --git a/core/code/webpack.go b/core/code/webpack.go index 746929b2..50962bd1 100644 --- a/core/code/webpack.go +++ b/core/code/webpack.go @@ -134,9 +134,7 @@ func init() { _webpack_cache(m.Spawn(), _volcanos(m), false) m.Cmdy("") }}, - mdb.INSERT: {Name: "insert path*", Hand: func(m *ice.Message, arg ...string) { - mdb.HashCreate(m) - }}, + mdb.INSERT: {Name: "insert path*", Hand: func(m *ice.Message, arg ...string) { mdb.HashCreate(m) }}, cli.BUILD: {Name: "build name*=hi", Hand: func(m *ice.Message, arg ...string) { // kit.If(!nfs.Exists(m, USR_PUBLISH_CAN_JS), func() { m.Cmd("", mdb.CREATE) }) _webpack_build(m, _publish(m, m.Option(mdb.NAME))) diff --git a/core/code/xterm.go b/core/code/xterm.go index 2b635506..18658f48 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -2,7 +2,6 @@ package code import ( "encoding/base64" - "os" "path" "strings" @@ -22,9 +21,7 @@ import ( func _xterm_get(m *ice.Message, h string) xterm.XTerm { h = kit.Select(m.Option(mdb.HASH), h) - m.Assert(h != "") - m.Option("skip.important", ice.TRUE) - if m.Option(ice.MSG_USERPOD) == "" { + if m.Assert(h != ""); m.Option(ice.MSG_USERPOD) == "" { mdb.HashModify(m, mdb.TIME, m.Time(), cli.DAEMON, kit.Keys(m.Option(ice.MSG_DAEMON))) } else { mdb.HashModify(m, mdb.TIME, m.Time(), cli.DAEMON, kit.Keys(kit.Slice(kit.Simple(m.Optionv("__target")), 0, -1), m.Option(ice.MSG_DAEMON))) @@ -33,25 +30,18 @@ func _xterm_get(m *ice.Message, h string) xterm.XTerm { text := strings.Split(value[mdb.TEXT], lex.NL) ls := kit.Split(strings.Split(kit.Select(ISH, value[mdb.TYPE]), " # ")[0]) kit.If(value[nfs.PATH] != "" && !strings.HasSuffix(value[nfs.PATH], nfs.PS), func() { value[nfs.PATH] = path.Dir(value[nfs.PATH]) }) - m.Debug("command %v %v", ls, value) term, e := xterm.Command(m, value[nfs.PATH], kit.Select(ls[0], cli.SystemFind(m, ls[0], value[nfs.PATH])), ls[1:]...) if m.Warn(e) { return nil } m.Go(func() { - defer term.Close() - defer mdb.HashRemove(m, mdb.HASH, h) m.Log(cli.START, strings.Join(ls, lex.SP)) + defer mdb.HashRemove(m, mdb.HASH, h) buf := make([]byte, ice.MOD_BUFS) for { if n, e := term.Read(buf); !m.Warn(e) && e == nil { if _xterm_echo(m, h, string(buf[:n])); len(text) > 0 { - if cmd := text[0]; text[0] != "" { - m.Go(func() { - m.Sleep30ms() - term.Writeln(cmd) - }) - } + kit.If(text[0], func(cmd string) { m.Go(func() { m.Sleep30ms(); term.Writeln(cmd) }) }) text = text[1:] } } else { @@ -78,16 +68,17 @@ const ( const XTERM = "xterm" func init() { + shell := kit.Env("SHELL", "/bin/sh") Index.MergeCommands(ice.Commands{ XTERM: {Name: "xterm hash auto", Icon: "Terminal.png", Help: "命令行", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - kit.If(m.Cmd("").Length() == 0, func() { m.Cmd("", mdb.CREATE, mdb.TYPE, ISH) }) + kit.If(m.Cmd("").Length() == 0, func() { + m.Cmd("", mdb.CREATE, mdb.TYPE, shell) + m.Cmd("", mdb.CREATE, mdb.TYPE, "/bin/ish") + }) }}, mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { - if arg[0] == SHELL { - m.PushSearch(mdb.TYPE, ssh.SHELL, mdb.NAME, SH, mdb.TEXT, "/bin/sh") - } - mdb.IsSearchPreview(m, arg, func() []string { return []string{ssh.SHELL, SH, kit.Select("/bin/sh", os.Getenv("SHELL"))} }) + mdb.IsSearchPreview(m, arg, func() []string { return []string{ssh.SHELL, SH, shell} }) mdb.IsSearchPreview(m, arg, func() []string { return []string{ssh.SHELL, ISH, "/bin/ish"} }) }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { @@ -95,8 +86,7 @@ func init() { case mdb.HASH: fallthrough case mdb.TYPE: - m.Push(arg[0], "/bin/ish", kit.Select("/bin/sh", os.Getenv("SHELL"))) - m.Cmd(mdb.SEARCH, mdb.FOREACH, ssh.SHELL, ice.OptionFields("type,name,text"), func(value ice.Maps) { + m.Cmd(mdb.SEARCH, mdb.FOREACH, "", "", func(value ice.Maps) { kit.If(value[mdb.TYPE] == ssh.SHELL, func() { m.Push(arg[0], value[mdb.TEXT]) }) }) case mdb.NAME: @@ -117,7 +107,7 @@ func init() { } }}, mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) { - m.ProcessRewrite(mdb.HASH, mdb.HashCreate(m, arg)) + m.ProcessRewrite(mdb.HASH, mdb.HashCreate(m)) }}, html.RESIZE: {Hand: func(m *ice.Message, arg ...string) { _xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80")) @@ -128,29 +118,17 @@ func init() { } }}, html.OUTPUT: {Help: "全屏", Hand: func(m *ice.Message, arg ...string) { - web.ProcessPodCmd(m, "", "", m.OptionSimple(mdb.HASH), ctx.STYLE, html.OUTPUT) + web.ProcessPodCmd(m, "", "", mdb.HASH, kit.Select(m.Option(mdb.HASH), arg, 0), ctx.STYLE, html.OUTPUT) }}, - web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { - kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.SERVER, web.WORKER), func() { m.PushButton(kit.Dict(m.CommandKey(), "终端")) }) - }}, - web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { web.DreamProcess(m, []string{}, arg...) }}, - ctx.PROCESS: {Hand: func(m *ice.Message, arg ...string) { - if len(arg) == 1 { - ctx.ProcessField(m, m.PrefixKey(), arg, arg...) - } else { - ctx.ProcessField(m, m.PrefixKey(), func() string { return m.Cmdx("", mdb.CREATE, arg) }, arg...) - } - }}, - "install": {Help: "安装", Hand: func(m *ice.Message, arg ...string) { + INSTALL: {Help: "安装", Hand: func(m *ice.Message, arg ...string) { _xterm_get(m, kit.Select("", arg, 0)).Write([]byte(m.Cmdx(PUBLISH, ice.CONTEXTS, ice.APP, kit.Dict("format", "raw")) + ice.NL)) m.ProcessHold() }}, - "terminal": {Help: "本机", Hand: func(m *ice.Message, arg ...string) { + ice.APP: {Help: "本机", Hand: func(m *ice.Message, arg ...string) { if h := kit.Select(m.Option(mdb.HASH), arg, 0); h == "" { cli.Opens(m, "Terminal.app") } else { - msg := m.Cmd("", h) - cli.OpenCmds(m, msg.Append(mdb.TYPE)) + cli.OpenCmds(m, m.Cmdv("", h, mdb.TYPE)) } m.ProcessHold() }}, @@ -160,35 +138,33 @@ func init() { m.Push(arg[0], SHELL) case mdb.TEXT: if m.Option(mdb.TYPE) == SHELL { - m.Push(arg[0], "/bin/ish", kit.Select("/bin/sh", os.Getenv("SHELL"))) + m.Cmd(mdb.SEARCH, mdb.FOREACH, "", "", func(value ice.Maps) { + kit.If(value[mdb.TYPE] == ssh.SHELL, func() { m.Push(arg[0], value[mdb.TEXT]) }) + }) } } }}, chat.FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) { - kit.If(m.Option(mdb.TYPE) == SHELL, func() { - m.PushButton(kit.Dict(m.CommandKey(), "终端")) - }) + kit.If(m.Option(mdb.TYPE) == SHELL, func() { m.PushButton(kit.Dict(m.CommandKey(), "终端")) }) }}, chat.FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) { - if m.Option(mdb.TYPE) == SHELL { + kit.If(m.Option(mdb.TYPE) == SHELL, func() { ctx.ProcessField(m, m.PrefixKey(), m.Cmdx("", mdb.CREATE, mdb.TYPE, m.Option(mdb.TEXT), mdb.NAME, m.Option(mdb.NAME), mdb.TEXT, "")) - } + }) }}, - }, chat.FavorAction(), ctx.ProcessAction(), mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,path,theme,daemon")), Hand: func(m *ice.Message, arg ...string) { + web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { + kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.WORKER, web.SERVER), func() { m.PushButton(kit.Dict(m.CommandKey(), "终端")) }) + }}, + web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { + web.DreamProcess(m, []string{}, arg...) + }}, + }, chat.FavorAction(), ctx.ProcessAction(), mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,path")), Hand: func(m *ice.Message, arg ...string) { if mdb.HashSelect(m, arg...); len(arg) == 0 { - if m.Length() == 0 { - m.Action(mdb.CREATE) - } else { - m.PushAction(html.OUTPUT, mdb.REMOVE).Action(mdb.CREATE, mdb.PRUNES, "terminal") - } + m.Action(mdb.CREATE, mdb.PRUNES, ice.APP) } else { - if m.Length() == 0 { - arg[0] = m.Cmdx("", mdb.CREATE, kit.SimpleKV("type,name,text,path", arg)) - mdb.HashSelect(m, arg[0]) - } - m.Push(mdb.HASH, arg[0]) + kit.If(m.Length() == 0, func() { arg[0] = m.Cmdx("", mdb.CREATE, arg); mdb.HashSelect(m, arg[0]) }) + m.Push(mdb.HASH, arg[0]).Action(html.OUTPUT, ice.APP) ctx.DisplayLocal(m, "") - m.Action("terminal") } }}, }) diff --git a/core/mall/asset.go b/core/mall/asset.go index bfb9939c..727d1f90 100644 --- a/core/mall/asset.go +++ b/core/mall/asset.go @@ -91,8 +91,7 @@ func init() { } web.Toast(m, "核算成功") }}, - }, mdb.ZoneAction()), Hand: func(m *ice.Message, arg ...string) { - m.Fields(len(arg), "time,account,amount,count", mdb.ZoneField(m)) + }, mdb.ZoneAction(mdb.FIELD, "time,account,amount,count")), Hand: func(m *ice.Message, arg ...string) { amount, count := 0, 0 if mdb.ZoneSelect(m, arg...); len(arg) == 0 { m.PushAction(CHECK) diff --git a/core/team/task.go b/core/team/task.go index eaf2afdc..62ef2e10 100644 --- a/core/team/task.go +++ b/core/team/task.go @@ -106,7 +106,7 @@ func init() { CANCEL: {Hand: func(m *ice.Message, arg ...string) { _task_modify(m, STATUS, CANCEL) }}, BEGIN: {Hand: func(m *ice.Message, arg ...string) { _task_modify(m, STATUS, PROCESS) }}, END: {Hand: func(m *ice.Message, arg ...string) { _task_modify(m, STATUS, FINISH) }}, - }, mdb.ImportantZoneAction(mdb.FIELD, "begin_time,close_time,id,status,level,score,type,name,text")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ImportantZoneAction(mdb.FIELDS, "begin_time,close_time,id,status,level,score,type,name,text")), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) > 0 && arg[0] != "" { status := map[string]int{} m.Table(func(value ice.Maps) { m.PushButton(_task_action(m, value[STATUS])) }) diff --git a/misc/bash/favor.go b/misc/bash/favor.go index 2c1b2e3b..7c4eac86 100644 --- a/misc/bash/favor.go +++ b/misc/bash/favor.go @@ -27,7 +27,7 @@ func init() { } }}, web.DOWNLOAD: {Hand: func(m *ice.Message, arg ...string) { web.RenderCache(m, m.Option(mdb.TEXT)) }}, - }, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text,pwd,username,hostname")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ZoneAction(mdb.FIELDS, "time,id,type,name,text,pwd,username,hostname")), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) == 0 { m.Action(mdb.EXPORT, mdb.IMPORT) } else { diff --git a/misc/ssh/channel.go b/misc/ssh/channel.go index 799bc99c..9baaf567 100644 --- a/misc/ssh/channel.go +++ b/misc/ssh/channel.go @@ -55,7 +55,7 @@ func init() { } }}, mdb.REPEAT: {Help: "执行", Hand: func(m *ice.Message, arg ...string) { m.Cmdy("", ctx.COMMAND, CMD, m.Option(mdb.TEXT)) }}, - }, mdb.HashAction(mdb.FIELDS, "time,hash,status,tty,count,username,hostport", mdb.FIELD, "time,id,type,text")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.FIELD, "time,hash,status,tty,count,username,hostport", mdb.FIELDS, "time,id,type,text")), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) == 0 { m.Table(func(value ice.Maps) { m.PushButton(kit.Select("", ctx.COMMAND, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) diff --git a/misc/ssh/service.go b/misc/ssh/service.go index d2769a85..6401e898 100644 --- a/misc/ssh/service.go +++ b/misc/ssh/service.go @@ -157,7 +157,7 @@ func init() { if mdb.HashSelect(m, m.Option(tcp.PORT)).Length() > 0 { mdb.HashModify(m, m.Option(tcp.PORT), mdb.STATUS, tcp.OPEN) } else { - mdb.HashCreate(m.Spawn(), m.OptionSimple(mdb.Config(m, mdb.FIELDS)), mdb.STATUS, tcp.OPEN) + mdb.HashCreate(m.Spawn(), m.OptionSimple(), mdb.STATUS, tcp.OPEN) m.Cmd("", ctx.LOAD, m.OptionSimple(AUTHKEY)) } m.Go(func() { @@ -195,7 +195,7 @@ func init() { } }}, }, mdb.StatusHashAction( - mdb.SHORT, tcp.PORT, mdb.FIELDS, "time,port,status,private,authkey,count", mdb.FIELD, "time,id,type,name,text", + mdb.SHORT, tcp.PORT, mdb.FIELD, "time,port,status,private,authkey,count", mdb.FIELDS, "time,id,type,name,text", WELCOME, "welcome to contexts world\r\n", GOODBYE, "goodbye of contexts world\r\n", )), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) == 0 { diff --git a/misc/ssh/session.go b/misc/ssh/session.go index eb7da0e3..c4af5cb4 100644 --- a/misc/ssh/session.go +++ b/misc/ssh/session.go @@ -61,7 +61,6 @@ func init() { } }}, }, mdb.PageZoneAction(mdb.SHORT, mdb.UNIQ, mdb.FIELD, "time,hash,count,status,connect", mdb.FIELDS, "time,id,type,text")), Hand: func(m *ice.Message, arg ...string) { - m.Fields(len(kit.Slice(arg, 0, 2)), mdb.Config(m, mdb.FIELD), mdb.Config(m, mdb.FIELDS)) if mdb.PageZoneSelect(m, arg...); len(arg) == 0 { m.Table(func(value ice.Maps) { m.PushButton(kit.Select("", ctx.COMMAND, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) diff --git a/misc/vim/favor.go b/misc/vim/favor.go index 37c0bba1..6af1cc15 100644 --- a/misc/vim/favor.go +++ b/misc/vim/favor.go @@ -22,7 +22,7 @@ func init() { ls := nfs.SplitPath(m, path.Join(kit.Select("", m.Option(cli.PWD), !path.IsAbs(m.Option(nfs.FILE))), m.Option(nfs.FILE))) ctx.ProcessField(m, "", []string{ls[0], ls[1], m.Option(nfs.LINE)}, arg...) }}, - }, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text,file,line,pwd")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ZoneAction(mdb.FIELDS, "time,id,type,name,text,file,line,pwd")), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) == 0 { m.Action(mdb.EXPORT, mdb.IMPORT) } else { diff --git a/misc/vim/tags.go b/misc/vim/tags.go index 8d81df1f..c67248e1 100644 --- a/misc/vim/tags.go +++ b/misc/vim/tags.go @@ -52,7 +52,7 @@ func init() { }}, INPUT: {Hand: func(m *ice.Message, arg ...string) { _tags_input(m, arg...) }}, code.INNER: {Hand: func(m *ice.Message, arg ...string) { ctx.ProcessField(m, "", m.OptionSplit("path,file,line"), arg...) }}, - }, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ZoneAction(mdb.FIELDS, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelectAll(m, arg...); len(arg) == 0 { m.Action(nfs.LOAD, mdb.EXPORT, mdb.IMPORT) } else { diff --git a/misc/wx/menu.go b/misc/wx/menu.go index 334f8899..f695c753 100644 --- a/misc/wx/menu.go +++ b/misc/wx/menu.go @@ -38,7 +38,7 @@ func init() { Index.MergeCommands(ice.Commands{ MENU: {Name: "menu zone id auto insert", Help: "菜单", Actions: ice.MergeActions(ice.Actions{ mdb.INSERT: {Name: "insert zone=home title=hi refer=hello image"}, - }, mdb.ZoneAction(mdb.FIELD, "time,id,title,refer,image")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.ZoneAction(mdb.FIELDS, "time,id,title,refer,image")), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) > 0 { _wx_action(m) }