diff --git a/base/cli/daemon.go b/base/cli/daemon.go
index 24b4cdac..402e9a98 100644
--- a/base/cli/daemon.go
+++ b/base/cli/daemon.go
@@ -71,6 +71,9 @@ const (
CMD = "cmd"
ARG = "arg"
DIR = "dir"
+ RUN = "run"
+ RES = "res"
+ ERR = "err"
)
const (
RESTART = "restart"
diff --git a/base/mdb/search.go b/base/mdb/search.go
index 7e4138ac..e2d214f0 100644
--- a/base/mdb/search.go
+++ b/base/mdb/search.go
@@ -30,7 +30,7 @@ func init() {
if strings.Contains(arg[1], ";") {
arg = strings.Split(arg[1], ";")
}
- m.Option(FIELDS, "pod,ctx,cmd,time,size,type,name,text")
+ m.Option(FIELDS, kit.Select("pod,ctx,cmd,time,size,type,name,text", m.Option(FIELDS)))
for _, k := range strings.Split(arg[0], ",") {
m.Richs(SEARCH, nil, k, func(key string, value map[string]interface{}) {
m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), SEARCH, arg[0], arg[1], kit.Select("", arg, 2))
diff --git a/base/web/share.go b/base/web/share.go
index 3777ad66..3d6cd57c 100644
--- a/base/web/share.go
+++ b/base/web/share.go
@@ -30,8 +30,10 @@ func _share_local(m *ice.Message, arg ...string) {
switch ls := strings.Split(p, "/"); ls[0] {
case "etc", "var":
// 私有文件
- m.Render(STATUS, http.StatusUnauthorized, "not auth")
- return
+ if m.Option(ice.MSG_USERROLE) == aaa.VOID {
+ m.Render(STATUS, http.StatusUnauthorized, "not auth")
+ return
+ }
default:
if m.Warn(!m.Right(ls), ice.ErrNotAuth, m.Option(ice.MSG_USERROLE), " of ", p) {
m.Render(STATUS, http.StatusUnauthorized, "not auth")
diff --git a/core/code/bench.go b/core/code/bench.go
index ff9f4e94..d773a544 100644
--- a/core/code/bench.go
+++ b/core/code/bench.go
@@ -2,6 +2,7 @@ package code
import (
ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits"
"github.com/shylinux/toolkits/util/bench"
@@ -14,43 +15,7 @@ import (
"sync/atomic"
)
-func _bench_list(m *ice.Message, zone string, id string, field ...interface{}) {
- m.Richs(BENCH, nil, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) {
- val = val[kit.MDB_META].(map[string]interface{})
- if zone = kit.Format(kit.Value(val, kit.MDB_ZONE)); id == "" {
- m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
- // 查看信息
- // m.Push("操作", m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行"))
- m.Push(zone, value, []string{
- kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE,
- kit.MDB_NAME, NCONN, NREQS, kit.MDB_TEXT,
- }, val)
- })
- return
- }
- m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) {
- // 查看信息
- m.Push("detail", value)
- m.Push(kit.MDB_KEY, "操作")
- // m.Push(kit.MDB_VALUE, m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行"))
- })
- })
-}
-func _bench_show(m *ice.Message, nconn, nreq int64, list []*http.Request) {
- var body int64
- s, e := bench.HTTP(nconn, nreq, list, func(req *http.Request, res *http.Response) {
- n, _ := io.Copy(ioutil.Discard, res.Body)
- atomic.AddInt64(&body, n)
- })
- m.Assert(e)
-
- m.Echo(s.Show())
- m.Echo("body: %d\n", body)
-}
-func _bench_engine(m *ice.Message, kind, name, target string, arg ...string) {
- for i := 0; i < len(arg); i += 2 {
- m.Option(arg[i], arg[i+1])
- }
+func _bench_http(m *ice.Message, kind, name, target string, arg ...string) {
nconn := kit.Int64(kit.Select("10", m.Option(NCONN)))
nreqs := kit.Int64(kit.Select("1000", m.Option(NREQS)))
m.Echo("nconn: %d nreqs: %d\n", nconn, nreqs*nconn)
@@ -72,90 +37,60 @@ func _bench_engine(m *ice.Message, kind, name, target string, arg ...string) {
list = append(list, req)
}
}
- _bench_show(m, nconn, nreqs, list)
-}
-func _bench_modify(m *ice.Message, zone, id, k, v, old string) {
- m.Richs(BENCH, nil, zone, func(key string, val map[string]interface{}) {
- switch k {
- case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
- // m.Warn(true, mdb.ErrDenyModify, k)
- return
- }
-
- m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) {
- // 修改信息
- m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old)
- kit.Value(value, k, v)
- })
+ var body int64
+ s, e := bench.HTTP(nconn, nreqs, list, func(req *http.Request, res *http.Response) {
+ n, _ := io.Copy(ioutil.Discard, res.Body)
+ atomic.AddInt64(&body, n)
})
-}
-func _bench_insert(m *ice.Message, zone, kind, name, text string, nconn, nreqs string, arg ...string) {
- m.Richs(BENCH, nil, zone, func(key string, value map[string]interface{}) {
- id := m.Grow(BENCH, kit.Keys(kit.MDB_HASH, key), kit.Dict(
- kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text,
- NCONN, nconn, NREQS, nreqs, kit.MDB_EXTRA, kit.Dict(arg),
- ))
- m.Log_INSERT(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_TYPE, kind, kit.MDB_NAME, name)
- m.Echo("%d", id)
- })
-}
-func _bench_create(m *ice.Message, zone string, arg ...string) {
- m.Rich(BENCH, nil, kit.Data(kit.MDB_ZONE, zone, arg))
- m.Log_CREATE(kit.MDB_ZONE, zone)
+ m.Assert(e)
+
+ m.Echo(s.Show())
+ m.Echo("body: %d\n", body)
+ m.Option(ice.MSG_PROCESS, "_inner")
}
-const BENCH = "bench"
const (
NCONN = "nconn"
NREQS = "nreqs"
)
+const BENCH = "bench"
+
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
- BENCH: {Name: "bench", Help: "性能压测", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE)},
+ BENCH: {Name: BENCH, Help: "性能压测", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE)},
},
Commands: map[string]*ice.Command{
- BENCH: {Name: "bench zone=auto id=auto auto", Help: "性能压测", Action: map[string]*ice.Action{
+ BENCH: {Name: "bench zone=auto id=auto auto insert", Help: "性能压测", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- _bench_create(m, arg[0])
+ m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, arg)
}},
- mdb.INSERT: {Name: "insert zone type name text nconn nreqs", Help: "插入", Hand: func(m *ice.Message, arg ...string) {
- _bench_insert(m, arg[0], arg[1], arg[2],
- kit.Select("http://localhost:9020/code/bench?cmd="+arg[2], arg, 3),
- kit.Select("3", arg, 4), kit.Select("10", arg, 5))
+ mdb.INSERT: {Name: "insert zone type=http,redis name text nconn=3 nreqs=10", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, kit.MDB_ZONE, arg[1])
+ m.Cmdy(mdb.INSERT, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:])
}},
- mdb.MODIFY: {Name: "modify key value old", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
- _bench_modify(m, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), arg[0], arg[1], kit.Select("", arg, 2))
+ mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.MODIFY, BENCH, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
+ }},
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.DELETE, BENCH, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE))
}},
- mdb.ENGINE: {Name: "engine type name text arg...", Help: "引擎", Hand: func(m *ice.Message, arg ...string) {
- _bench_engine(m, arg[0], arg[1], arg[2], arg[3:]...)
- }},
-
- kit.MDB_SHOW: {Name: "show type name text arg...", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
- if len(arg) < 4 {
- m.Richs(BENCH, nil, m.Option(kit.MDB_ZONE), func(key string, val map[string]interface{}) {
- m.Grows(BENCH, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, m.Option(kit.MDB_ID), func(index int, value map[string]interface{}) {
- arg = kit.Simple(value[kit.MDB_TYPE], value[kit.MDB_NAME], value[kit.MDB_TEXT], value[kit.MDB_EXTRA])
- })
- })
+ cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
+ switch m.Option(kit.MDB_TYPE) {
+ case "http":
+ _bench_http(m, m.Option(kit.MDB_TYPE), m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT))
}
- if len(arg) > 2 {
- m.Option(kit.MDB_TYPE, arg[0])
- m.Option(kit.MDB_NAME, arg[1])
- m.Option(kit.MDB_TEXT, arg[2])
- for i := 3; i < len(arg)-1; i++ {
- m.Option(arg[i], arg[i+1])
- }
- }
- m.Cmdy(mdb.ENGINE, m.Option(kit.MDB_TYPE), m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _bench_list(m, kit.Select(kit.MDB_FOREACH, arg, 0), kit.Select("", arg, 1))
+ m.Option(mdb.FIELDS, kit.Select("time,count,zone", kit.Select("time,id,type,name,text,nconn,nreqs", mdb.DETAIL, len(arg) > 1), len(arg) > 0))
+ m.Cmdy(mdb.SELECT, BENCH, "", mdb.ZONE, arg)
+ m.PushAction(kit.Select(mdb.REMOVE, cli.RUN, len(arg) > 0))
}},
- "/" + BENCH: {Name: "/bench cmd...", Help: "性能压测", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
+
+ "/bench": {Name: "/bench cmd...", Help: "性能压测", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(m.Optionv("cmd"))
}},
},
diff --git a/core/code/code.shy b/core/code/code.shy
index caea0695..fcbc8c07 100644
--- a/core/code/code.shy
+++ b/core/code/code.shy
@@ -6,10 +6,8 @@ chapter "code"
# field "发布" web.code.publish
# field "升级" web.code.upgrade
-field "查看" web.code.inner
-return
-
field "编辑" web.code.vimer
+field "查看" web.code.inner
field "收藏" web.code.favor
field "测试" web.code.bench
field "优化" web.code.pprof
diff --git a/core/code/favor.go b/core/code/favor.go
index bf67c356..8ca57a7e 100644
--- a/core/code/favor.go
+++ b/core/code/favor.go
@@ -18,11 +18,12 @@ func init() {
FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TOPIC)},
},
Commands: map[string]*ice.Command{
- FAVOR: {Name: "favor topic id auto create export import", Help: "收藏夹", Action: map[string]*ice.Action{
+ FAVOR: {Name: "favor topic id auto insert export import", Help: "收藏夹", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, FAVOR, "", mdb.HASH, arg)
}},
mdb.INSERT: {Name: "insert topic=数据结构 type=go name=hi text=hello path file line", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.INSERT, FAVOR, "", mdb.HASH, kit.MDB_TOPIC, arg[1])
m.Cmdy(mdb.INSERT, FAVOR, _sub_key(m, m.Option(kit.MDB_TOPIC)), mdb.LIST, arg[2:])
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
@@ -46,7 +47,7 @@ func init() {
}
}},
- INNER: {Name: "inner", Help: "inner", Hand: func(m *ice.Message, arg ...string) {
+ INNER: {Name: "inner", Help: "源代码", Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 && arg[0] == mdb.RENDER {
m.Cmdy(INNER, arg[1:])
return
@@ -56,7 +57,7 @@ func init() {
m.Push(kit.SSH_ARG, kit.Format([]string{m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE), m.Option(kit.MDB_LINE)}))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Option(mdb.FIELDS, kit.Select("time,count,topic", kit.Select("time,id,type,name,text,path,file,line", mdb.DETAIL, len(arg) > 1)), len(arg) > 0)
+ m.Option(mdb.FIELDS, kit.Select("time,count,topic", kit.Select("time,id,type,name,text,path,file,line", mdb.DETAIL, len(arg) > 1), len(arg) > 0))
m.Cmdy(mdb.SELECT, FAVOR, "", mdb.ZONE, arg)
m.PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0))
}},
diff --git a/core/code/go.go b/core/code/go.go
index e3776ae5..cb1e16a6 100644
--- a/core/code/go.go
+++ b/core/code/go.go
@@ -14,22 +14,32 @@ import (
)
func _go_find(m *ice.Message, key string) {
+ fields := kit.Split(m.Option(mdb.FIELDS))
for _, p := range strings.Split(m.Cmdx(cli.SYSTEM, "find", ".", "-name", key), "\n") {
if p == "" {
continue
}
- m.Push("file", strings.TrimPrefix(p, "./"))
- m.Push("line", 1)
- m.Push("text", "")
+ for _, k := range fields {
+ switch k {
+ case kit.MDB_FILE:
+ m.Push(k, strings.TrimPrefix(p, "./"))
+ case kit.MDB_LINE:
+ m.Push(k, 1)
+ case kit.MDB_TEXT:
+ m.Push(k, "")
+ }
+ }
}
}
func _go_tags(m *ice.Message, key string) {
- ls := strings.Split(key, ".")
- key = ls[len(ls)-1]
-
if _, e := os.Stat(path.Join(m.Option(cli.CMD_DIR), ".tags")); e != nil {
m.Cmd(cli.SYSTEM, "gotags", "-R", "-f", ".tags", "./")
}
+
+ fields := kit.Split(m.Option(mdb.FIELDS))
+ ls := strings.Split(key, ".")
+ key = ls[len(ls)-1]
+
for _, l := range strings.Split(m.Cmdx(cli.SYSTEM, "grep", "^"+key+"\\>", ".tags"), "\n") {
ls := strings.SplitN(l, "\t", 2)
if len(ls) < 2 {
@@ -42,22 +52,35 @@ func _go_tags(m *ice.Message, key string) {
text := strings.TrimSuffix(strings.TrimPrefix(ls[0], "/^"), "$/")
line := kit.Int(text)
- p := path.Join(m.Option(cli.CMD_DIR), file)
- f, e := os.Open(p)
+ f, e := os.Open(path.Join(m.Option(cli.CMD_DIR), file))
m.Assert(e)
+ defer f.Close()
+
bio := bufio.NewScanner(f)
for i := 1; bio.Scan(); i++ {
if i == line || bio.Text() == text {
- m.Push("file", strings.TrimPrefix(file, "./"))
- m.Push("line", i)
- m.Push("text", bio.Text())
+ for _, k := range fields {
+ switch k {
+ case kit.MDB_FILE:
+ m.Push(k, strings.TrimPrefix(file, "./"))
+ case kit.MDB_LINE:
+ m.Push(k, i)
+ case kit.MDB_TEXT:
+ m.Push(k, bio.Text())
+ }
+ }
}
}
}
- m.Sort("line", "int")
}
func _go_grep(m *ice.Message, key string) {
- m.Split(m.Cmd(cli.SYSTEM, "grep", "--exclude-dir=.git", "--exclude=.[a-z]*", "-rn", key, ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n")
+ fields := kit.Split(m.Option(mdb.FIELDS))
+
+ msg := m.Spawn()
+ msg.Split(m.Cmd(cli.SYSTEM, "grep", "--exclude-dir=.git", "--exclude=.[a-z]*", "-rn", key, ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n")
+ msg.Table(func(index int, value map[string]string, head []string) {
+ m.Push("", value, fields)
+ })
}
func _go_help(m *ice.Message, key string) {
p := m.Cmd(cli.SYSTEM, "go", "doc", key).Append(cli.CMD_OUT)
@@ -70,13 +93,20 @@ func _go_help(m *ice.Message, key string) {
}
res := strings.Join(ls, "\n")
- m.Push("file", key+".godoc")
- m.Push("line", 1)
- m.Push("text", string(res))
+ for _, k := range kit.Split(m.Option(mdb.FIELDS)) {
+ switch k {
+ case kit.MDB_FILE:
+ m.Push(k, key+".godoc")
+ case kit.MDB_LINE:
+ m.Push(k, 1)
+ case kit.MDB_TEXT:
+ m.Push(k, string(res))
+ }
+ }
}
const GO = "go"
-const GODOC = "godoc"
+const DOC = "godoc"
const MOD = "mod"
const SUM = "sum"
@@ -84,20 +114,20 @@ func init() {
Index.Register(&ice.Context{Name: GO, Help: "go",
Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- m.Cmd(mdb.PLUGIN, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW))
- m.Cmd(mdb.RENDER, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW))
- m.Cmd(mdb.SEARCH, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW))
- m.Cmd(mdb.ENGINE, mdb.CREATE, GO, GO, c.Cap(ice.CTX_FOLLOW))
+ m.Cmd(mdb.PLUGIN, mdb.CREATE, GO, m.Prefix(GO))
+ m.Cmd(mdb.RENDER, mdb.CREATE, GO, m.Prefix(GO))
+ m.Cmd(mdb.ENGINE, mdb.CREATE, GO, m.Prefix(GO))
+ m.Cmd(mdb.SEARCH, mdb.CREATE, GO, m.Prefix(GO))
- m.Cmd(mdb.PLUGIN, mdb.CREATE, GODOC, GO, c.Cap(ice.CTX_FOLLOW))
- m.Cmd(mdb.RENDER, mdb.CREATE, GODOC, GODOC, c.Cap(ice.CTX_FOLLOW))
- m.Cmd(mdb.SEARCH, mdb.CREATE, GODOC, GO, c.Cap(ice.CTX_FOLLOW))
+ m.Cmd(mdb.PLUGIN, mdb.CREATE, DOC, m.Prefix(DOC))
+ m.Cmd(mdb.RENDER, mdb.CREATE, DOC, m.Prefix(DOC))
+ m.Cmd(mdb.SEARCH, mdb.CREATE, DOC, m.Prefix(GO))
- m.Cmd(mdb.PLUGIN, mdb.CREATE, MOD, MOD, c.Cap(ice.CTX_FOLLOW))
- m.Cmd(mdb.RENDER, mdb.CREATE, MOD, MOD, c.Cap(ice.CTX_FOLLOW))
+ m.Cmd(mdb.PLUGIN, mdb.CREATE, MOD, m.Prefix(MOD))
+ m.Cmd(mdb.RENDER, mdb.CREATE, MOD, m.Prefix(MOD))
- m.Cmd(mdb.PLUGIN, mdb.CREATE, SUM, SUM, c.Cap(ice.CTX_FOLLOW))
- m.Cmd(mdb.RENDER, mdb.CREATE, SUM, SUM, c.Cap(ice.CTX_FOLLOW))
+ m.Cmd(mdb.PLUGIN, mdb.CREATE, SUM, m.Prefix(SUM))
+ m.Cmd(mdb.RENDER, mdb.CREATE, SUM, m.Prefix(SUM))
}},
SUM: {Name: SUM, Help: "sum", Action: map[string]*ice.Action{
@@ -116,7 +146,10 @@ func init() {
m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1]))
}},
}},
- GODOC: {Name: GODOC, Help: "godoc", Action: map[string]*ice.Action{
+ DOC: {Name: DOC, Help: "doc", Action: map[string]*ice.Action{
+ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) {
+ m.Echo(m.Conf(GO, "meta.plug"))
+ }},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, arg[2])
m.Echo(m.Cmdx(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], "."+arg[0])))
@@ -126,16 +159,6 @@ func init() {
mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(m.Conf(GO, "meta.plug"))
}},
- mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
- if arg[0] == kit.MDB_FOREACH {
- return
- }
- m.Option(cli.CMD_DIR, kit.Select("src", arg, 2))
- _go_find(m, kit.Select("main", arg, 1))
- _go_tags(m, kit.Select("main", arg, 1))
- _go_help(m, kit.Select("main", arg, 1))
- _go_grep(m, kit.Select("main", arg, 1))
- }},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1]))
}},
@@ -148,7 +171,17 @@ func init() {
}
m.Set(ice.MSG_APPEND)
}},
- }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
+ mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
+ if arg[0] == kit.MDB_FOREACH {
+ return
+ }
+ m.Option(cli.CMD_DIR, kit.Select("src", arg, 2))
+ _go_find(m, kit.Select("main", arg, 1))
+ _go_tags(m, kit.Select("main", arg, 1))
+ _go_help(m, kit.Select("main", arg, 1))
+ _go_grep(m, kit.Select("main", arg, 1))
+ }},
+ }},
},
Configs: map[string]*ice.Config{
GO: {Name: GO, Help: "go", Value: kit.Data(
@@ -165,7 +198,7 @@ func init() {
),
"plug", kit.Dict(
"split", kit.Dict(
- "space", " \t",
+ "space", "\t ",
"operator", "{[(&.,:;!|<>)]}",
),
"prefix", kit.Dict(
diff --git a/core/code/inner.go b/core/code/inner.go
index 7f9313cc..25e87459 100644
--- a/core/code/inner.go
+++ b/core/code/inner.go
@@ -53,7 +53,7 @@ const INNER = "inner"
func init() {
Index.Merge(&ice.Context{
Commands: map[string]*ice.Command{
- INNER: {Name: "inner path=src/ file=main.go line=1 auto project search", Help: "阅读器", Meta: kit.Dict(
+ INNER: {Name: "inner path=src/ file=main.go line=1 auto project search", Help: "源代码", Meta: kit.Dict(
"display", "/plugin/local/code/inner.js", "style", "editor",
"trans", kit.Dict("project", "项目"),
), Action: map[string]*ice.Action{
@@ -71,18 +71,13 @@ func init() {
_inner_show(m, arg[0], arg[1], arg[2], arg[3:]...)
}},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
+ m.Option(mdb.FIELDS, "file,line,text")
m.Cmdy(mdb.SEARCH, arg)
}},
- mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(FAVOR, mdb.INPUTS, arg)
- }},
- FAVOR: {Name: "favor", Help: "收藏", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(FAVOR, mdb.INSERT, arg)
- }},
- nfs.DIR: {Name: "dir", Help: "目录", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(nfs.DIR, arg)
- }},
+ FAVOR: {Name: "favor insert", Help: "收藏"},
+ mdb.INPUTS: {Name: "favor inputs", Help: "补全"},
+ nfs.DIR: {Name: "dir", Help: "目录"},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) < 2 {
m.Cmdy(nfs.DIR, kit.Select("./", arg, 0))
@@ -92,7 +87,7 @@ func init() {
}},
},
Configs: map[string]*ice.Config{
- INNER: {Name: "inner", Help: "阅读器", Value: kit.Data(
+ INNER: {Name: "inner", Help: "源代码", Value: kit.Data(
"source", kit.Dict(
"license", "true", "makefile", "true",
"shy", "true", "py", "true",
@@ -102,7 +97,6 @@ func init() {
"log", "true", "err", "true",
"md", "true", "conf", "true", "toml", "true",
- "ts", "true", "tsx", "true", "vue", "true", "sass", "true",
),
"plug", kit.Dict(
"makefile", kit.Dict(
diff --git a/core/code/pprof.go b/core/code/pprof.go
index 188bea61..0eb929f8 100644
--- a/core/code/pprof.go
+++ b/core/code/pprof.go
@@ -2,7 +2,11 @@ package code
import (
ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/aaa"
+ "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
+ "github.com/shylinux/icebergs/base/tcp"
+ "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
"net/http"
@@ -10,72 +14,14 @@ import (
"strings"
)
-func _pprof_list(m *ice.Message, zone string, id string, field ...interface{}) {
- m.Richs(PPROF, nil, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) {
- val = val[kit.MDB_META].(map[string]interface{})
- if zone = kit.Format(kit.Value(val, kit.MDB_ZONE)); id == "" {
- m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
- // 列表信息
- // m.Push("操作", m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行"))
- m.Push(zone, value, []string{
- kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TYPE,
- kit.MDB_NAME, kit.MDB_TEXT, SECONDS, BINNARY, SERVICE,
- }, val)
- })
- } else {
- m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) {
- // 详细信息
- m.Push("detail", value)
- m.Push(kit.MDB_KEY, "操作")
- // m.Push(kit.MDB_VALUE, m.Cmdx(mdb.RENDER, web.RENDER.Button, "运行"))
- })
- }
- })
-}
-func _pprof_modify(m *ice.Message, zone, id, k, v, old string) {
- k = kit.Select(k, m.Option(kit.MDB_KEY))
- m.Richs(PPROF, nil, kit.Select(kit.MDB_FOREACH, zone), func(key string, val map[string]interface{}) {
- switch k {
- case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
- // m.Warn(true, mdb.ErrDenyModify, k)
- return
- case BINNARY, SERVICE, SECONDS:
- // 修改信息
- m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old)
- val = val[kit.MDB_META].(map[string]interface{})
- kit.Value(val, k, v)
- return
- }
-
- m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), kit.MDB_ID, id, func(index int, value map[string]interface{}) {
- // 修改信息
- m.Log_MODIFY(kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_KEY, k, kit.MDB_VALUE, v, "old", old)
- kit.Value(value, k, v)
- })
- })
-}
-func _pprof_insert(m *ice.Message, zone, kind, name, text string, arg ...string) {
- m.Richs(PPROF, nil, zone, func(key string, val map[string]interface{}) {
- id := m.Grow(PPROF, kit.Keys(kit.MDB_HASH, key), kit.Dict(
- kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, text,
- kit.MDB_EXTRA, kit.Dict(arg),
- ))
- m.Log_INSERT(kit.MDB_META, PPROF, kit.MDB_ZONE, zone, kit.MDB_ID, id, kit.MDB_TYPE, kind, kit.MDB_NAME, name)
- m.Echo("%d", id)
- })
-}
-func _pprof_create(m *ice.Message, zone string, binnary, service string, seconds string, arg ...string) {
- m.Rich(PPROF, nil, kit.Data(kit.MDB_ZONE, zone, BINNARY, binnary, SERVICE, service, SECONDS, seconds, arg))
- m.Log_CREATE(kit.MDB_ZONE, zone)
-}
-
-const PPROF = "pprof"
const (
BINNARY = "binnary"
SERVICE = "service"
SECONDS = "seconds"
)
+const PPROF = "pprof"
+
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
@@ -84,29 +30,55 @@ func init() {
)},
},
Commands: map[string]*ice.Command{
- PPROF: {Name: "pprof zone=auto id=auto auto", Help: "性能分析", Action: map[string]*ice.Action{
- mdb.CREATE: {Name: "create zone [binnary [service [seconds]]]", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- _pprof_create(m, arg[0], kit.Select("bin/ice.bin", arg, 1),
- kit.Select("http://localhost:9020/code/pprof/profile", arg, 2), kit.Select("3", arg, 3))
+ PPROF: {Name: "pprof zone=auto id=auto auto create", Help: "性能分析", Action: map[string]*ice.Action{
+ mdb.CREATE: {Name: "create zone binnary service seconds", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.INSERT, PPROF, "", mdb.HASH, arg)
}},
- mdb.INSERT: {Name: "insert zone type name [text]", Help: "插入", Hand: func(m *ice.Message, arg ...string) {
- if len(arg) == 2 {
- arg = append(arg, "")
+ mdb.INSERT: {Name: "insert zone type name text", Help: "插入", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:])
+ }},
+ mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.MODIFY, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
+ }},
+ mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy(mdb.DELETE, PPROF, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE))
+ }},
+
+ cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
+ msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, m.Option(SERVICE), SECONDS, m.Option(SECONDS))
+
+ cmd := kit.Simple(m.Confv(PPROF, "meta.pprof"), "-text", m.Option(BINNARY), msg.Append(kit.MDB_FILE))
+ res := strings.Split(m.Cmdx(cli.SYSTEM, cmd), "\n")
+ if len(res) > 20 {
+ res = res[:20]
}
- if len(arg) == 3 {
- arg = append(arg, "")
- }
- _pprof_insert(m, arg[0], arg[1], arg[2], kit.Select("http://localhost:9020/code/bench?cmd="+arg[2], arg, 3), arg[4:]...)
+
+ m.Cmd(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_TEXT, strings.Join(res, "\n"), kit.MDB_FILE, msg.Append(kit.MDB_FILE))
+ m.Echo(strings.Join(res, "\n"))
+ m.Option(ice.MSG_PROCESS, "_inner")
}},
- mdb.MODIFY: {Name: "modify key value old", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
- _pprof_modify(m, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), arg[0], arg[1], kit.Select("", arg, 2))
- }},
- kit.MDB_SHOW: {Name: "show type name text arg...", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
- // _pprof_show(m, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID))
+ web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) {
+ m.Option(ice.MSG_PROCESS, "_inner")
+ u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
+ p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.Right)
+
+ m.Cmd(cli.DAEMON, m.Confv(PPROF, "meta.pprof"), "-http="+p, m.Option(BINNARY), m.Option(kit.MDB_FILE))
+ m.Echo("http://%s/ui/top", p)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
- _pprof_list(m, kit.Select(kit.MDB_FOREACH, arg, 0), kit.Select("", arg, 1))
+ m.Option(mdb.FIELDS, kit.Select("time,count,zone,binnary,service,seconds", kit.Select("time,id,text,binnary,file", mdb.DETAIL, len(arg) > 1), len(arg) > 0))
+ m.Cmdy(mdb.SELECT, PPROF, "", mdb.ZONE, arg)
+ if len(arg) == 0 {
+ m.PushAction(cli.RUN, mdb.REMOVE)
+
+ } else {
+ m.Table(func(index int, value map[string]string, head []string) {
+ m.PushDownload("pprof.pd.gz", value[kit.MDB_FILE])
+ m.PushButton(web.SERVE)
+ })
+ }
}},
+
"/pprof/": {Name: "/pprof/", Help: "性能分析", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.R.URL.Path = strings.Replace("/code"+m.R.URL.Path, "code", "debug", 1)
http.DefaultServeMux.ServeHTTP(m.W, m.R)
diff --git a/core/code/vimer.go b/core/code/vimer.go
index ae6090f2..1cb70472 100644
--- a/core/code/vimer.go
+++ b/core/code/vimer.go
@@ -1,46 +1,34 @@
package code
import (
+ "strings"
+
ice "github.com/shylinux/icebergs"
+ "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/nfs"
- "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
"path"
)
-func _vimer_path(m *ice.Message, arg ...string) string {
- return path.Join(m.Option(ice.MSG_LOCAL), path.Join(arg...))
-}
-func _vimer_upload(m *ice.Message, dir string) {
- up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
- if p := _vimer_path(m, dir, up[1]); m.Option(ice.MSG_USERPOD) == "" {
- m.Cmdy(web.CACHE, web.WATCH, up[0], p)
- } else {
- m.Cmdy(web.SPIDE, web.SPIDE_DEV, web.SPIDE_SAVE, p, web.SPIDE_GET, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/cache/"+up[0]))
- }
-}
-
const VIMER = "vimer"
func init() {
Index.Merge(&ice.Context{
- Configs: map[string]*ice.Config{},
Commands: map[string]*ice.Command{
- VIMER: {Name: "vimer path=usr/demo file=hi.sh line=1 刷新:button=auto save project search", Help: "编辑器", Meta: kit.Dict(
+ VIMER: {Name: "vimer path=src/ file=main.go line=1 刷新:button=auto save display project search", Help: "编辑器", Meta: kit.Dict(
"display", "/plugin/local/code/vimer.js", "style", "editor",
- "trans", kit.Dict("project", "项目", "search", "搜索"),
+ "trans", kit.Dict("display", "运行", "project", "项目", "search", "搜索"),
), Action: map[string]*ice.Action{
- web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
- _vimer_upload(m, m.Option(kit.MDB_PATH))
- }},
nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.SAVE, path.Join(m.Option(kit.MDB_PATH), m.Option(kit.MDB_FILE)))
}},
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
- if !m.Warn(!m.Right(arg)) {
- m.Cmdy(arg)
+ if arg = kit.Split(strings.Join(arg, " ")); !m.Warn(!m.Right(arg)) {
+ if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 {
+ m.Cmdy(cli.SYSTEM, arg)
+ }
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
diff --git a/misc.go b/misc.go
index 467ff819..971d7a87 100644
--- a/misc.go
+++ b/misc.go
@@ -86,7 +86,7 @@ func (m *Message) PushRender(key, view, name string, arg ...string) *Message {
case "a":
m.Push(key, fmt.Sprintf(`%s`, kit.Select(name, arg, 0), name))
case "download":
- m.Push(key, fmt.Sprintf(`%s`, kit.Select(name, arg, 0), path.Base(kit.Select(name, arg, 0)), name))
+ m.Push(key, fmt.Sprintf(`%s`, kit.Select(name, arg, 0), path.Base(name), name))
default:
m.Push(key, name)
}
diff --git a/type.go b/type.go
index 87bd702b..5cfb0f23 100644
--- a/type.go
+++ b/type.go
@@ -104,7 +104,7 @@ func (c *Context) _hand(m *Message, cmd *Command, key string, k string, h *Actio
}
}
if h.Hand == nil {
- m.Cmdy(kit.Split(h.Name))
+ m.Cmdy(kit.Split(h.Name), arg)
} else {
h.Hand(m, arg...)
}