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