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
import (
"math/rand"
"net"
"net/url"
"strings"
"time"
"github.com/gorilla/websocket"
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa"
@ -8,12 +14,6 @@ import (
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp"
kit "github.com/shylinux/toolkits"
"math/rand"
"net"
"net/url"
"strings"
"time"
)
func _space_list(m *ice.Message, space string) {
@ -188,11 +188,13 @@ func _space_search(m *ice.Message, kind, name, text string, arg ...string) {
}
})
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.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))
})
if name == "" {
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.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))
})
}
}
const (
@ -263,7 +265,7 @@ func init() {
switch kind {
case CHROME:
if m.Option(ice.MSG_USERNAME) != "" {
break
// break
}
m.Go(func(msg *ice.Message) {

View File

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

View File

@ -7,6 +7,7 @@ import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
)
@ -58,6 +59,7 @@ func _action_share(m *ice.Message, cmd string, arg ...string) {
case web.FIELD:
if cmd := kit.Keys(msg.Append(web.RIVER), msg.Append(web.STORM)); len(arg) == 2 {
m.Push("index", cmd)
m.Push("title", msg.Append(kit.MDB_NAME))
m.Push("args", msg.Append(kit.MDB_TEXT))
} else {
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, "."))
}
}},
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) {
_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_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) == "" {
// 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: // 应用入口

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/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/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/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-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
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/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=
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/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-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/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/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
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) 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) RenameAppend(from, to string) {
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 {
Name string
Value interface{}
@ -263,3 +255,32 @@ type Option struct {
func OptionFields(str string) Option { return Option{"fields", 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 {
if strings.Contains(name, ":\\") {
return name
}
return kit.Select(path.Join(kit.SSH_USR, name), "./", name == path.Base(kit.Pwd()))
}
func _repos_insert(m *ice.Message, name string, dir string) {
@ -34,11 +37,8 @@ const (
MASTER = "master"
CLONE = "clone"
ADD = "add"
INIT = "init"
PULL = "pull"
PUSH = "push"
)
const REPOS = "repos"
@ -78,7 +78,7 @@ func init() {
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
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.Sort(kit.MDB_NAME)
return

View File

@ -5,16 +5,61 @@ import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits"
)
func _status_each(m *ice.Message, title string, cmds ...string) {
m.GoToast(title, func(toast func(string, int, int)) {
count, total := 0, len(m.Confm(REPOS, kit.MDB_HASH))
toast("begin", count, total)
m.Cmd(REPOS, ice.OptionFields("name,path")).Table(func(index int, value map[string]string, head []string) {
toast(value[kit.MDB_NAME], count, total)
m.Cmd(cmds, ice.Option{cli.CMD_DIR, value[kit.MDB_PATH]})
count++
})
toast("success", count, total)
})
}
func _status_list(m *ice.Message) {
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])
diff := m.Cmdx(cli.SYSTEM, GIT, STATUS, "-sb")
for _, v := range strings.Split(strings.TrimSpace(diff), "\n") {
vs := strings.SplitN(strings.TrimSpace(v), " ", 2)
m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
m.Push(kit.MDB_TYPE, vs[0])
m.Push(kit.MDB_FILE, vs[1])
list := []string{}
switch vs[0] {
case "##":
if strings.Contains(vs[1], "ahead") {
list = append(list, PUSH)
}
default:
if strings.Contains(vs[0], "??") {
list = append(list, ADD)
} else {
list = append(list, COMMIT)
}
}
m.PushButton(strings.Join(list, ","))
}
})
}
const (
COMPILE = "compile"
COMMIT = "commit"
DIFF = "diff"
MAKE = "make"
PULL = "pull"
MAKE = "make"
PUSH = "push"
ADD = "add"
DIFF = "diff"
COMMIT = "commit"
)
const STATUS = "status"
@ -22,27 +67,24 @@ 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))
m.Richs(REPOS, nil, kit.Select(kit.MDB_FOREACH, arg, 0), func(key string, value map[string]interface{}) {
value = kit.GetMeta(value)
update(kit.Format(value[kit.MDB_NAME]), count, total)
m.Option(cli.CMD_DIR, value[kit.MDB_PATH])
m.Cmd(cli.SYSTEM, GIT, PULL)
count++
})
update("", total, total)
})
_status_each(m, PULL, cli.SYSTEM, GIT, PULL)
m.ProcessHold()
}},
COMPILE: {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) {
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)
}},
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) {
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)
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) {
@ -50,63 +92,25 @@ func init() {
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 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, " ")))
}
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)
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) {
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"}))
if len(arg) == 0 {
_status_list(m)
m.Action(PULL, MAKE, PUSH)
return
}
// 更改列表
for _, v := range strings.Split(strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, STATUS, "-sb")), "\n") {
vs := strings.SplitN(strings.TrimSpace(v), " ", 2)
m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
m.Push(kit.MDB_TYPE, vs[0])
m.Push(kit.MDB_FILE, vs[1])
list := []string{}
switch vs[0] {
case "##":
if strings.Contains(vs[1], "ahead") {
list = append(list, PUSH)
}
default:
if strings.Contains(vs[0], "??") {
list = append(list, ADD)
} else {
list = append(list, COMMIT)
}
}
m.PushButton(strings.Join(list, ","))
}
})
m.Sort(kit.MDB_NAME)
m.Echo(m.Cmdx(cli.SYSTEM, GIT, DIFF, ice.Option{cli.CMD_DIR, _repos_path(arg[0])}))
m.Action(COMMIT)
}},
}})
}

71
type.go
View File

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