diff --git a/base/cli/procinfo.go b/base/cli/procinfo.go index 9b52df9e..19fd4787 100644 --- a/base/cli/procinfo.go +++ b/base/cli/procinfo.go @@ -12,7 +12,7 @@ import ( func init() { Index.MergeCommands(ice.Commands{ - PROCINFO: {Name: "procinfo PID auto filter:text docker monitor terminal", Help: "进程列表", Actions: ice.MergeActions(ice.Actions{ + PROCINFO: {Name: "procinfo PID auto filter:text monitor docker", Help: "进程列表", Actions: ice.MergeActions(ice.Actions{ PROCKILL: {Help: "结束进程", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(gdb.SIGNAL, gdb.STOP, m.Option("PID")).ProcessRefresh() }}, "terminal": {Help: "终端", Hand: func(m *ice.Message, arg ...string) { Opens(m, "Terminal.app") }}, "monitor": {Help: "监控", Hand: func(m *ice.Message, arg ...string) { Opens(m, "Activity Monitor.app") }}, diff --git a/base/web/dream.go b/base/web/dream.go index 5fef38e9..dcf503e6 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -43,7 +43,7 @@ func _dream_list(m *ice.Message) *ice.Message { stats[ice.INIT]++ } }) - return m.Sort("status,type,name", ice.STR, ice.STR, ice.STR_R).StatusTimeCount(stats) + return m.Sort("status,type,name", ice.STR, ice.STR, ice.STR).StatusTimeCount(stats) } func _dream_start(m *ice.Message, name string) { if m.Warn(name == "", ice.ErrNotValid, mdb.NAME) { diff --git a/base/web/space.go b/base/web/space.go index 3d0f47d2..8a1c3426 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -26,7 +26,8 @@ func _space_qrcode(m *ice.Message, dev string) { ssh.PrintQRCode(m, m.Cmdv(SPACE, dev, cli.PWD, mdb.LINK)) } func _space_dial(m *ice.Message, dev, name string, arg ...string) { - u := kit.ParseURL(kit.MergeURL2(strings.Replace(m.Cmdv(SPIDE, dev, CLIENT_ORIGIN), HTTP, "ws", 1), PP(SPACE), mdb.TYPE, ice.Info.NodeType, mdb.NAME, name, arg)) + u := kit.ParseURL(kit.MergeURL2(strings.Replace(m.Cmdv(SPIDE, dev, CLIENT_ORIGIN), HTTP, "ws", 1), PP(SPACE), mdb.TYPE, ice.Info.NodeType, mdb.NAME, name, + nfs.MODULE, ice.Info.Make.Module, nfs.VERSION, ice.Info.Make.Versions(), arg)) args := kit.SimpleKV("type,name,host,port", u.Scheme, dev, u.Hostname(), u.Port()) gdb.Go(m, func() { once := sync.Once{} @@ -54,7 +55,7 @@ func _space_fork(m *ice.Message) { name = kit.ReplaceAll(addr, "[", "_", "]", "_", nfs.DF, "_", nfs.PT, "_") text = kit.Select(addr, m.Option(mdb.NAME), m.Option(mdb.TEXT)) } - args := kit.Simple(mdb.TYPE, kit.Select(WORKER, m.Option(mdb.TYPE)), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(cli.DAEMON, ice.MSG_USERUA)) + args := kit.Simple(mdb.TYPE, kit.Select(WORKER, m.Option(mdb.TYPE)), mdb.NAME, name, mdb.TEXT, text, m.OptionSimple(cli.DAEMON, ice.MSG_USERUA), m.OptionSimple(nfs.MODULE, nfs.VERSION)) if c, e := websocket.Upgrade(m.W, m.R); !m.Warn(e) { gdb.Go(m, func() { defer mdb.HashCreateDeferRemove(m, args, kit.Dict(mdb.TARGET, c))() @@ -212,13 +213,16 @@ func init() { } }}, nfs.PS: {Hand: func(m *ice.Message, arg ...string) { _space_fork(m) }}, - }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text", ctx.ACTION, OPEN, REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000)), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text,module,version", ctx.ACTION, OPEN, REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000)), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 { + defer m.StatusTimeCount() mdb.HashSelect(m.Spawn(), arg...).Sort("").Table(func(index int, value ice.Maps, field []string) { if kit.IsIn(value[mdb.TYPE], CHROME, "send") { return } - m.Push("", value, kit.Split("time,type,name,text,status")) + if m.Push("", value, kit.Split(mdb.Config(m, mdb.FIELD))); len(arg) > 0 && arg[0] != "" { + m.Push(mdb.STATUS, value[mdb.STATUS]) + } if kit.IsIn(value[mdb.TYPE], SERVER, WORKER) { m.Push(mdb.LINK, tcp.PublishLocalhost(m, m.MergePod(value[mdb.NAME]))) } else { @@ -226,7 +230,7 @@ func init() { } m.PushButton(kit.Select(OPEN, LOGIN, value[mdb.TYPE] == LOGIN), mdb.REMOVE) }) - kit.If(!m.IsCliUA(), func() { m.Cmdy("web.code.publish", "contexts", "misc") }) + kit.If(!m.IsCliUA(), func() { m.Cmdy("web.code.publish", "contexts", ice.APP) }) kit.If(len(arg) == 1, func() { m.EchoIFrame(m.MergePod(arg[0])) }) } else { _space_send(m, arg[0], kit.Simple(kit.Split(arg[1]), arg[2:])...) diff --git a/conf.go b/conf.go index 7015a6ab..7600d5cb 100644 --- a/conf.go +++ b/conf.go @@ -36,6 +36,7 @@ const ( SHY = "shy" COM = "com" DEV = "dev" + APP = "app" OPS = "ops" ICE = "ice" CAN = "can" diff --git a/core/chat/iframe.go b/core/chat/iframe.go index 20837d4e..709e2acd 100644 --- a/core/chat/iframe.go +++ b/core/chat/iframe.go @@ -2,6 +2,7 @@ package chat import ( ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/web" @@ -12,7 +13,7 @@ const IFRAME = "iframe" func init() { Index.MergeCommands(ice.Commands{ - IFRAME: {Name: "iframe hash auto", Help: "浏览器", Actions: ice.MergeActions(ice.Actions{ + IFRAME: {Name: "iframe hash auto safari", Help: "浏览器", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { if m.Cmd("").Length() == 0 { m.Cmd(web.SPIDE, ice.OptionFields(web.CLIENT_NAME, web.CLIENT_ORIGIN), func(value ice.Maps) { @@ -32,6 +33,7 @@ func init() { case mdb.LINK: m.Push(arg[0], m.Option(ice.MSG_USERWEB)) m.Push(arg[0], "http://localhost:20000") + m.Push(arg[0], "http://localhost:20001") m.Copy(m.Cmd(web.SPIDE).CutTo(web.CLIENT_URL, arg[0])) } }}, @@ -70,6 +72,13 @@ func init() { web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) { m.Cmd("", mdb.CREATE, kit.Dict(web.LINK, m.MergePod(m.Option(mdb.NAME)))) }}, + "safari": {Help: "本机", Hand: func(m *ice.Message, arg ...string) { + if h := kit.Select(m.Option(mdb.HASH), arg, 0); h == "" { + cli.Opens(m, "Safari.app") + } else { + cli.Opens(m, m.Cmd("", h).Append(mdb.LINK)) + } + }}, }, mdb.HashAction(mdb.SHORT, web.LINK, mdb.FIELD, "time,hash,type,name,link"), FavorAction()), Hand: func(m *ice.Message, arg ...string) { list := []string{m.MergePodCmd("", "web.wiki.portal")} if m.Option(ice.MSG_USERPOD) == "" { diff --git a/core/chat/macos/desktop.css b/core/chat/macos/desktop.css index b4788b96..72bca86a 100644 --- a/core/chat/macos/desktop.css +++ b/core/chat/macos/desktop.css @@ -33,12 +33,12 @@ fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.item:last fieldset.macos.desktop>div.output>div.desktop>fieldset>form.option>div.item:last-child { margin-right:80px; } fieldset.macos.desktop>div.output>div.desktop>fieldset>div.action>* { margin:10px 0px 10px 10px; } fieldset.macos.desktop>div.output>div.desktop>fieldset>div.action>div.item.icons>span.icon { margin-top:10px; } -fieldset.macos.desktop>div.output>div.desktop>fieldset>div.action>div.item:last-child { margin-right:80px; } +fieldset.macos.desktop>div.output>div.desktop>fieldset>div.action>div.item:last-child { margin-right:120px; } fieldset.macos.desktop>div.output>div.desktop>fieldset.web.wiki.feel>div.status { display:none; } fieldset.macos.desktop>div.output>div.desktop>fieldset.web.code.vimer>div.status { display:none; } fieldset.macos.desktop>div.output>div.desktop>fieldset.web.code.xterm>div.status { display:none; } fieldset.web.code.xterm>div.action>div.tabs:only-child { display:none; } -fieldset.macos.desktop>div.output>div.desktop>fieldset.web.code.compile>form.option>div.item:last-child { margin-right:80px; } +fieldset.macos.desktop>div.output>div.desktop>fieldset.web.code.compile>form.option>div.item:last-child { margin-right:120px; } fieldset.macos.desktop>div.output>div.desktop>fieldset.web.chat.iframe>div.status { display:none; } fieldset.macos.desktop>div.output>div.desktop>fieldset.web.chat.iframe>form.option>div.item.hash>input { width:360px; } fieldset.macos.desktop>div.output>div.desktop>fieldset.web.chat.macos.finder>div.status { display:none; } diff --git a/core/code/pprof.go b/core/code/pprof.go index a2d0b03e..db062216 100644 --- a/core/code/pprof.go +++ b/core/code/pprof.go @@ -57,8 +57,8 @@ func init() { }}, }, 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) { if mdb.ZoneSelect(m, arg...); len(arg) == 0 { - m.PushAction(cli.START, mdb.REMOVE).Action(mdb.CREATE) 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) }) } diff --git a/core/code/xterm.go b/core/code/xterm.go index 3d6c94d0..54fe28a3 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -125,7 +125,20 @@ func init() { ctx.PROCESS: {Hand: func(m *ice.Message, arg ...string) { ctx.ProcessField(m, m.PrefixKey(), func() string { return m.Cmdx("", mdb.CREATE, arg) }, arg...) }}, - "terminal": {Help: "本机", Hand: func(m *ice.Message, arg ...string) { m.Cmd("cli.system", "opens", "Terminal.app") }}, + "terminal": {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) + m.Cmd(cli.SYSTEM, "osascript", "-e", kit.Format(` +tell application "Terminal" + do script "%s" + activate +end tell +`, msg.Append(mdb.TYPE))) + } + m.ProcessHold() + }}, }, ctx.CmdAction(), ctx.ProcessAction(), mdb.ImportantHashAction(mdb.FIELD, "time,hash,type,name,text,path,theme,daemon")), Hand: func(m *ice.Message, arg ...string) { if mdb.HashSelect(m, arg...); len(arg) == 0 { if m.Length() == 0 { diff --git a/info.go b/info.go index 38bdec85..8a715315 100644 --- a/info.go +++ b/info.go @@ -32,6 +32,19 @@ type MakeInfo struct { System string } +func (s MakeInfo) Versions() string { + if s.Hash == "" { + return "" + } + if s.Version == "" { + return s.Hash[:6] + } + if kit.IsIn(s.Forword, "", "0") { + return s.Version + } + return kit.Format("%s-%s-%s", s.Version, s.Forword, s.Hash[:6]) +} + var Info = struct { Make MakeInfo diff --git a/misc/git/repos.go b/misc/git/repos.go index 2e424ea3..927e7d35 100644 --- a/misc/git/repos.go +++ b/misc/git/repos.go @@ -261,7 +261,7 @@ func _repos_status(m *ice.Message, p string, repos *git.Repository) error { } } } - m.Push(REPOS, p).Push(STATUS, "??").Push(nfs.FILE, value[nfs.PATH]).PushButton(ADD) + m.Push(REPOS, p).Push(STATUS, "??").Push(nfs.FILE, value[nfs.PATH]).PushButton(ADD, nfs.TRASH) }) } return nil @@ -529,7 +529,6 @@ func init() { if commit, err := repos.CommitObject(refer.Hash()); err == nil { _last := commit.Author.When.Format(ice.MOD_TIME) kit.If(_last > last, func() { last = _last }) - } } if _remote, err := repos.Remote(ORIGIN); err == nil && (remote == "" || remote == path.Base(kit.Path(""))) { @@ -638,9 +637,7 @@ func init() { code.INNER: {Hand: func(m *ice.Message, arg ...string) { _repos_inner(m, _repos_path, arg...) }}, }, aaa.RoleAction(REMOTE), mdb.ClearOnExitHashAction(), mdb.HashAction(mdb.SHORT, REPOS, mdb.FIELD, "time,repos,branch,version,comment,origin")), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { - mdb.HashSelect(m, arg...).Sort(REPOS).Action(CLONE, PULL, PUSH, STATUS) - m.PushAction(STATUS, mdb.REMOVE) - m.Echo(strings.ReplaceAll(m.Cmdx(code.PUBLISH, ice.CONTEXTS), "app username", "dev username")) + mdb.HashSelect(m, arg...).Sort(REPOS).PushAction(STATUS, mdb.REMOVE).Action(CLONE, PULL, PUSH, STATUS) } else if len(arg) == 1 { _repos_branch(m, _repos_open(m, arg[0])) } else if len(arg) == 2 { diff --git a/misc/git/service.go b/misc/git/service.go index baf76237..0ca42725 100644 --- a/misc/git/service.go +++ b/misc/git/service.go @@ -196,11 +196,9 @@ func init() { }, gdb.EventsAction(web.DREAM_INPUTS), mdb.HashAction(mdb.SHORT, REPOS, mdb.FIELD, "time,repos,branch,version,comment"), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { mdb.HashSelect(m, arg...).Table(func(value ice.Maps) { - m.PushScript(kit.Format("git clone %s", tcp.PublishLocalhost(m, kit.Split(web.MergeURL2(m, "/x/"+value[REPOS]+".git"), mdb.QS)[0]))) - }).Sort(REPOS).Echo(strings.ReplaceAll(m.Cmdx("web.code.publish", ice.CONTEXTS, "dev"), "app username", "dev username")) - m.Table(func(value ice.Maps) { m.Push(nfs.SIZE, kit.Split(m.Cmdx(cli.SYSTEM, "du", "-sh", path.Join(ice.USR_LOCAL_REPOS, value[REPOS])))[0]) - }) + m.PushScript(kit.Format("git clone %s", tcp.PublishLocalhost(m, kit.Split(web.MergeURL2(m, "/x/"+value[REPOS]+".git"), mdb.QS)[0]))) + }).Sort(REPOS).Cmdy("web.code.publish", ice.CONTEXTS, "dev") } else if len(arg) == 1 { _repos_branch(m, _repos_open(m, arg[0])) m.EchoScript(tcp.PublishLocalhost(m, kit.Split(web.MergeURL2(m, "/x/"+arg[0]), mdb.QS)[0])) diff --git a/misc/git/status.go b/misc/git/status.go index 288914f4..a9bdcc32 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -14,6 +14,7 @@ import ( "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/web" + "shylinux.com/x/icebergs/core/code" kit "shylinux.com/x/toolkits" ) @@ -166,6 +167,7 @@ func init() { } else if len(arg) == 0 { kit.If(config != nil, func() { m.Option(aaa.EMAIL, kit.Select(mdb.Config(m, aaa.EMAIL), config.User.Email)) }) m.Cmdy(REPOS, STATUS).Action(PULL, PUSH, INSTEADOF, "oauth", CONFIGS, cli.RESTART) + m.Cmdy(code.PUBLISH, ice.CONTEXTS, "dev") } else { m.Cmdy(REPOS, arg[0], MASTER, INDEX, m.Cmdv(REPOS, arg[0], MASTER, INDEX, nfs.FILE)) }