diff --git a/base/cli/stream.go b/base/cli/stream.go new file mode 100644 index 00000000..7f1e458c --- /dev/null +++ b/base/cli/stream.go @@ -0,0 +1 @@ +package cli diff --git a/base/cli/system.go b/base/cli/system.go index 500a9a79..471ead8e 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -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" diff --git a/base/web/stream.go b/base/web/stream.go new file mode 100644 index 00000000..ea380d06 --- /dev/null +++ b/base/web/stream.go @@ -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)}) +} diff --git a/core/code/install.go b/core/code/install.go index d1ddbb70..62170174 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -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() }() diff --git a/type.go b/type.go index 613cdb43..0f7c242e 100644 --- a/type.go +++ b/type.go @@ -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 {