diff --git a/base/ctx/process.go b/base/ctx/process.go index 98d4210c..c2b0eadf 100644 --- a/base/ctx/process.go +++ b/base/ctx/process.go @@ -45,6 +45,7 @@ func ProcessFloat(m *ice.Message, arg ...string) { m.Option(ice.PROCESS_ARG, arg) m.Cmdy(COMMAND, arg[0]) } + func ProcessField(m *ice.Message, cmd string, args ice.Any, arg ...string) { if cmd = kit.Select(m.ActionKey(), cmd); len(arg) == 0 || arg[0] != ice.RUN { m.Option("_index", m.PrefixKey()) diff --git a/base/mdb/hash.go b/base/mdb/hash.go index eb70d083..c12461dc 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -4,6 +4,7 @@ import ( "encoding/json" "io" "path" + "strings" ice "shylinux.com/x/icebergs" kit "shylinux.com/x/toolkits" @@ -184,7 +185,7 @@ func HashInputs(m *ice.Message, arg ...Any) *ice.Message { } func HashCreate(m *ice.Message, arg ...Any) string { if len(arg) == 0 { - arg = append(arg, m.OptionSimple(HashField(m))) + arg = append(arg, m.OptionSimple(strings.Replace(HashField(m), "hash,", "", 1))) } return m.Echo(m.Cmdx(append(kit.List(INSERT, m.PrefixKey(), "", HASH, logs.FileLineMeta(-1)), arg...)...)).Result() } @@ -270,7 +271,7 @@ func HashSelectField(m *ice.Message, key string, field string) (value string) { if field == HASH { value = key } else { - value = kit.Format(val[field]) + value = kit.Format(kit.Value(val, field)) } }) return @@ -293,6 +294,8 @@ func HashSelectTarget(m *ice.Message, key string, create Any) (target Any) { switch create := create.(type) { case func(ice.Map) ice.Any: target = create(value) + case func(ice.Maps) ice.Any: + target = create(ToMaps(value)) case func() ice.Any: target = create() default: diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 2a0006d4..07320c50 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -33,6 +33,13 @@ func _mdb_modify(m *ice.Message, value ice.Map, field string, arg ...string) { } }) } +func ToMaps(value ice.Map) ice.Maps { + res := Maps{} + for k, v := range value { + res[k] = kit.Format(v) + } + return res +} func _mdb_select(m *ice.Message, cb Any, key string, value Map, fields []string, val Map) { switch value, val = kit.GetMeta(value), kit.GetMeta(val); cb := cb.(type) { case func([]string, Map): @@ -48,11 +55,7 @@ func _mdb_select(m *ice.Message, cb Any, key string, value Map, fields []string, case func(Any): cb(value[TARGET]) case func(Maps): - res := Maps{} - for k, v := range value { - res[k] = kit.Format(v) - } - cb(res) + cb(ToMaps(value)) case string, []string, []ice.Any, nil: if m.FieldsIsDetail() { m.Push(ice.FIELDS_DETAIL, value) diff --git a/base/nfs/cat.go b/base/nfs/cat.go index df509c0f..190f87b4 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -166,9 +166,14 @@ func OptionLoad(m *ice.Message, file string) *ice.Message { return m } -func Template(m *ice.Message, file string, arg ...ice.Any) string { +type templateMessage interface { + PrefixKey(arg ...ice.Any) string + Cmdx(arg ...ice.Any) string +} + +func Template(m templateMessage, file string, arg ...ice.Any) string { return kit.Renders(kit.Format(TemplateText(m, file), arg...), m) } -func TemplateText(m *ice.Message, file string) string { +func TemplateText(m templateMessage, file string) string { return m.Cmdx(CAT, path.Join(m.PrefixKey(), path.Base(file)), kit.Dict(DIR_ROOT, ice.SRC_TEMPLATE)) } diff --git a/base/nfs/pack.go b/base/nfs/pack.go index daa13377..eca4e2a5 100644 --- a/base/nfs/pack.go +++ b/base/nfs/pack.go @@ -103,8 +103,9 @@ func ReadDir(m Message, p string) ([]os.FileInfo, error) { } return list, e } -func MkdirAll(m Message, p string) error { - return OptionFiles(m).MkdirAll(p, ice.MOD_DIR) +func MkdirAll(m Message, p string) string { + OptionFiles(m).MkdirAll(p, ice.MOD_DIR) + return p } func RemoveAll(m Message, p string) error { return OptionFiles(m).RemoveAll(p) diff --git a/base/web/dream.go b/base/web/dream.go index b51dd3cb..c2db0386 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -160,6 +160,7 @@ func init() { if len(arg) == 0 { _dream_list(m) } else if arg[0] == ctx.ACTION { + m.Option(ice.POD, m.Option(nfs.NAME)) gdb.Event(m, DREAM_ACTION, arg) } else { m.Cmdy(nfs.CAT, arg[1:], kit.Dict(nfs.DIR_ROOT, path.Join(ice.USR_LOCAL_WORK, arg[0]))) diff --git a/base/web/serve.go b/base/web/serve.go index e411e1e1..dc7bc80f 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -151,7 +151,11 @@ func _serve_domain(m *ice.Message) string { } func _serve_login(m *ice.Message, key string, cmds []string, w http.ResponseWriter, r *http.Request) ([]string, bool) { if aaa.SessCheck(m, m.Option(ice.MSG_SESSID)); m.Option(ice.MSG_USERNAME) == "" && r.URL.Path != PP(SPACE) && !strings.HasPrefix(r.URL.Path, "/sync") { - gdb.Event(m, SERVE_LOGIN) + if m.Conf(SERVE, kit.Keym(tcp.LOCALHOST)) == ice.TRUE && tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) { + aaa.UserRoot(m) + } else { + gdb.Event(m, SERVE_LOGIN) + } } if _, ok := m.Target().Commands[WEB_LOGIN]; ok { return cmds, !m.Target().Cmd(m, WEB_LOGIN, kit.Simple(key, cmds)...).IsErr() @@ -228,11 +232,6 @@ func init() { } } }}, - SERVE_LOGIN: {Hand: func(m *ice.Message, arg ...string) { - if m.Option(ice.MSG_USERNAME) == "" && m.Config(tcp.LOCALHOST) == ice.TRUE && tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) { - aaa.UserRoot(m) - } - }}, DOMAIN: {Hand: func(m *ice.Message, arg ...string) { if len(arg) > 0 { m.Config(tcp.LOCALHOST, ice.FALSE) diff --git a/base/web/space.go b/base/web/space.go index 7b56af89..e9ef8d60 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -192,6 +192,8 @@ func init() { case aaa.LOGIN: } }) + } else if arg[0] == mdb.FOREACH && arg[1] == ssh.SHELL { + m.PushSearch(mdb.TYPE, ssh.SHELL, mdb.TEXT, "ice.bin space dial dev ops") } }}, mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { diff --git a/base/web/spide.go b/base/web/spide.go index b08e8729..993f06ab 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -281,6 +281,12 @@ func init() { m.Cmd("", mdb.CREATE, ice.SHY, kit.Select(kit.Select("https://shylinux.com", ice.Info.Make.Remote), conf[cli.CTX_SHY])) }}, mdb.CREATE: {Name: "create name address", Hand: func(m *ice.Message, arg ...string) { _spide_create(m, m.Option(mdb.NAME), m.Option(ADDRESS)) }}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && arg[1] == "" { + m.PushSearch(mdb.TYPE, LINK, mdb.NAME, ice.DEV, mdb.TEXT, mdb.HashSelectField(m, ice.COM, CLIENT_ORIGIN)) + m.PushSearch(mdb.TYPE, LINK, mdb.NAME, ice.SHY, mdb.TEXT, mdb.HashSelectField(m, ice.SHY, CLIENT_ORIGIN)) + } + }}, tcp.CLIENT: {Hand: func(m *ice.Message, arg ...string) { msg := m.Cmd("", kit.Select(ice.DEV, arg, 0)) ls := kit.Split(msg.Append(kit.Keys(SPIDE_CLIENT, tcp.HOST)), ice.DF) diff --git a/core/chat/favor.go b/core/chat/favor.go index 8c3147f3..5d4d4f15 100644 --- a/core/chat/favor.go +++ b/core/chat/favor.go @@ -86,11 +86,7 @@ func init() { ctx.ProcessField(m, ls[0], ls[1:], arg...) }}, "vimer": {Help: "源码", Hand: func(m *ice.Message, arg ...string) { - args := []string{} - if len(arg) == 0 || arg[0] != ice.RUN { - args = nfs.SplitPath(m, m.Option(mdb.TEXT)) - } - ctx.ProcessField(m, web.CODE_VIMER, args, arg...) + ctx.ProcessField(m, web.CODE_VIMER, []string{m.Option(mdb.TEXT)}, arg...) }}, "xterm": {Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.ProcessField(m, web.CODE_XTERM, []string{m.Option(mdb.TEXT)}, arg...) diff --git a/core/code/c.go b/core/code/c.go index cee4688f..879f86f1 100644 --- a/core/code/c.go +++ b/core/code/c.go @@ -13,7 +13,7 @@ import ( func _c_show(m *ice.Message, arg ...string) { target := path.Join(ice.BIN, kit.TrimExt(arg[1], arg[0])) if msg := m.Cmd(cli.SYSTEM, "gcc", "-o", target, path.Join(arg[2], arg[1])); cli.IsSuccess(msg) { - _xterm_show(m, nfs.SH, target, path.Join(arg[2], arg[1])) + ProcessXterm(m, nfs.SH, target, path.Join(arg[2], arg[1])) } else { _vimer_make(m, arg[2], msg) } diff --git a/core/code/go.go b/core/code/go.go index 7f4d526d..3e726601 100644 --- a/core/code/go.go +++ b/core/code/go.go @@ -109,7 +109,7 @@ func init() { } else { text = "cli.system go run " + path.Join(arg[2], arg[1]) } - _xterm_show(m, cmds, text) + ProcessXterm(m, cmds, text) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { if cmd := ctx.GetFileCmd(path.Join(arg[2], arg[1])); cmd != "" { diff --git a/core/code/js.go b/core/code/js.go index e3106394..cd2e7887 100644 --- a/core/code/js.go +++ b/core/code/js.go @@ -18,7 +18,7 @@ func init() { JS: {Name: "js path auto", Help: "前端", Actions: ice.MergeActions(ice.Actions{ mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { cmds, text := "node", kit.Format(`require("./usr/volcanos/proto.js"), require("./usr/volcanos/publish/client/nodejs/proto.js"), Volcanos.meta._main("%s")`, path.Join(ice.PS, arg[2], arg[1])) - _xterm_show(m, cmds, text) + ProcessXterm(m, cmds, text) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { if arg[2] == ice.USR_VOLCANOS { diff --git a/core/code/py.go b/core/code/py.go index 98e0b928..5ef3fcf6 100644 --- a/core/code/py.go +++ b/core/code/py.go @@ -31,7 +31,7 @@ func init() { }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { cmds, text := "python -i "+path.Join(arg[2], arg[1]), "" - _xterm_show(m, cmds, text) + ProcessXterm(m, cmds, text) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _py_exec(m, path.Join(arg[2], arg[1])) diff --git a/core/code/sh.go b/core/code/sh.go index 94f4bf2f..88cf5788 100644 --- a/core/code/sh.go +++ b/core/code/sh.go @@ -30,9 +30,16 @@ const SH = nfs.SH func init() { Index.MergeCommands(ice.Commands{ SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeActions(ice.Actions{ + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == mdb.FOREACH && (arg[1] == "" || arg[1] == ssh.SHELL) { + m.Cmd(nfs.CAT, "/etc/shells", func(text string) { + kit.If(text != "" && !strings.HasPrefix(text, "#"), func() { m.PushSearch(mdb.TYPE, ssh.SHELL, mdb.NAME, path.Base(text), mdb.TEXT, path.Base(text)) }) + }) + } + }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { cmds, text := _sh_cmds(m, path.Join(arg[2], arg[1])) - _xterm_show(m, cmds, text, path.Join(arg[2], arg[1])) + ProcessXterm(m, cmds, text, path.Join(arg[2], arg[1])) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { cmds, text := _sh_cmds(m, path.Join(arg[2], arg[1])) diff --git a/core/code/vimer.go b/core/code/vimer.go index 54c05b4a..f7126e11 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -56,8 +56,11 @@ func init() { VIMER: {Name: "vimer path=src/@key file=main.go line=1 list", Help: "编辑器", Meta: kit.Dict(ctx.STYLE, INNER), Actions: ice.MergeActions(ice.Actions{ mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { if arg[0] == mdb.FOREACH && arg[1] == "" { - m.PushSearch(mdb.TYPE, web.LINK, mdb.TEXT, kit.MergeURL(m.Option(ice.MSG_USERHOST)+ice.PS, log.DEBUG, ice.TRUE)) - m.PushSearch(mdb.TYPE, web.LINK, mdb.TEXT, web.MergePodCmds(m, "", web.CODE_VIMER, log.DEBUG, ice.TRUE)) + m.PushSearch(mdb.TYPE, nfs.FILE, mdb.NAME, "main", mdb.TEXT, ice.SRC_MAIN_GO) + m.PushSearch(mdb.TYPE, nfs.FILE, mdb.NAME, "main", mdb.TEXT, ice.SRC_MAIN_SH) + m.PushSearch(mdb.TYPE, nfs.FILE, mdb.NAME, "main", mdb.TEXT, ice.SRC_MAIN_JS) + m.PushSearch(mdb.TYPE, web.LINK, mdb.NAME, "admin", mdb.TEXT, kit.MergeURL(m.Option(ice.MSG_USERHOST)+ice.PS, log.DEBUG, ice.TRUE)) + m.PushSearch(mdb.TYPE, web.LINK, mdb.NAME, VIMER, mdb.TEXT, web.MergePodCmds(m, "", web.CODE_VIMER, log.DEBUG, ice.TRUE)) } }}, mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { @@ -218,7 +221,8 @@ func init() { 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) { - kit.If(arg[1] == m.CommandKey(), func() { web.ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey()) }) + // kit.If(arg[1] == m.CommandKey(), func() { web.ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey()) }) + kit.If(arg[1] == m.CommandKey(), func() { ctx.ProcessField(m, m.PrefixKey(), []string{}, arg...) }) }}, }, web.DreamAction(), mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path"), aaa.RoleAction(ctx.COMMAND)), Hand: func(m *ice.Message, arg ...string) { if m.Cmdy(INNER, arg); arg[0] != ctx.ACTION { diff --git a/core/code/xterm.go b/core/code/xterm.go index 591f0910..88c02984 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -37,16 +37,15 @@ func (s _xterm) Close() error { return s.Cmd.Process.Kill() } func _xterm_get(m *ice.Message, h string) _xterm { - if h = kit.Select(m.Option(mdb.HASH), h); m.Assert(h != "") { - if mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE) == "" { - mdb.HashCreate(m, mdb.HASH, h, m.OptionSimple("type,name,text")) - } - mdb.HashModify(m, web.VIEW, m.Option(ice.MSG_DAEMON)) + if h = kit.Select(m.Option(mdb.HASH), h); m.Assert(h != "") && mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE) == "" { + mdb.HashCreate(m, m.OptionSimple(mdb.HashField(m))) } - t := mdb.HashSelectField(m, m.Option(mdb.HASH, h), mdb.TYPE) - return mdb.HashSelectTarget(m, h, func() ice.Any { - ls := kit.Split(kit.Select(nfs.SH, strings.Split(t, " # ")[0])) + mdb.HashModify(m, mdb.TIME, m.Time(), web.VIEW, m.Option(ice.MSG_DAEMON)) + return mdb.HashSelectTarget(m, h, func(value ice.Maps) ice.Any { + text := strings.Split(value[mdb.TEXT], ice.NL) + ls := kit.Split(kit.Select(nfs.SH, strings.Split(value[mdb.TYPE], " # ")[0])) cmd := exec.Command(cli.SystemFind(m, ls[0]), ls[1:]...) + cmd.Dir = nfs.MkdirAll(m, kit.Path(value[nfs.PATH])) cmd.Env = append(cmd.Env, os.Environ()...) cmd.Env = append(cmd.Env, "TERM=xterm") tty, err := pty.Start(cmd) @@ -54,24 +53,28 @@ func _xterm_get(m *ice.Message, h string) _xterm { m.Go(func() { defer tty.Close() defer mdb.HashRemove(m, mdb.HASH, h) + m.Log(cli.START, strings.Join(cmd.Args, ice.SP)) m.Option(ice.LOG_DISABLE, ice.TRUE) buf := make([]byte, ice.MOD_BUFS) for { if n, e := tty.Read(buf); !m.Warn(e) && e == nil { - _xterm_echo(m, h, string(buf[:n])) + if _xterm_echo(m, h, string(buf[:n])); len(text) > 0 { + if text[0] != "" { + tty.Write([]byte(text[0] + ice.NL)) + } + text = text[1:] + } } else { _xterm_echo(m, h, "~~~end~~~") break } } }) - m.Go(func() { _xterm_cmds(m.Sleep("1s"), h, mdb.HashSelectField(m, h, mdb.TEXT)) }) return _xterm{cmd, tty} }).(_xterm) } func _xterm_echo(m *ice.Message, h string, str string) { m.Options(ice.MSG_DAEMON, mdb.HashSelectField(m, h, web.VIEW)) - mdb.HashModify(m, mdb.HASH, h, mdb.TIME, m.Time()) web.PushNoticeGrow(m, h, str) } func _xterm_cmds(m *ice.Message, h string, cmd string, arg ...ice.Any) { @@ -95,16 +98,22 @@ func init() { m.Push(arg[0], BASH, SH) case mdb.NAME: m.Push(arg[0], path.Base(m.Option(mdb.TYPE)), ice.Info.Hostname) + case nfs.PATH: + m.Cmdy(nfs.DIR, ice.USR_LOCAL_WORK, nfs.PATH) + m.Cmdy(nfs.DIR, ice.USR_LOCAL_REPOS, nfs.PATH) + m.Cmdy(nfs.DIR, ice.USR_LOCAL_DAEMON, nfs.PATH) } }}, - mdb.CREATE: {Name: "create type*=sh name text theme:textarea", Hand: func(m *ice.Message, arg ...string) { mdb.HashCreate(m) }}, + web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) { + m.Cmd("", mdb.CREATE, mdb.TYPE, BASH, m.OptionSimple(mdb.NAME), nfs.PATH, path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME))) + }}, + mdb.CREATE: {Name: "create type*=sh name text path theme:textarea", Hand: func(m *ice.Message, arg ...string) { mdb.HashCreate(m) }}, web.RESIZE: {Hand: func(m *ice.Message, arg ...string) { _xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80")) }}, web.INPUT: {Hand: func(m *ice.Message, arg ...string) { if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); !m.Warn(e) { _xterm_get(m, "").Write(string(b)) - mdb.HashModify(m, mdb.TIME, m.Time()) } }}, INSTALL: {Hand: func(m *ice.Message, arg ...string) { @@ -113,28 +122,33 @@ func init() { log.DEBUG: {Hand: func(m *ice.Message, arg ...string) { _xterm_cmds(m, kit.Select("", arg, 0), "cd ~/contexts; tail -f var/log/bench.log") }}, - web.OUTPUT: {Hand: func(m *ice.Message, arg ...string) { + web.OUTPUT: {Help: "全屏", Hand: func(m *ice.Message, arg ...string) { web.ProcessWebsite(m, "", "", m.OptionSimple(mdb.HASH), ctx.STYLE, web.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) { + kit.If(arg[1] == m.CommandKey(), func() { ctx.ProcessField(m, m.PrefixKey(), []string{}, arg...) }) + }}, ctx.PROCESS: {Hand: func(m *ice.Message, arg ...string) { ctx.ProcessField(m, m.PrefixKey(), func() string { return m.Cmdx("", mdb.CREATE, arg) }, arg...) }}, - }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,view,theme", mdb.TOOLS, FAVOR), ctx.ProcessAction()), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,path,view,theme"), web.DreamAction(), ctx.ProcessAction(), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { if mdb.HashSelect(m, arg...); len(arg) == 0 { m.PushAction(web.OUTPUT, mdb.REMOVE).Action(mdb.CREATE, mdb.PRUNES) } else { if m.Length() == 0 { - arg[0] = m.Cmdx("", mdb.CREATE, mdb.TYPE, arg[0]) - mdb.HashSelect(m, arg[0]).Push(mdb.HASH, arg[0]) + arg[0] = m.Cmdx("", mdb.CREATE, arg) + mdb.HashSelect(m, arg[0]) } m.Push(mdb.HASH, arg[0]) - // m.Action(INSTALL, log.DEBUG) ctx.DisplayLocal(m, "") } }}, }) } -func _xterm_show(m *ice.Message, cmds, text string, arg ...string) { +func ProcessXterm(m *ice.Message, cmds, text string, arg ...string) { m.Cmdy(ctx.COMMAND, XTERM).Push(ctx.ARGS, kit.Format([]string{m.Cmdx(XTERM, mdb.CREATE, mdb.TYPE, cmds, mdb.NAME, kit.Select("", arg, 0), mdb.TEXT, text)})).ProcessField(XTERM) } diff --git a/meta.go b/meta.go index e80f0681..dbf4036f 100644 --- a/meta.go +++ b/meta.go @@ -160,6 +160,11 @@ func (m *Message) Push(key string, value Any, arg ...Any) *Message { m.Add(MSG_APPEND, KEY, key) m.Add(MSG_APPEND, VALUE, kit.Format(value)) } else { + if m.ActionKey() == "inputs" { + if kit.IndexOf(m.meta[key], v) > -1 { + continue + } + } m.Add(MSG_APPEND, key, v) } } diff --git a/misc/git/status.go b/misc/git/status.go index 8a7c04d3..c8596322 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -279,13 +279,12 @@ func init() { _git_cmd(m, "config", "--global", "url."+m.Option(nfs.TO)+".insteadof", m.Option(nfs.FROM)) } }}, - "token": {Name: "token token", Help: "切换", Hand: func(m *ice.Message, arg ...string) { + "token": {Name: "token token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) { list := []string{m.Option(TOKEN)} m.Cmd(nfs.CAT, kit.HomePath(".git-credentials"), func(line string) { list = append(list, line) }) m.Cmd(nfs.SAVE, kit.HomePath(".git-credentials"), strings.Join(list, ice.NL)+ice.NL) ctx.ProcessHold(m) }}, - "branch_switch": {Help: "切换", Hand: func(m *ice.Message, arg ...string) { _repos_cmd(m, m.Option(REPOS), "checkout", m.Option(BRANCH)) }},