1
0
forked from x/icebergs

opt git.status

This commit is contained in:
shaoying 2021-05-02 13:04:10 +08:00
parent ef6ac8100e
commit 63bcfea410
9 changed files with 186 additions and 136 deletions

View File

@ -1,6 +1,12 @@
package web package web
import ( import (
"math/rand"
"net"
"net/url"
"strings"
"time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
@ -8,12 +14,6 @@ import (
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/tcp"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"math/rand"
"net"
"net/url"
"strings"
"time"
) )
func _space_list(m *ice.Message, space string) { func _space_list(m *ice.Message, space string) {
@ -188,11 +188,13 @@ func _space_search(m *ice.Message, kind, name, text string, arg ...string) {
} }
}) })
if name == "" {
port := m.Cmd(SERVE, ice.Option{mdb.FIELDS, tcp.PORT}).Append(tcp.PORT) port := m.Cmd(SERVE, ice.Option{mdb.FIELDS, tcp.PORT}).Append(tcp.PORT)
m.Cmd(tcp.HOST).Table(func(index int, value map[string]string, head []string) { m.Cmd(tcp.HOST).Table(func(index int, value map[string]string, head []string) {
m.PushSearch(kit.SSH_CMD, SPACE, kit.MDB_TYPE, MYSELF, kit.MDB_NAME, value[kit.MDB_NAME], m.PushSearch(kit.SSH_CMD, SPACE, kit.MDB_TYPE, MYSELF, kit.MDB_NAME, value[kit.MDB_NAME],
kit.MDB_TEXT, kit.Format("http://%s:%s", value[tcp.IP], port), kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value)) kit.MDB_TEXT, kit.Format("http://%s:%s", value[tcp.IP], port), kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value))
}) })
}
} }
const ( const (
@ -263,7 +265,7 @@ func init() {
switch kind { switch kind {
case CHROME: case CHROME:
if m.Option(ice.MSG_USERNAME) != "" { if m.Option(ice.MSG_USERNAME) != "" {
break // break
} }
m.Go(func(msg *ice.Message) { m.Go(func(msg *ice.Message) {

View File

@ -51,6 +51,8 @@ const ( // MSG
MSG_SOURCE = "_source" MSG_SOURCE = "_source"
MSG_TARGET = "_target" MSG_TARGET = "_target"
MSG_HANDLE = "_handle" MSG_HANDLE = "_handle"
MSG_ACTION = "_action"
MSG_DAEMON = "_daemon"
MSG_UPLOAD = "_upload" MSG_UPLOAD = "_upload"
MSG_OUTPUT = "_output" MSG_OUTPUT = "_output"
MSG_ARGS = "_args" MSG_ARGS = "_args"
@ -100,6 +102,9 @@ const ( // PROCESS
PROCESS_FIELD = "_field" PROCESS_FIELD = "_field"
PROCESS_OPEN = "_open" PROCESS_OPEN = "_open"
PROCESS_HOLD = "_hold"
PROCESS_BACK = "_back"
FIELD_PREFIX = "_prefix" FIELD_PREFIX = "_prefix"
CONTROL_PAGE = "_page" CONTROL_PAGE = "_page"
) )

View File

@ -7,6 +7,7 @@ import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
@ -58,6 +59,7 @@ func _action_share(m *ice.Message, cmd string, arg ...string) {
case web.FIELD: case web.FIELD:
if cmd := kit.Keys(msg.Append(web.RIVER), msg.Append(web.STORM)); len(arg) == 2 { if cmd := kit.Keys(msg.Append(web.RIVER), msg.Append(web.STORM)); len(arg) == 2 {
m.Push("index", cmd) m.Push("index", cmd)
m.Push("title", msg.Append(kit.MDB_NAME))
m.Push("args", msg.Append(kit.MDB_TEXT)) m.Push("args", msg.Append(kit.MDB_TEXT))
} else { } else {
if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) { if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) {
@ -133,6 +135,10 @@ func init() {
m.Cmdy(ctx.COMMAND, strings.TrimPrefix(k, ".")) m.Cmdy(ctx.COMMAND, strings.TrimPrefix(k, "."))
} }
}}, }},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), TOOL, kit.MDB_HASH, m.Option(STORM)), mdb.LIST,
kit.MDB_ID, m.Option(kit.MDB_ID), arg)
}},
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...) _header_share(m, arg...)
}}, }},

View File

@ -22,8 +22,11 @@ func _river_list(m *ice.Message) {
m.Option(ice.MSG_RIVER, msg.Append(RIVER)) m.Option(ice.MSG_RIVER, msg.Append(RIVER))
m.Option(ice.MSG_STORM, msg.Append(STORM)) m.Option(ice.MSG_STORM, msg.Append(STORM))
if m.Conf(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER))) == "" {
break
}
if msg.Cmd(m.Prefix(USER), m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" { if msg.Cmd(m.Prefix(USER), m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" {
// msg.Cmd(m.Prefix(USER), mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) msg.Cmd(m.Prefix(USER), mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
// 加入群组 // 加入群组
} }
case web.FIELD: // 应用入口 case web.FIELD: // 应用入口

8
go.sum
View File

@ -1,18 +1,26 @@
github.com/AaronO/go-git-http v0.0.0-20161214145340-1d9485b3a98f/go.mod h1:+6Yuq73F9068Na+mSBNXCvyuxvgw4f/g5ii40e3U8Sc= github.com/AaronO/go-git-http v0.0.0-20161214145340-1d9485b3a98f/go.mod h1:+6Yuq73F9068Na+mSBNXCvyuxvgw4f/g5ii40e3U8Sc=
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk= github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/shylinux/toolkits v0.2.3 h1:UdE5dUKtc+iVeco9sFrlj98BxVJADYoLNeywTnLrSMc= github.com/shylinux/toolkits v0.2.3 h1:UdE5dUKtc+iVeco9sFrlj98BxVJADYoLNeywTnLrSMc=
github.com/shylinux/toolkits v0.2.3/go.mod h1:oMwi/N00I2cXenmcAkqikEncTzB4u5JhTQ9mO5xj7sY= github.com/shylinux/toolkits v0.2.3/go.mod h1:oMwi/N00I2cXenmcAkqikEncTzB4u5JhTQ9mO5xj7sY=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

37
misc.go
View File

@ -237,10 +237,6 @@ func (m *Message) SortStrR(key string) { m.Sort(key, "str_r") }
func (m *Message) SortTime(key string) { m.Sort(key, "time") } func (m *Message) SortTime(key string) { m.Sort(key, "time") }
func (m *Message) SortTimeR(key string) { m.Sort(key, "time_r") } func (m *Message) SortTimeR(key string) { m.Sort(key, "time_r") }
func (m *Message) Process(action string, arg ...interface{}) {
m.Option(MSG_PROCESS, action)
m.Option("_arg", arg...)
}
func (m *Message) FormatMeta() string { return m.Format("meta") } func (m *Message) FormatMeta() string { return m.Format("meta") }
func (m *Message) RenameAppend(from, to string) { func (m *Message) RenameAppend(from, to string) {
for i, v := range m.meta[MSG_APPEND] { for i, v := range m.meta[MSG_APPEND] {
@ -252,10 +248,6 @@ func (m *Message) RenameAppend(from, to string) {
} }
} }
func (m *Message) Fields(condition bool, fields string) string {
return m.Option("fields", kit.Select(kit.Select("detail", fields, condition), m.Option("fields")))
}
type Option struct { type Option struct {
Name string Name string
Value interface{} Value interface{}
@ -263,3 +255,32 @@ type Option struct {
func OptionFields(str string) Option { return Option{"fields", str} } func OptionFields(str string) Option { return Option{"fields", str} }
func OptionHash(str string) Option { return Option{kit.MDB_HASH, str} } func OptionHash(str string) Option { return Option{kit.MDB_HASH, str} }
func (m *Message) Toast(content string, arg ...interface{}) {
m.Cmd("web.space", m.Option("_daemon"), "toast", "", content, arg)
}
func (m *Message) GoToast(title string, cb func(func(string, int, int))) {
m.Go(func() {
cb(func(name string, count, total int) {
m.Toast(
kit.Format("%s %d/%d", name, count, total),
kit.Format("%s %d%%", title, count*100/total),
kit.Select("1000", "10000", count < total),
count*100/total,
)
})
})
}
func (m *Message) Fields(condition bool, fields string) string {
return m.Option("fields", kit.Select(kit.Select("detail", fields, condition), m.Option("fields")))
}
func (m *Message) Action(arg ...string) {
m.Option(MSG_ACTION, kit.Format(arg))
}
func (m *Message) Process(action string, arg ...interface{}) {
m.Option(MSG_PROCESS, action)
m.Option("_arg", arg...)
}
func (m *Message) ProcessHold() { m.Process(PROCESS_HOLD) }
func (m *Message) ProcessBack() { m.Process(PROCESS_BACK) }

View File

@ -14,6 +14,9 @@ import (
) )
func _repos_path(name string) string { func _repos_path(name string) string {
if strings.Contains(name, ":\\") {
return name
}
return kit.Select(path.Join(kit.SSH_USR, name), "./", name == path.Base(kit.Pwd())) return kit.Select(path.Join(kit.SSH_USR, name), "./", name == path.Base(kit.Pwd()))
} }
func _repos_insert(m *ice.Message, name string, dir string) { func _repos_insert(m *ice.Message, name string, dir string) {
@ -34,11 +37,8 @@ const (
MASTER = "master" MASTER = "master"
CLONE = "clone" CLONE = "clone"
ADD = "add"
INIT = "init" INIT = "init"
PULL = "pull"
PUSH = "push"
) )
const REPOS = "repos" const REPOS = "repos"
@ -78,7 +78,7 @@ func init() {
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 { // 仓库列表 if len(arg) == 0 { // 仓库列表
m.Option(mdb.FIELDS, "time,name,branch,commit,remote") m.Fields(len(arg) == 0, "time,name,branch,commit,remote")
m.Cmdy(mdb.SELECT, m.Prefix(REPOS), "", mdb.HASH) m.Cmdy(mdb.SELECT, m.Prefix(REPOS), "", mdb.HASH)
m.Sort(kit.MDB_NAME) m.Sort(kit.MDB_NAME)
return return

View File

@ -5,86 +5,30 @@ import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
const ( func _status_each(m *ice.Message, title string, cmds ...string) {
COMPILE = "compile" m.GoToast(title, func(toast func(string, int, int)) {
COMMIT = "commit"
DIFF = "diff"
MAKE = "make"
)
const STATUS = "status"
func init() {
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
STATUS: {Name: "status name auto", Help: "代码状态", Action: map[string]*ice.Action{
PULL: {Name: "pull", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(cli.PROGRESS, mdb.CREATE, func(update func(name string, count, total int)) {
count, total := 0, len(m.Confm(REPOS, kit.MDB_HASH)) count, total := 0, len(m.Confm(REPOS, kit.MDB_HASH))
m.Richs(REPOS, nil, kit.Select(kit.MDB_FOREACH, arg, 0), func(key string, value map[string]interface{}) { toast("begin", count, total)
value = kit.GetMeta(value)
update(kit.Format(value[kit.MDB_NAME]), count, total)
m.Option(cli.CMD_DIR, value[kit.MDB_PATH]) m.Cmd(REPOS, ice.OptionFields("name,path")).Table(func(index int, value map[string]string, head []string) {
m.Cmd(cli.SYSTEM, GIT, PULL) toast(value[kit.MDB_NAME], count, total)
m.Cmd(cmds, ice.Option{cli.CMD_DIR, value[kit.MDB_PATH]})
count++ count++
}) })
update("", total, total)
toast("success", count, total)
}) })
}}, }
COMPILE: {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) { func _status_list(m *ice.Message) {
m.Cmdy(cli.SYSTEM, MAKE) m.Cmd(REPOS, ice.OptionFields("name,path")).Table(func(index int, value map[string]string, head []string) {
}}, m.Option(cli.CMD_DIR, value[kit.MDB_PATH])
mdb.CREATE: {Name: "create main=src/main.go@key name=hi@key from=usr/icebergs/misc/bash/bash.go@key", Help: "模块", Hand: func(m *ice.Message, arg ...string) { diff := m.Cmdx(cli.SYSTEM, GIT, STATUS, "-sb")
m.Cmdy(code.AUTOGEN, mdb.CREATE, arg)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.AUTOGEN, mdb.INPUTS, arg)
}},
ADD: {Name: "add", Help: "添加", Hand: func(m *ice.Message, arg ...string) { for _, v := range strings.Split(strings.TrimSpace(diff), "\n") {
m.Option(cli.CMD_DIR, _repos_path(m.Option(kit.MDB_NAME)))
m.Cmdy(cli.SYSTEM, GIT, ADD, m.Option(kit.MDB_FILE))
}},
COMMIT: {Name: "commit action=opt,add comment=some", Help: "提交", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_NAME) == "" {
return
}
if m.Option(cli.CMD_DIR, _repos_path(m.Option(kit.MDB_NAME))); arg[0] == kit.MDB_ACTION {
m.Cmdy(cli.SYSTEM, GIT, COMMIT, "-am", kit.Select("opt some", arg[1]+" "+arg[3]))
} else {
m.Cmdy(cli.SYSTEM, GIT, COMMIT, "-am", kit.Select("opt some", strings.Join(arg, " ")))
}
m.Option(ice.MSG_PROCESS, ice.PROCESS_REFRESH)
}},
PUSH: {Name: "push", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_NAME) == "" {
return
}
if strings.Contains(m.Option(kit.MDB_NAME), ":\\") {
m.Option(cli.CMD_DIR, m.Option(kit.MDB_NAME))
} else {
m.Option(cli.CMD_DIR, _repos_path(m.Option(kit.MDB_NAME)))
}
m.Cmdy(cli.SYSTEM, GIT, PUSH)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Richs(REPOS, nil, kit.Select(kit.MDB_FOREACH, arg, 0), func(key string, value map[string]interface{}) {
value = kit.GetMeta(value)
if m.Option(cli.CMD_DIR, value[kit.MDB_PATH]); len(arg) > 0 {
m.Option("_action", kit.Format([]string{"commit"}))
m.Echo(m.Cmdx(cli.SYSTEM, GIT, DIFF))
return // 更改详情
}
m.Option("_action", kit.Format([]string{"pull", "compile", "create"}))
// 更改列表
for _, v := range strings.Split(strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, STATUS, "-sb")), "\n") {
vs := strings.SplitN(strings.TrimSpace(v), " ", 2) vs := strings.SplitN(strings.TrimSpace(v), " ", 2)
m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
m.Push(kit.MDB_TYPE, vs[0]) m.Push(kit.MDB_TYPE, vs[0])
@ -106,7 +50,67 @@ func init() {
m.PushButton(strings.Join(list, ",")) m.PushButton(strings.Join(list, ","))
} }
}) })
m.Sort(kit.MDB_NAME) }
const (
PULL = "pull"
MAKE = "make"
PUSH = "push"
ADD = "add"
DIFF = "diff"
COMMIT = "commit"
)
const STATUS = "status"
func init() {
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
STATUS: {Name: "status name auto", Help: "代码状态", Action: map[string]*ice.Action{
PULL: {Name: "pull", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
_status_each(m, PULL, cli.SYSTEM, GIT, PULL)
m.ProcessHold()
}},
MAKE: {Name: "make", Help: "编译", Hand: func(m *ice.Message, arg ...string) {
m.Toast("doing", "make", 100000)
defer m.Toast("success", "make", 1000)
m.Cmdy(cli.SYSTEM, MAKE)
}},
PUSH: {Name: "push", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_NAME) == "" {
_status_each(m, PUSH, cli.SYSTEM, GIT, PUSH)
m.ProcessHold()
return
}
m.Option(cli.CMD_DIR, _repos_path(m.Option(kit.MDB_NAME)))
m.Cmdy(cli.SYSTEM, GIT, PUSH)
}},
ADD: {Name: "add", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, _repos_path(m.Option(kit.MDB_NAME)))
m.Cmdy(cli.SYSTEM, GIT, ADD, m.Option(kit.MDB_FILE))
}},
COMMIT: {Name: "commit action=opt,add comment=some", Help: "提交", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == kit.MDB_ACTION {
m.Option(kit.MDB_TEXT, arg[1]+" "+arg[3])
} else {
m.Option(kit.MDB_TEXT, kit.Select("opt some", strings.Join(arg, " ")))
}
m.Option(cli.CMD_DIR, _repos_path(m.Option(kit.MDB_NAME)))
m.Cmdy(cli.SYSTEM, GIT, COMMIT, "-am", m.Option(kit.MDB_TEXT))
m.ProcessBack()
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
_status_list(m)
m.Action(PULL, MAKE, PUSH)
return
}
m.Echo(m.Cmdx(cli.SYSTEM, GIT, DIFF, ice.Option{cli.CMD_DIR, _repos_path(arg[0])}))
m.Action(COMMIT)
}}, }},
}}) }})
} }

65
type.go
View File

@ -643,30 +643,30 @@ func (m *Message) Cmd(arg ...interface{}) *Message {
func (m *Message) cmd(arg ...interface{}) *Message { func (m *Message) cmd(arg ...interface{}) *Message {
opts := map[string]interface{}{} opts := map[string]interface{}{}
args := []interface{}{} args := []interface{}{}
var cbs interface{}
// 解析参数
for _, v := range arg { for _, v := range arg {
switch val := v.(type) { switch val := v.(type) {
case Option: case func(int, map[string]string, []string):
opts[val.Name] = val.Value defer func() { m.Table(val) }()
case *Option: case *Option:
opts[val.Name] = val.Value opts[val.Name] = val.Value
case Option:
opts[val.Name] = val.Value
default: default:
if reflect.Func == reflect.TypeOf(val).Kind() {
cbs = val
} else {
args = append(args, v) args = append(args, v)
} }
} }
}
// 解析命令
list := kit.Simple(args...) list := kit.Simple(args...)
if len(args) > 0 {
switch cb := args[len(args)-1]; cbs := cb.(type) {
case string:
default:
if reflect.Func == reflect.TypeOf(cbs).Kind() {
m.Optionv(list[0]+".cb", cbs)
list = list[:len(list)-1]
}
}
}
if len(list) == 0 && m.Hand == false { if len(list) == 0 && m.Hand == false {
list = m.meta[MSG_DETAIL] list = m.meta[MSG_DETAIL]
} }
@ -674,31 +674,32 @@ func (m *Message) cmd(arg ...interface{}) *Message {
return m return m
} }
if cmd, ok := m.target.Commands[list[0]]; ok { run := func(msg *Message, ctx *Context, cmd *Command, key string, arg ...string) {
m.TryCatch(m.Spawn(), true, func(msg *Message) { if cbs != nil {
msg.Option(list[0]+".cb", cbs)
}
for k, v := range opts { for k, v := range opts {
msg.Option(k, v) msg.Option(k, v)
} }
m = m.target.cmd(msg, cmd, list[0], list[1:]...)
}) // 执行命令
} else if cmd, ok := m.source.Commands[list[0]]; ok { m.TryCatch(msg, true, func(msg *Message) {
m.TryCatch(m.Spawn(m.source), true, func(msg *Message) { m = ctx.cmd(msg, cmd, key, arg...)
for k, v := range opts {
msg.Option(k, v)
}
m = m.source.cmd(msg, cmd, list[0], list[1:]...)
})
} else {
m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) {
m.TryCatch(m.Spawn(s), true, func(msg *Message) {
for k, v := range opts {
msg.Option(k, v)
}
m = s.cmd(msg, cmd, key, list[1:]...)
})
}) })
} }
// 查找命令
if cmd, ok := m.target.Commands[list[0]]; ok {
run(m.Spawn(), m.target, cmd, list[0], list[1:]...)
} else if cmd, ok := m.source.Commands[list[0]]; ok {
run(m.Spawn(m.source), m.source, cmd, list[0], list[1:]...)
} else {
m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) {
run(m.Spawn(s), s, cmd, key, list[1:]...)
})
}
// 系统命令
if m.Warn(m.Hand == false, ErrNotFound, list) { if m.Warn(m.Hand == false, ErrNotFound, list) {
return m.Set(MSG_RESULT).Cmd("cli.system", list) return m.Set(MSG_RESULT).Cmd("cli.system", list)
} }