1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00
This commit is contained in:
harveyshao 2021-05-25 22:24:50 +08:00
parent 0cc1a5d6b4
commit bbc0c2b30b
5 changed files with 52 additions and 30 deletions

1
base/cli/stream.go Normal file
View File

@ -0,0 +1 @@
package cli

View File

@ -16,24 +16,14 @@ import (
func _system_show(m *ice.Message, cmd *exec.Cmd) {
if r, ok := m.Optionv(CMD_INPUT).(io.Reader); ok {
cmd.Stdin = r
} else if r, ok := m.Optionv("input").(io.Reader); ok {
cmd.Stdin = r
}
if w, ok := m.Optionv(CMD_ERRPUT).(io.WriteCloser); ok {
cmd.Stderr = w
}
if w, ok := m.Optionv(CMD_OUTPUT).(io.WriteCloser); ok {
cmd.Stdout = w
if e := cmd.Run(); e != nil {
m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", e.Error())
} else {
m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode())
}
} else if w, ok := m.Optionv("output").(io.WriteCloser); ok {
cmd.Stderr = w
cmd.Stdout = w
if w, ok := m.Optionv(CMD_ERRPUT).(io.WriteCloser); ok {
cmd.Stderr = w
}
if e := cmd.Run(); e != nil {
m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", e.Error())
@ -41,16 +31,17 @@ func _system_show(m *ice.Message, cmd *exec.Cmd) {
m.Cost("args", cmd.Args, "code", cmd.ProcessState.ExitCode())
}
} else {
err := bytes.NewBuffer(make([]byte, 0, 1024))
out := bytes.NewBuffer(make([]byte, 0, 1024))
cmd.Stderr = err
cmd.Stdout = out
err := bytes.NewBuffer(make([]byte, 0, 1024))
defer func() {
m.Push(CMD_ERR, err.String())
m.Push(CMD_OUT, out.String())
m.Echo(kit.Select(err.String(), out.String()))
}()
cmd.Stdout = out
cmd.Stderr = err
if e := cmd.Run(); e != nil {
m.Warn(e != nil, ErrRun, strings.Join(cmd.Args, " "), "\n", kit.Select(e.Error(), err.String()))
} else {
@ -85,6 +76,9 @@ const (
LINUX = "linux"
DARWIN = "darwin"
WINDOWS = "windows"
SOURCE = "source"
HOME = "home"
PATH = "path"
)
const SYSTEM = "system"

21
base/web/stream.go Normal file
View File

@ -0,0 +1,21 @@
package web
import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
)
type Buffer struct {
m *ice.Message
n string
}
func (b *Buffer) Write(buf []byte) (int, error) {
b.m.Cmd(SPACE, b.n, "grow", string(buf))
return len(buf), nil
}
func (b *Buffer) Close() error { return nil }
func PushStream(m *ice.Message) {
m.Option(cli.CMD_OUTPUT, &Buffer{m: m, n: m.Option(ice.MSG_DAEMON)})
}

View File

@ -16,17 +16,6 @@ import (
kit "github.com/shylinux/toolkits"
)
type Buffer struct {
m *ice.Message
n string
}
func (b *Buffer) Write(buf []byte) (int, error) {
b.m.Cmd(web.SPACE, b.n, "grow", string(buf))
return len(buf), nil
}
func (b *Buffer) Close() error { return nil }
const PREPARE = "prepare"
const INSTALL = "install"
@ -37,10 +26,10 @@ func init() {
},
Commands: map[string]*ice.Command{
INSTALL: {Name: "install name port path auto download", Help: "安装", Meta: kit.Dict(), Action: map[string]*ice.Action{
web.DOWNLOAD: {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
web.DOWNLOAD: {Name: "download link path", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
link := m.Option(kit.MDB_LINK)
name := path.Base(link)
file := path.Join(m.Conf(INSTALL, kit.META_PATH), name)
file := path.Join(kit.Select(m.Conf(INSTALL, kit.META_PATH), m.Option(kit.MDB_PATH)), name)
defer m.Cmdy(nfs.DIR, file)
if _, e := os.Stat(file); e == nil {
@ -80,7 +69,7 @@ func init() {
pp := kit.Path(path.Join(p, "_install"))
// 推流
m.Option(cli.CMD_OUTPUT, &Buffer{m: m, n: m.Option(ice.MSG_DAEMON)})
web.PushStream(m)
defer func() { m.Toast("success", "build") }()
defer func() { m.ProcessHold() }()

17
type.go
View File

@ -159,6 +159,23 @@ func (c *Context) Merge(s *Context) *Context {
c.Commands = map[string]*Command{}
}
for k, v := range s.Commands {
if o, ok := c.Commands[k]; ok && s != c {
func() {
switch last, next := o.Hand, v.Hand; k {
case CTX_INIT:
v.Hand = func(m *Message, c *Context, key string, arg ...string) {
last(m, c, key, arg...)
next(m, c, key, arg...)
}
case CTX_EXIT:
v.Hand = func(m *Message, c *Context, key string, arg ...string) {
next(m, c, key, arg...)
last(m, c, key, arg...)
}
}
}()
}
c.Commands[k] = v
if v.List == nil {