1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-28 18:22:02 +08:00
This commit is contained in:
shylinux@163.com 2022-09-25 22:50:10 +08:00
parent dd83d6040d
commit 3efdc8b7dc
32 changed files with 288 additions and 319 deletions

View File

@ -5,7 +5,9 @@ import (
"strings" "strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -24,19 +26,15 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeActions(ice.Actions{ MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Go(func() { m.Conf(m.Prefix(MIRRORS), kit.Keys(mdb.HASH), "")
m.Sleep300ms() // after runtime init IsAlpine(m, "curl")
m.Conf(m.Prefix(MIRRORS), kit.Keys(mdb.HASH), "") IsAlpine(m, "make")
IsAlpine(m, "curl") IsAlpine(m, "gcc")
IsAlpine(m, "make") IsAlpine(m, "vim")
IsAlpine(m, "gcc") IsAlpine(m, "tmux")
IsAlpine(m, "vim") if IsAlpine(m, "git"); !IsAlpine(m, "go", "go git") {
IsAlpine(m, "tmux") mdb.ZoneInsert(m, CLI, "go", CMD, kit.Format("install download https://golang.google.cn/dl/go1.15.5.%s-%s.tar.gz usr/local", runtime.GOOS, runtime.GOARCH))
}
if IsAlpine(m, "git"); !IsAlpine(m, "go", "go git") {
mdb.ZoneInsert(m, CLI, "go", CMD, kit.Format("install download https://golang.google.cn/dl/go1.15.5.%s-%s.tar.gz usr/local", runtime.GOOS, runtime.GOARCH))
}
})
}}, }},
mdb.INSERT: {Name: "insert cli osid cmd", Help: "添加"}, mdb.INSERT: {Name: "insert cli osid cmd", Help: "添加"},
CMD: {Name: "cmd cli osid", Help: "安装", Hand: func(m *ice.Message, arg ...string) { CMD: {Name: "cmd cli osid", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
@ -54,17 +52,37 @@ func init() {
}) })
} }
func osid(m *ice.Message, sys string) bool {
osid := runtime.GOOS
m.Option(ice.MSG_USERROLE, aaa.ROOT)
m.Cmd(nfs.CAT, "/etc/os-release", func(text string) {
if ls := kit.Split(text, "="); len(ls) > 1 {
switch ls[0] {
case "ID", "ID_LIKE":
osid = strings.TrimSpace(ls[1] + ice.SP + osid)
}
}
})
if strings.Contains(osid, sys) {
return true
}
return false
}
func IsAlpine(m *ice.Message, arg ...string) bool { func IsAlpine(m *ice.Message, arg ...string) bool {
if strings.Contains(m.Conf(RUNTIME, kit.Keys(HOST, OSID)), ALPINE) { if osid(m, ALPINE) {
if len(arg) > 0 { if len(arg) > 0 {
m.Cmd(mdb.INSERT, kit.Keys(CLI, MIRRORS), "", mdb.ZONE, arg[0], OSID, ALPINE, CMD, "system apk add "+kit.Select(arg[0], arg, 1)) m.Go(func() {
m.Sleep300ms()
m.Cmd(mdb.INSERT, kit.Keys(CLI, MIRRORS), "", mdb.ZONE, arg[0], OSID, ALPINE, CMD, "system apk add "+kit.Select(arg[0], arg, 1))
})
} }
return true return true
} }
return false return false
} }
func IsCentos(m *ice.Message, arg ...string) bool { func IsCentos(m *ice.Message, arg ...string) bool {
if strings.Contains(m.Conf(RUNTIME, kit.Keys(HOST, OSID)), CENTOS) { if osid(m, ALPINE) {
if len(arg) > 0 { if len(arg) > 0 {
m.Cmd(mdb.INSERT, kit.Keys(CLI, MIRRORS), "", mdb.ZONE, arg[0], OSID, CENTOS, CMD, "yum install -y "+kit.Select(arg[0], arg, 1)) m.Cmd(mdb.INSERT, kit.Keys(CLI, MIRRORS), "", mdb.ZONE, arg[0], OSID, CENTOS, CMD, "yum install -y "+kit.Select(arg[0], arg, 1))
} }
@ -73,7 +91,7 @@ func IsCentos(m *ice.Message, arg ...string) bool {
return false return false
} }
func IsUbuntu(m *ice.Message, arg ...string) bool { func IsUbuntu(m *ice.Message, arg ...string) bool {
if strings.Contains(m.Conf(RUNTIME, kit.Keys(HOST, OSID)), UBUNTU) { if osid(m, ALPINE) {
if len(arg) > 0 { if len(arg) > 0 {
m.Cmd(mdb.INSERT, kit.Keys(CLI, MIRRORS), "", mdb.ZONE, arg[0], OSID, UBUNTU, CMD, "yum install -y "+kit.Select(arg[0], arg, 1)) m.Cmd(mdb.INSERT, kit.Keys(CLI, MIRRORS), "", mdb.ZONE, arg[0], OSID, UBUNTU, CMD, "yum install -y "+kit.Select(arg[0], arg, 1))
} }

View File

@ -173,7 +173,7 @@ func init() {
arg = append(arg, "") arg = append(arg, "")
} }
m.Option(CMD_ENV, "COLUMNS", kit.Int(kit.Select("1920", m.Option("width")))/12) m.Option(CMD_ENV, "COLUMNS", kit.Int(kit.Select("1920", m.Option("width")))/12)
m.Cmdy(SYSTEM, "sh", "-c", kit.Format("man %s %s|col -b", kit.Select("", arg[1], arg[1] != "1"), arg[0])) m.Echo(SystemCmds(m, "man %s %s|col -b", kit.Select("", arg[1], arg[1] != "1"), arg[0]))
}}, }},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
@ -204,3 +204,9 @@ func SystemFind(m Message, bin string, dir ...string) string {
dir = append(dir, strings.Split(kit.Env(PATH), ice.DF)...) dir = append(dir, strings.Split(kit.Env(PATH), ice.DF)...)
return _system_find(m, bin, dir...) return _system_find(m, bin, dir...)
} }
func SystemExec(m *ice.Message, arg ...string) string {
return strings.TrimSpace(m.Cmdx(SYSTEM, arg))
}
func SystemCmds(m *ice.Message, cmds string, args ...ice.Any) string {
return strings.TrimRight(m.Cmdx(SYSTEM, "sh", "-c", kit.Format(cmds, args...), ice.Option{CMD_OUTPUT, ""}), ice.NL)
}

View File

@ -205,3 +205,13 @@ func Dir(m *ice.Message, sort string) *ice.Message {
m.Copy(m.Cmd(DIR, PWD).Sort(sort)) m.Copy(m.Cmd(DIR, PWD).Sort(sort))
return m return m
} }
func DirDeepAll(m *ice.Message, root, dir string, cb func(ice.Maps), arg ...string) *ice.Message {
m.Option(DIR_TYPE, CAT)
m.Option(DIR_ROOT, root)
m.Option(DIR_DEEP, ice.TRUE)
if msg := m.Cmd(DIR, dir, arg).Sort(PATH).Tables(cb); cb == nil {
return m.Copy(msg)
} else {
return msg
}
}

View File

@ -414,3 +414,6 @@ func SpidePost(m *ice.Message, arg ...ice.Any) ice.Any {
func SpideDelete(m *ice.Message, arg ...ice.Any) ice.Any { func SpideDelete(m *ice.Message, arg ...ice.Any) ice.Any {
return kit.UnMarshal(m.Cmdx(SPIDE_DELETE, arg)) return kit.UnMarshal(m.Cmdx(SPIDE_DELETE, arg))
} }
func SpideSave(m *ice.Message, file, link string, cb func(int, int, int)) *ice.Message {
return m.Cmd("web.spide", ice.DEV, SPIDE_SAVE, file, SPIDE_GET, link, cb)
}

14
conf.go
View File

@ -96,13 +96,13 @@ const ( // DIR
PLUGIN = "plugin" PLUGIN = "plugin"
STORY = "story" STORY = "story"
FAVICON = "favicon.ico" FAVICON_ICO = "favicon.ico"
PROTO_JS = "proto.js" PROTO_JS = "proto.js"
FRAME_JS = "frame.js" FRAME_JS = "frame.js"
INDEX_JS = "index.js" INDEX_JS = "index.js"
INDEX_SH = "index.sh" INDEX_SH = "index.sh"
INDEX_IML = "index.iml" INDEX_IML = "index.iml"
TUTOR_SHY = "tutor.shy" TUTOR_SHY = "tutor.shy"
PLUGIN_INPUT = "/plugin/input" PLUGIN_INPUT = "/plugin/input"
PLUGIN_STORY = "/plugin/story" PLUGIN_STORY = "/plugin/story"

View File

@ -5,6 +5,7 @@ import (
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
) )
const IFRAME = "iframe" const IFRAME = "iframe"
@ -12,7 +13,11 @@ const IFRAME = "iframe"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
IFRAME: {Name: "iframe hash auto", Help: "浏览器", Actions: ice.MergeActions(ice.Actions{ IFRAME: {Name: "iframe hash auto", Help: "浏览器", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create link name type", Help: "创建"}, mdb.CREATE: {Name: "create link name type", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
u := kit.ParseURL(m.Option(mdb.LINK))
m.OptionDefault(mdb.NAME, u.Host)
mdb.HashCreate(m, m.OptionSimple("link,name,type"))
}},
}, mdb.HashAction(mdb.SHORT, mdb.LINK, mdb.FIELD, "time,hash,type,name,link")), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.SHORT, mdb.LINK, mdb.FIELD, "time,hash,type,name,link")), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...); len(arg) == 0 || arg[0] == "" { if mdb.HashSelect(m, arg...); len(arg) == 0 || arg[0] == "" {
m.Action(mdb.CREATE, mdb.PRUNES) m.Action(mdb.CREATE, mdb.PRUNES)

View File

@ -29,6 +29,19 @@ func _defs_list(m *ice.Message) string {
} }
return m.OptionDefault(mdb.LIST, kit.Join(list, ice.SP)) return m.OptionDefault(mdb.LIST, kit.Join(list, ice.SP))
} }
func _autogen_source(m *ice.Message, main, file string) {
main = strings.ReplaceAll(main, ice.PT+GO, ice.PT+SHY)
m.Cmd(nfs.DEFS, main, `title "{{.Option "name"}}"
`)
m.Cmd(nfs.PUSH, main, ice.NL, "source "+strings.TrimPrefix(file, ice.SRC+ice.PS))
}
func _autogen_script(m *ice.Message, dir string) {
m.Cmd(nfs.DEFS, dir, `chapter "{{.Option "name"}}"
field {{.Option "key"}}
`)
}
func _autogen_module(m *ice.Message, dir string) { func _autogen_module(m *ice.Message, dir string) {
m.Cmd(nfs.DEFS, dir, `package {{.Option "zone"}} m.Cmd(nfs.DEFS, dir, `package {{.Option "zone"}}
@ -75,55 +88,6 @@ func main() { print(ice.Run()) }
}) })
m.Cmd(nfs.SAVE, main, kit.Join(list, ice.NL)) m.Cmd(nfs.SAVE, main, kit.Join(list, ice.NL))
} }
func _autogen_script(m *ice.Message, dir string) {
m.Cmd(nfs.DEFS, dir, `chapter "{{.Option "name"}}"
field {{.Option "key"}}
`)
}
func _autogen_source(m *ice.Message, main, file string) {
main = strings.ReplaceAll(main, ice.PT+GO, ice.PT+SHY)
m.Cmd(nfs.DEFS, main, `title "{{.Option "name"}}"
`)
m.Cmd(nfs.PUSH, main, ice.NL, "source "+strings.TrimPrefix(file, ice.SRC+ice.PS))
}
func _autogen_mod(m *ice.Message, file string) (mod string) {
host := web.OptionUserWeb(m).Hostname()
if host == "" {
host = path.Base(kit.Path(""))
} else {
host = path.Join(host, "x", path.Base(kit.Path("")))
}
m.Cmd(nfs.DEFS, file, kit.Format(`module %s
go 1.11
`, host))
m.Cmd(nfs.CAT, file, func(line string) {
if strings.HasPrefix(line, "module") {
mod = kit.Split(line, ice.SP)[1]
}
})
return
}
func _autogen_git(m *ice.Message, arg ...string) ice.Map {
return kit.Dict("Path", kit.Path(""), "Time", m.Time(), arg,
"Hash", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "log", "-n1", `--pretty=%H`)),
"Remote", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "config", "remote.origin.url")),
"Branch", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "rev-parse", "--abbrev-ref", "HEAD")),
"Version", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "describe", "--tags")),
"Domain", m.Option(ice.MSG_USERWEB),
)
}
func _autogen_gits(m *ice.Message, arg ...string) string {
res := []string{}
kit.Fetch(_autogen_git(m, arg...), func(k string, v ice.Any) {
res = append(res, kit.Format(` %s: "%s",`, k, v))
})
return kit.Join(res, ice.NL)
}
func _autogen_version(m *ice.Message) { func _autogen_version(m *ice.Message) {
if mod := _autogen_mod(m, ice.GO_MOD); !nfs.ExistsFile(m, ".git") { if mod := _autogen_mod(m, ice.GO_MOD); !nfs.ExistsFile(m, ".git") {
m.Cmdy(cli.SYSTEM, GIT, ice.INIT) m.Cmdy(cli.SYSTEM, GIT, ice.INIT)
@ -159,6 +123,42 @@ func init() {
m.Cmdy(nfs.DIR, ice.SRC_VERSION_GO) m.Cmdy(nfs.DIR, ice.SRC_VERSION_GO)
m.Cmdy(nfs.DIR, ice.SRC_BINPACK_GO) m.Cmdy(nfs.DIR, ice.SRC_BINPACK_GO)
} }
func _autogen_gits(m *ice.Message, arg ...string) string {
res := []string{}
kit.Fetch(_autogen_git(m, arg...), func(k string, v ice.Any) {
res = append(res, kit.Format(` %s: "%s",`, k, v))
})
return kit.Join(res, ice.NL)
}
func _autogen_git(m *ice.Message, arg ...string) ice.Map {
return kit.Dict("Path", kit.Path(""), "Time", m.Time(), arg,
"Hash", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "log", "-n1", `--pretty=%H`)),
"Remote", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "config", "remote.origin.url")),
"Branch", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "rev-parse", "--abbrev-ref", "HEAD")),
"Version", strings.TrimSpace(m.Cmdx(cli.SYSTEM, GIT, "describe", "--tags")),
"Domain", m.Option(ice.MSG_USERWEB),
)
}
func _autogen_mod(m *ice.Message, file string) (mod string) {
host := web.OptionUserWeb(m).Hostname()
if host == "" {
host = path.Base(kit.Path(""))
} else {
host = path.Join(host, "x", path.Base(kit.Path("")))
}
m.Cmd(nfs.DEFS, file, kit.Format(`module %s
go 1.11
`, host))
m.Cmd(nfs.CAT, file, func(line string) {
if strings.HasPrefix(line, "module") {
mod = kit.Split(line, ice.SP)[1]
}
})
return
}
const AUTOGEN = "autogen" const AUTOGEN = "autogen"
@ -178,18 +178,18 @@ func init() {
m.Option(mdb.TEXT, kit.Format("`name:\"%s\" help:\"%s\"`", _defs_list(m), m.Option(mdb.HELP))) m.Option(mdb.TEXT, kit.Format("`name:\"%s\" help:\"%s\"`", _defs_list(m), m.Option(mdb.HELP)))
nfs.OptionFiles(m, nfs.DiskFile) nfs.OptionFiles(m, nfs.DiskFile)
if p := path.Join(m.Option(nfs.PATH), m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !nfs.ExistsFile(m, p) {
_autogen_source(m, path.Join(m.Option(nfs.PATH), m.Option(cli.MAIN)), p)
_autogen_script(m, p)
}
if p := path.Join(m.Option(nfs.PATH), m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !nfs.ExistsFile(m, p) { if p := path.Join(m.Option(nfs.PATH), m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !nfs.ExistsFile(m, p) {
_autogen_module(m, p) _autogen_module(m, p)
_autogen_import(m, path.Join(m.Option(nfs.PATH), m.Option(cli.MAIN)), m.Option(mdb.ZONE), _autogen_mod(m, ice.GO_MOD)) _autogen_import(m, path.Join(m.Option(nfs.PATH), m.Option(cli.MAIN)), m.Option(mdb.ZONE), _autogen_mod(m, ice.GO_MOD))
} }
if p := path.Join(m.Option(nfs.PATH), m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !nfs.ExistsFile(m, p) {
_autogen_script(m, p)
_autogen_source(m, path.Join(m.Option(nfs.PATH), m.Option(cli.MAIN)), p)
}
m.Option(nfs.FILE, path.Join(m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO))) m.Option(nfs.FILE, path.Join(m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)))
_autogen_version(m.Spawn()) _autogen_version(m.Spawn())
}}, }},
ssh.SCRIPT: {Name: "script", Help: "脚本:生成 etc/miss.sh", Hand: func(m *ice.Message, arg ...string) { ssh.SCRIPT: {Name: "script", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, _miss_script) m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, _miss_script)
defer m.Cmdy(nfs.CAT, ice.ETC_MISS_SH) defer m.Cmdy(nfs.CAT, ice.ETC_MISS_SH)
@ -201,7 +201,7 @@ func init() {
_autogen_version(m) _autogen_version(m)
if m.Cmd(BINPACK, mdb.CREATE); nfs.ExistsFile(m, ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" { if m.Cmd(BINPACK, mdb.CREATE); nfs.ExistsFile(m, ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" {
m.Cmd(nfs.COPY, path.Join(ice.USR_RELEASE, "conf.go"), path.Join(ice.USR_ICEBERGS, "conf.go")) m.Cmd(nfs.COPY, path.Join(ice.USR_RELEASE, "conf.go"), path.Join(ice.USR_ICEBERGS, "conf.go"))
m.Cmd(cli.SYSTEM, "sh", "-c", `cat src/binpack.go|sed 's/package main/package ice/g' > usr/release/binpack.go`) cli.SystemCmds(m, `cat src/binpack.go|sed 's/package main/package ice/g' > usr/release/binpack.go`)
m.Cmdy(nfs.DIR, "usr/release/binpack.go") m.Cmdy(nfs.DIR, "usr/release/binpack.go")
m.Cmdy(nfs.DIR, "usr/release/conf.go") m.Cmdy(nfs.DIR, "usr/release/conf.go")
} }

View File

@ -42,8 +42,7 @@ func _bench_http(m *ice.Message, target string, arg ...string) {
n, _ := io.Copy(ioutil.Discard, res.Body) n, _ := io.Copy(ioutil.Discard, res.Body)
atomic.AddInt64(&ndata, n) atomic.AddInt64(&ndata, n)
}); m.Assert(e) { }); m.Assert(e) {
m.Echo("ndata: %s\n", kit.FmtSize(ndata)) m.Echo("ndata: %s\n", kit.FmtSize(ndata)).Echo(s.Show())
m.Echo(s.Show())
m.ProcessInner() m.ProcessInner()
} }
} }

View File

@ -16,21 +16,15 @@ import (
) )
func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { // file name func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { // file name
if f, e := nfs.OpenFile(m, arg[0]); e == nil { if f, e := nfs.OpenFile(m, arg[0]); !m.Warn(e, ice.ErrNotFound, arg[0]) {
defer f.Close() defer f.Close()
if b, _ := ioutil.ReadAll(f); len(b) > 0 { if b, _ := ioutil.ReadAll(f); len(b) > 0 {
fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b)) fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
return
} }
} }
fmt.Fprintf(w, " // \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), "")
} }
func _binpack_dir(m *ice.Message, w io.Writer, dir string) { func _binpack_dir(m *ice.Message, w io.Writer, dir string) {
m.Option(nfs.DIR_ROOT, dir) nfs.DirDeepAll(m, dir, nfs.PWD, func(value ice.Maps) {
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
m.Cmd(nfs.DIR, nfs.PWD).Sort(nfs.PATH).Tables(func(value ice.Maps) {
switch path.Base(value[nfs.PATH]) { switch path.Base(value[nfs.PATH]) {
case ice.GO_MOD, ice.GO_SUM, "binpack.go", "version.go": case ice.GO_MOD, ice.GO_SUM, "binpack.go", "version.go":
return return
@ -45,23 +39,16 @@ func _binpack_dir(m *ice.Message, w io.Writer, dir string) {
} }
func _binpack_can(m *ice.Message, w io.Writer, dir string) { func _binpack_can(m *ice.Message, w io.Writer, dir string) {
m.Option(nfs.DIR_ROOT, dir) for _, k := range []string{ice.FAVICON_ICO, ice.PROTO_JS, ice.FRAME_JS} {
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
for _, k := range []string{ice.FAVICON, ice.PROTO_JS, ice.FRAME_JS} {
_binpack_file(m, w, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k)) _binpack_file(m, w, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k))
} }
for _, k := range []string{LIB, PAGE, PANEL, PLUGIN, "publish/client/nodejs/"} { for _, k := range []string{LIB, PAGE, PANEL, PLUGIN, "publish/client/nodejs/"} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) { nfs.DirDeepAll(m, dir, k, func(value ice.Maps) {
_binpack_file(m, w, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH])) _binpack_file(m, w, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH]))
}) })
} }
fmt.Fprintln(w) fmt.Fprintln(w)
} }
func _binpack_ctx(m *ice.Message, w io.Writer) {
_binpack_dir(m, w, ice.SRC)
}
func _binpack_all(m *ice.Message) { func _binpack_all(m *ice.Message) {
nfs.OptionFiles(m, nfs.DiskFile) nfs.OptionFiles(m, nfs.DiskFile)
if w, p, e := nfs.CreateFile(m, ice.SRC_BINPACK_GO); m.Assert(e) { if w, p, e := nfs.CreateFile(m, ice.SRC_BINPACK_GO); m.Assert(e) {
@ -93,11 +80,13 @@ func init() {
fmt.Fprintln(w, ` pack := ice.Maps{`) fmt.Fprintln(w, ` pack := ice.Maps{`)
defer fmt.Fprintln(w, ` }`) defer fmt.Fprintln(w, ` }`)
if nfs.ExistsFile(m, ice.USR_VOLCANOS) && nfs.ExistsFile(m, ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" { if nfs.ExistsFile(m, ice.USR_VOLCANOS) && m.Option(ice.MSG_USERPOD) == "" {
_binpack_can(m, w, ice.USR_VOLCANOS) _binpack_can(m, w, ice.USR_VOLCANOS)
}
if nfs.ExistsFile(m, ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
_binpack_dir(m, w, ice.USR_INTSHELL) _binpack_dir(m, w, ice.USR_INTSHELL)
} }
_binpack_ctx(m, w) _binpack_dir(m, w, ice.SRC)
_binpack_file(m, w, ice.ETC_MISS_SH) _binpack_file(m, w, ice.ETC_MISS_SH)
_binpack_file(m, w, ice.ETC_INIT_SHY) _binpack_file(m, w, ice.ETC_INIT_SHY)
@ -154,6 +143,6 @@ func init() {
mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) { mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH)) mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
}}, }},
}, mdb.HashAction(mdb.SHORT, nfs.PATH))}, }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path"))},
}) })
} }

View File

@ -11,12 +11,10 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _c_show(m *ice.Message, arg ...string) { func _c_show(m *ice.Message, arg ...string) { TagsList(m) }
TagsList(m, "ctags", "--excmd=number", "--sort=no", "-f", "-", path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)))
}
func _c_exec(m *ice.Message, arg ...string) { func _c_exec(m *ice.Message, arg ...string) {
name := strings.TrimSuffix(arg[1], path.Ext(arg[1])) + ".bin" name := strings.TrimSuffix(arg[1], path.Ext(arg[1])) + ".bin"
if msg := m.Cmd(cli.SYSTEM, "gcc", arg[1], "-o", name, kit.Dict(cli.CMD_DIR, arg[2])); !cli.IsSuccess(msg) { if msg := m.Cmd(cli.SYSTEM, "gcc", "-o", name, arg[1], kit.Dict(cli.CMD_DIR, arg[2])); !cli.IsSuccess(msg) {
_vimer_make(m, arg[2], msg) _vimer_make(m, arg[2], msg)
return return
} }
@ -47,9 +45,8 @@ func init() {
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _c_exec(m, arg...) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _c_exec(m, arg...) }},
NAVIGATE: {Hand: func(m *ice.Message, arg ...string) { _c_tags(m, MAN, "ctags", "-a", "-R", nfs.PWD) }}, NAVIGATE: {Hand: func(m *ice.Message, arg ...string) { _c_tags(m, MAN, "ctags", "-a", "-R", nfs.PWD) }},
}, PlugAction(), LangAction())}, }, PlugAction(), LangAction())},
H: {Name: "c path auto", Help: "系统", Actions: ice.MergeActions(ice.Actions{ H: {Name: "h path auto", Help: "系统", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _c_show(m, arg...) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _c_show(m, arg...) }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _c_exec(m, arg...) }},
NAVIGATE: {Hand: func(m *ice.Message, arg ...string) { _c_tags(m, MAN, "ctags", "-a", "-R", nfs.PWD) }}, NAVIGATE: {Hand: func(m *ice.Message, arg ...string) { _c_tags(m, MAN, "ctags", "-a", "-R", nfs.PWD) }},
}, PlugAction(), LangAction())}, }, PlugAction(), LangAction())},
MAN: {Name: MAN, Help: "手册", Actions: ice.MergeActions(ice.Actions{ MAN: {Name: MAN, Help: "手册", Actions: ice.MergeActions(ice.Actions{
@ -59,7 +56,7 @@ func init() {
} }
key := kit.TrimExt(arg[1], arg[0]) key := kit.TrimExt(arg[1], arg[0])
m.Option(cli.CMD_ENV, "COLUMNS", kit.Int(kit.Select("1920", m.Option("width")))/12) m.Option(cli.CMD_ENV, "COLUMNS", kit.Int(kit.Select("1920", m.Option("width")))/12)
m.Cmdy(cli.SYSTEM, "sh", "-c", kit.Format("man %s %s|col -b", "", key)) m.Echo(cli.SystemCmds(m, "man %s %s|col -b", "", key))
}}, }},
}, PlugAction())}, }, PlugAction())},
}) })

View File

@ -21,7 +21,7 @@ var Index = &ice.Context{Name: CODE, Help: "编程中心", Commands: ice.Command
func init() { func init() {
web.Index.Register(Index, &web.Frame{}, web.Index.Register(Index, &web.Frame{},
INSTALL, WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH, UPGRADE, INSTALL, UPGRADE, WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH,
FAVOR, XTERM, INNER, VIMER, PPROF, BENCH, FAVOR, XTERM, INNER, VIMER, PPROF, BENCH,
C, SH, SHY, GO, JS, C, SH, SHY, GO, JS,
) )

View File

@ -2,16 +2,16 @@ chapter "源码"
code.go code.go
code.shy code.shy
section "开发流程" section "流程"
install.go install.go
upgrade.go
webpack.go webpack.go
binpack.go binpack.go
autogen.go autogen.go
compile.go compile.go
publish.go publish.go
upgrade.go
section "编程工具" section "工具"
favor.go favor.go
xterm.go xterm.go
xterm.shy xterm.shy
@ -22,12 +22,11 @@ bench.go
oauth.go oauth.go
case.go case.go
section "编程语言" section "语言"
c.go c.go
sh.go sh.go
py.go
shy.go shy.go
zml.go zml.go
py.go
go.go go.go
js.go js.go

View File

@ -13,13 +13,12 @@ import (
) )
func _compile_target(m *ice.Message, arg ...string) (string, string, string, string) { func _compile_target(m *ice.Message, arg ...string) (string, string, string, string) {
arch, goos := runtime.GOARCH, runtime.GOOS main, file, goos, arch := ice.SRC_MAIN_GO, "", runtime.GOOS, runtime.GOARCH
main, file := ice.SRC_MAIN_GO, ""
for _, k := range arg { for _, k := range arg {
switch k { switch k {
case cli.AMD64, cli.X86, cli.ARM, cli.ARM64, cli.MIPSLE: case cli.AMD64, cli.X86, cli.MIPSLE, cli.ARM, cli.ARM64:
arch = k arch = k
case cli.WINDOWS, cli.DARWIN, cli.LINUX: case cli.LINUX, cli.DARWIN, cli.WINDOWS:
goos = k goos = k
default: default:
if kit.Ext(k) == GO { if kit.Ext(k) == GO {
@ -30,7 +29,7 @@ func _compile_target(m *ice.Message, arg ...string) (string, string, string, str
} }
} }
if file == "" { if file == "" {
file = path.Join(m.Config(nfs.PATH), kit.Keys(kit.Select(ice.ICE, kit.TrimExt(main), main != ice.SRC_MAIN_GO), goos, arch)) file = path.Join(ice.USR_PUBLISH, kit.Keys(kit.Select(ice.ICE, kit.TrimExt(main), main != ice.SRC_MAIN_GO), goos, arch))
} }
return main, file, goos, arch return main, file, goos, arch
} }
@ -42,11 +41,9 @@ const COMPILE = "compile"
func init() { func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.Merge(&ice.Context{Configs: ice.Configs{
COMPILE: {Value: kit.Data(nfs.PATH, ice.USR_PUBLISH, COMPILE: {Value: kit.Data(cli.ENV, kit.Dict("GOPRIVATE", "shylinux.com,github.com", "GOPROXY", "https://goproxy.cn,direct", "CGO_ENABLED", "0"))},
cli.ENV, kit.Dict("GOPRIVATE", "shylinux.com,github.com", "GOPROXY", "https://goproxy.cn,direct", "CGO_ENABLED", "0"),
)},
}, Commands: ice.Commands{ }, Commands: ice.Commands{
COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack relay", Help: "编译", Actions: ice.Actions{ COMPILE: {Name: "compile arch=amd64,386,mipsle,arm,arm64 os=linux,darwin,windows src=src/main.go@key run binpack relay", Help: "编译", Actions: ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, ice.SRC, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go$`)).Sort(nfs.PATH) m.Cmdy(nfs.DIR, ice.SRC, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go$`)).Sort(nfs.PATH)
}}, }},
@ -57,7 +54,6 @@ func init() {
m.Cmdy(COMPILE, ice.SRC_RELAY_GO, path.Join(ice.USR_PUBLISH, RELAY)) m.Cmdy(COMPILE, ice.SRC_RELAY_GO, path.Join(ice.USR_PUBLISH, RELAY))
}}, }},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
// 下载依赖
_autogen_version(m.Spawn()) _autogen_version(m.Spawn())
// 执行编译 // 执行编译

View File

@ -14,12 +14,12 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
FAVOR: {Name: "favor zone id auto insert page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{ FAVOR: {Name: "favor zone id auto insert page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=数据结构 type=go name=hi text=hello path file line", Help: "添加"}, mdb.INSERT: {Name: "insert zone=数据结构 type=go name=hi text=hello path file line", Help: "添加"},
INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
ctx.Process(m, m.ActionKey(), m.OptionSplit(nfs.PATH, nfs.FILE, nfs.LINE), arg...)
}},
XTERM: {Name: "xterm", Help: "终端", Hand: func(m *ice.Message, arg ...string) { XTERM: {Name: "xterm", Help: "终端", Hand: func(m *ice.Message, arg ...string) {
ctx.Process(m, m.ActionKey(), m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT), arg...) ctx.Process(m, m.ActionKey(), m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT), arg...)
}}, }},
INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
ctx.Process(m, m.ActionKey(), m.OptionSplit(nfs.PATH, nfs.FILE, nfs.LINE), arg...)
}},
}, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) { }, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) {
if mdb.ZoneSelectPage(m, arg...); len(arg) > 0 && arg[0] != "" { if mdb.ZoneSelectPage(m, arg...); len(arg) > 0 && arg[0] != "" {
m.Tables(func(value ice.Maps) { m.Tables(func(value ice.Maps) {

View File

@ -12,6 +12,19 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _go_trans(m *ice.Message, key string) string {
switch key {
case "m", "msg":
key = "icebergs.Message"
case "kit":
key = "shylinux.com/x/toolkits"
case "ice":
key = "shylinux.com/x/ice"
case "mdb", "cli", "nfs":
key = "shylinux.com/x/icebergs/base/" + key
}
return key
}
func _go_complete(m *ice.Message, arg ...string) { func _go_complete(m *ice.Message, arg ...string) {
if m.Option(mdb.TEXT) == "" { if m.Option(mdb.TEXT) == "" {
m.Push(mdb.TEXT, "package", "import", "const", "type", "func", "var") m.Push(mdb.TEXT, "package", "import", "const", "type", "func", "var")
@ -20,16 +33,7 @@ func _go_complete(m *ice.Message, arg ...string) {
if strings.HasSuffix(m.Option(mdb.TEXT), ice.PT) { if strings.HasSuffix(m.Option(mdb.TEXT), ice.PT) {
key := kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t ."), -1)[0] key := kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t ."), -1)[0]
switch key { key = _go_trans(m, key)
case "m", "msg":
key = "icebergs.Message"
case "kit":
key = "shylinux.com/x/toolkits"
case "ice":
key = "shylinux.com/x/ice"
case "mdb", "cli", "nfs":
key = "shylinux.com/x/icebergs/base/" + key
}
msg := m.Cmd(cli.SYSTEM, GO, "doc", key) msg := m.Cmd(cli.SYSTEM, GO, "doc", key)
for _, l := range strings.Split(kit.Select(msg.Result(), msg.Append(cli.CMD_OUT)), ice.NL) { for _, l := range strings.Split(kit.Select(msg.Result(), msg.Append(cli.CMD_OUT)), ice.NL) {
@ -56,7 +60,7 @@ func _go_complete(m *ice.Message, arg ...string) {
} }
} }
func _go_exec(m *ice.Message, arg ...string) { func _go_exec(m *ice.Message, arg ...string) {
args := []string{"./bin/ice.bin"} args := []string{ice.ICE_BIN}
if cmd := ctx.GetFileCmd(path.Join(arg[2], arg[1])); cmd != "" { if cmd := ctx.GetFileCmd(path.Join(arg[2], arg[1])); cmd != "" {
args = append(args, cmd) args = append(args, cmd)
} }
@ -88,6 +92,7 @@ func _mod_show(m *ice.Message, file string) {
replace := ice.Maps{} replace := ice.Maps{}
m.Cmd(nfs.CAT, file, func(ls []string, line string) { m.Cmd(nfs.CAT, file, func(ls []string, line string) {
switch { switch {
case strings.HasPrefix(line, "//"):
case strings.HasPrefix(line, MODULE): case strings.HasPrefix(line, MODULE):
require[ls[1]] = m.Cmdx(cli.SYSTEM, GIT, "describe", "--tags") require[ls[1]] = m.Cmdx(cli.SYSTEM, GIT, "describe", "--tags")
replace[ls[1]] = nfs.PWD replace[ls[1]] = nfs.PWD
@ -154,10 +159,9 @@ func init() {
}, PlugAction(), LangAction())}, }, PlugAction(), LangAction())},
GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeActions(ice.Actions{ GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
arg[1] = strings.Replace(arg[1], "m.", "shylinux.com/x/ice.Message.", 1)
arg[1] = strings.Replace(arg[1], "kit.", "shylinux.com/x/toolkits.", 1) arg[1] = strings.Replace(arg[1], "kit.", "shylinux.com/x/toolkits.", 1)
m.Cmdy(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], ".godoc"), kit.Dict(cli.CMD_DIR, arg[2])) arg[1] = strings.Replace(arg[1], "m.", "shylinux.com/x/ice.Message.", 1)
if m.Append(cli.CMD_ERR) != "" { if m.Cmdy(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], ".godoc"), kit.Dict(cli.CMD_DIR, arg[2])); m.Append(cli.CMD_ERR) != "" {
m.Result(m.Append(cli.CMD_OUT)) m.Result(m.Append(cli.CMD_OUT))
} }
}}, }},

View File

@ -73,9 +73,9 @@ const (
FUNCTION = "function" FUNCTION = "function"
) )
const ( const (
SPLIT = lex.SPLIT
SPACE = "space" SPACE = "space"
OPERATE = "operate" OPERATE = "operate"
SPLIT = lex.SPLIT
PREFIX = lex.PREFIX PREFIX = lex.PREFIX
SUFFIX = lex.SUFFIX SUFFIX = lex.SUFFIX
) )
@ -173,17 +173,20 @@ func PlugAction() ice.Actions {
}}, }},
} }
} }
func LoadPlug(m *ice.Message, language ...string) { func LoadPlug(m *ice.Message, lang ...string) {
for _, language := range language { for _, lang := range lang {
m.Conf(nfs.CAT, kit.Keym(nfs.SOURCE, kit.Ext(language)), ice.TRUE) m.Conf(nfs.CAT, kit.Keym(nfs.SOURCE, kit.Ext(lang)), ice.TRUE)
m.Confm(language, kit.Keym(PLUG, PREPARE), func(key string, value ice.Any) { m.Confm(lang, kit.Keym(PLUG, PREPARE), func(key string, value ice.Any) {
for _, v := range kit.Simple(value) { for _, v := range kit.Simple(value) {
m.Conf(language, kit.Keym(PLUG, KEYWORD, v), key) m.Conf(lang, kit.Keym(PLUG, KEYWORD, v), key)
} }
}) })
} }
} }
func TagsList(m *ice.Message, cmds ...string) { func TagsList(m *ice.Message, cmds ...string) {
if len(cmds) == 0 {
cmds = []string{"ctags", "--excmd=number", "--sort=no", "-f", "-", path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE))}
}
for _, l := range strings.Split(m.Cmdx(cli.SYSTEM, cmds), ice.NL) { for _, l := range strings.Split(m.Cmdx(cli.SYSTEM, cmds), ice.NL) {
if strings.HasPrefix(l, "!_") { if strings.HasPrefix(l, "!_") {
continue continue

View File

@ -23,7 +23,7 @@ func _install_path(m *ice.Message, link string) string {
return p return p
} }
if p := path.Join(ice.USR_INSTALL, path.Base(link)); nfs.ExistsFile(m, p) { if p := path.Join(ice.USR_INSTALL, path.Base(link)); nfs.ExistsFile(m, p) {
return path.Join(ice.USR_INSTALL, strings.Split(m.Cmdx(cli.SYSTEM, "sh", "-c", kit.Format("tar tf %s| head -n1", p), ice.Option{cli.CMD_OUTPUT, ""}), ice.PS)[0]) return path.Join(ice.USR_INSTALL, strings.Split(cli.SystemCmds(m, "tar tf %s| head -n1", p), ice.PS)[0])
} }
m.Warn(true, ice.ErrNotFound, link) m.Warn(true, ice.ErrNotFound, link)
return "" return ""
@ -43,7 +43,7 @@ func _install_download(m *ice.Message) {
begin, last := time.Now(), time.Now() begin, last := time.Now(), time.Now()
mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link) mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
web.GoToast(m, name, func(toast func(string, int, int)) { web.GoToast(m, name, func(toast func(string, int, int)) {
m.Cmd("web.spide", ice.DEV, web.SPIDE_SAVE, file, web.SPIDE_GET, link, func(count int, total int, step int) { web.SpideSave(m, file, link, func(count int, total int, step int) {
mdb.HashSelectUpdate(m, name, func(value ice.Map) { value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step }) mdb.HashSelectUpdate(m, name, func(value ice.Map) { value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step })
if now := time.Now(); now.Sub(last) > 500*time.Millisecond { if now := time.Now(); now.Sub(last) > 500*time.Millisecond {
@ -57,8 +57,7 @@ func _install_download(m *ice.Message) {
m.Cmd(nfs.TAR, mdb.EXPORT, name, kit.Dict(cli.CMD_DIR, path.Dir(file))) m.Cmd(nfs.TAR, mdb.EXPORT, name, kit.Dict(cli.CMD_DIR, path.Dir(file)))
web.ToastSuccess(m) web.ToastSuccess(m)
}) })
m.Cmdy(nfs.DIR, file) m.Cmdy(nfs.DIR, file).SetResult()
m.SetResult()
} }
func _install_build(m *ice.Message, arg ...string) string { func _install_build(m *ice.Message, arg ...string) string {
p := m.Option(cli.CMD_DIR, _install_path(m, "")) p := m.Option(cli.CMD_DIR, _install_path(m, ""))
@ -72,14 +71,17 @@ func _install_build(m *ice.Message, arg ...string) string {
switch cb := m.Optionv(PREPARE).(type) { switch cb := m.Optionv(PREPARE).(type) {
case func(string): case func(string):
cb(p) cb(p)
default: case nil:
if msg := m.Cmd(cli.SYSTEM, "./configure", "--prefix="+pp, arg[1:]); !cli.IsSuccess(msg) { if msg := m.Cmd(cli.SYSTEM, "./configure", "--prefix="+pp, arg[1:]); !cli.IsSuccess(msg) {
return msg.Append(cli.CMD_ERR) return msg.Append(cli.CMD_ERR)
} }
default:
m.ErrorNotImplement(cb)
return m.Result()
} }
// 编译 // 编译
if msg := m.Cmd(cli.SYSTEM, cli.MAKE, "-j8"); !cli.IsSuccess(msg) { if msg := m.Cmd(cli.SYSTEM, cli.MAKE, "-j"+m.Cmdx(cli.RUNTIME, cli.MAXPROCS)); !cli.IsSuccess(msg) {
return msg.Append(cli.CMD_ERR) + msg.Append(cli.CMD_OUT) return msg.Append(cli.CMD_ERR) + msg.Append(cli.CMD_OUT)
} }
@ -92,7 +94,7 @@ func _install_build(m *ice.Message, arg ...string) string {
func _install_order(m *ice.Message, arg ...string) { func _install_order(m *ice.Message, arg ...string) {
p := _install_path(m, "") p := _install_path(m, "")
if m.Option(nfs.PATH) == "" { if m.Option(nfs.PATH) == "" {
for _, v := range []string{"_install/bin", "bin", ""} { for _, v := range []string{"_install/bin", "bin", "sbin", ""} {
if nfs.ExistsFile(m, path.Join(p, v)) { if nfs.ExistsFile(m, path.Join(p, v)) {
m.Option(nfs.PATH, v) m.Option(nfs.PATH, v)
break break
@ -137,6 +139,7 @@ func _install_start(m *ice.Message, arg ...string) {
case nil: case nil:
default: default:
m.ErrorNotImplement(cb) m.ErrorNotImplement(cb)
return
} }
bin := kit.Split(path.Base(arg[0]), "-.")[0] bin := kit.Split(path.Base(arg[0]), "-.")[0]

View File

@ -36,21 +36,13 @@ func _js_main_script(m *ice.Message, arg ...string) (res []string) {
} }
func _js_show(m *ice.Message, arg ...string) { func _js_show(m *ice.Message, arg ...string) {
key := ctx.GetFileCmd(kit.Replace(path.Join(arg[2], arg[1]), ".js", ".go"))
if key == "" {
for p, k := range ice.Info.File {
if strings.HasPrefix(p, path.Dir(path.Join(arg[2], arg[1]))) {
key = k
}
}
}
m.Display(path.Join("/require", path.Join(arg[2], arg[1]))) m.Display(path.Join("/require", path.Join(arg[2], arg[1])))
key := ctx.GetFileCmd(kit.Replace(path.Join(arg[2], arg[1]), ".js", ".go"))
ctx.ProcessCommand(m, kit.Select("can.code.inner._plugin", key), kit.Simple()) ctx.ProcessCommand(m, kit.Select("can.code.inner._plugin", key), kit.Simple())
} }
func _js_exec(m *ice.Message, arg ...string) { func _js_exec(m *ice.Message, arg ...string) {
args := kit.Simple("node", "-e", kit.Join(_js_main_script(m, arg...), ice.NL)) args := kit.Simple("node", "-e", kit.Join(_js_main_script(m, arg...), ice.NL))
m.Cmdy(cli.SYSTEM, args) m.Cmdy(cli.SYSTEM, args).StatusTime(ctx.ARGS, kit.Join(append([]string{ice.ICE_BIN, m.PrefixKey(), m.ActionKey()}, arg...), ice.SP))
m.StatusTime(ctx.ARGS, kit.Join([]string{"./bin/ice.bin", "web.code.js.js", "exec", path.Join(arg[2], arg[1])}, ice.SP))
} }
const JS = "js" const JS = "js"
@ -64,24 +56,17 @@ func init() {
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _js_show(m, arg...) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _js_show(m, arg...) }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _js_exec(m, arg...) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _js_exec(m, arg...) }},
TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_js_template) }},
m.Echo(`
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
msg.Echo("hello world")
msg.Dump(can)
}})
`)
}},
COMPLETE: {Hand: func(m *ice.Message, arg ...string) { COMPLETE: {Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 && arg[0] == mdb.FOREACH { if len(arg) > 0 && arg[0] == mdb.FOREACH { // 文件
switch m.Option(ctx.ACTION) { switch m.Option(ctx.ACTION) {
case nfs.SCRIPT: case nfs.SCRIPT:
m.Push(nfs.PATH, strings.ReplaceAll(arg[1], ice.PT+kit.Ext(arg[1]), ice.PT+JS)) m.Push(nfs.PATH, strings.ReplaceAll(arg[1], ice.PT+kit.Ext(arg[1]), ice.PT+JS))
m.Cmdy(nfs.DIR, nfs.PWD, kit.Dict(nfs.DIR_ROOT, "src/", nfs.DIR_REG, `.*\.(sh|shy|py|js)$`, nfs.DIR_DEEP, ice.TRUE), nfs.PATH) m.Option(nfs.DIR_REG, `.*\.(sh|py|shy|js)$`)
nfs.DirDeepAll(m, ice.SRC, nfs.PWD, nil).Cut(nfs.PATH)
} }
return
} } else if strings.HasSuffix(m.Option(mdb.TEXT), ice.PT) { // 方法
if strings.HasSuffix(m.Option(mdb.TEXT), ice.PT) {
key := kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t ."), -1)[0] key := kit.Slice(kit.Split(m.Option(mdb.TEXT), "\t ."), -1)[0]
switch key { switch key {
case "msg": case "msg":
@ -91,10 +76,17 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
default: default:
m.Cmdy("web.code.vim.tags", strings.TrimPrefix(m.Option(mdb.TYPE), "can.")).Cut("name,text") m.Cmdy("web.code.vim.tags", strings.TrimPrefix(m.Option(mdb.TYPE), "can.")).Cut("name,text")
} }
} else {
} else { // 类型
m.Cmdy("web.code.vim.tags").Cut(mdb.ZONE) m.Cmdy("web.code.vim.tags").Cut(mdb.ZONE)
} }
}}, }},
}, PlugAction(), LangAction())}, }, PlugAction(), LangAction())},
}) })
} }
var _js_template = `
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) {
msg.Echo("hello world").Dump(can)
}})
`

View File

@ -10,7 +10,6 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/tcp"
@ -35,15 +34,13 @@ func _publish_file(m *ice.Message, file string, arg ...string) string {
return target return target
} }
func _publish_list(m *ice.Message, arg ...string) { func _publish_list(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
m.Option(nfs.DIR_REG, kit.Select("", arg, 0)) m.Option(nfs.DIR_REG, kit.Select("", arg, 0))
m.Cmdy(nfs.DIR, nfs.PWD, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1)) nfs.DirDeepAll(m, ice.USR_PUBLISH, nfs.PWD, nil, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1))
} }
func _publish_bin_list(m *ice.Message, dir string) { func _publish_bin_list(m *ice.Message, dir string) {
p := m.Option(cli.CMD_DIR, dir) p := m.Option(cli.CMD_DIR, dir)
for _, ls := range strings.Split(strings.TrimSpace(m.Cmdx(cli.SYSTEM, "bash", "-c", "ls |xargs file |grep executable")), ice.NL) { for _, ls := range strings.Split(cli.SystemCmds(m, "ls |xargs file |grep executable"), ice.NL) {
if file := strings.TrimSpace(strings.Split(ls, ":")[0]); file != "" { if file := strings.TrimSpace(strings.Split(ls, ice.DF)[0]); file != "" {
if s, e := nfs.StatFile(m, path.Join(p, file)); e == nil { if s, e := nfs.StatFile(m, path.Join(p, file)); e == nil {
m.Push(mdb.TIME, s.ModTime()) m.Push(mdb.TIME, s.ModTime())
m.Push(nfs.SIZE, kit.FmtSize(s.Size())) m.Push(nfs.SIZE, kit.FmtSize(s.Size()))
@ -55,6 +52,37 @@ func _publish_bin_list(m *ice.Message, dir string) {
} }
m.SortTimeR(mdb.TIME) m.SortTimeR(mdb.TIME)
} }
func _publish_contexts(m *ice.Message, arg ...string) {
u := web.OptionUserWeb(m)
host := strings.Split(u.Host, ice.DF)[0]
if host == tcp.LOCALHOST {
host = m.Cmd(tcp.HOST).Append(aaa.IP)
}
m.Option(cli.CTX_ENV, kit.Select("", ice.SP+kit.JoinKV(ice.EQ, ice.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != ""))
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, host, kit.Select(kit.Select("443", "80", u.Scheme == ice.HTTP), strings.Split(u.Host, ice.DF), 1)))
if len(arg) == 0 {
arg = append(arg, ice.MISC)
}
for _, k := range arg {
switch k {
case INSTALL:
m.Echo(kit.Renders(`export ctx_dev={{.Option "httphost"}}{{.Option "ctx_env"}}; ctx_temp=$(mktemp); wget -O $ctx_temp -q $ctx_dev; source $ctx_temp app username {{.Option "user.name"}}`, m))
return
case ice.MISC:
_publish_file(m, ice.ICE_BIN)
case ice.BASE:
m.Option("remote", kit.Select(ice.Info.Make.Remote, cli.SystemExec(m, "git", "config", "remote.origin.url")))
m.Option("pathname", strings.TrimSuffix(path.Base(m.Option("remote")), ".git"))
}
if buf, err := kit.Render(m.Config(kit.Keys(ice.CONTEXTS, k)), m); m.Assert(err) {
m.EchoScript(strings.TrimSpace(string(buf)))
}
}
}
const ( const (
GIT = "git" GIT = "git"
@ -62,18 +90,14 @@ const (
const PUBLISH = "publish" const PUBLISH = "publish"
func init() { func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.Merge(&ice.Context{Commands: ice.Commands{
PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(ice.CONTEXTS, _contexts)},
}, Commands: ice.Commands{
PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.Actions{ PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, ice.USR_PUBLISH) m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, ice.USR_PUBLISH)
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey())
gdb.Watch(m, web.SERVE_START, m.PrefixKey())
m.Config(ice.CONTEXTS, _contexts) m.Config(ice.CONTEXTS, _contexts)
}}, }},
web.SERVE_START: {Name: "serve.start", Help: "服务启动", Hand: func(m *ice.Message, arg ...string) { web.SERVE_START: {Name: "serve.start", Help: "服务启动", Hand: func(m *ice.Message, arg ...string) {
// _publish_file(m, ice.ICE_BIN) _publish_file(m, ice.ICE_BIN)
}}, }},
ice.VOLCANOS: {Name: "volcanos", Help: "火山架", Hand: func(m *ice.Message, arg ...string) { ice.VOLCANOS: {Name: "volcanos", Help: "火山架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }() defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }()
@ -89,41 +113,7 @@ func init() {
_publish_list(m, `.*\.(sh|vim|conf)$`) _publish_list(m, `.*\.(sh|vim|conf)$`)
}}, }},
ice.CONTEXTS: {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) { ice.CONTEXTS: {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
u := web.OptionUserWeb(m) _publish_contexts(m, arg...)
host := strings.Split(u.Host, ice.DF)[0]
if host == tcp.LOCALHOST {
host = m.Cmd(tcp.HOST).Append(aaa.IP)
}
m.Option(cli.CTX_ENV, kit.Select("", " "+kit.JoinKV("=", " ", cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != ""))
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, host, kit.Select(kit.Select("443", "80", u.Scheme == ice.HTTP), strings.Split(u.Host, ice.DF), 1)))
if len(arg) == 0 {
arg = append(arg, ice.MISC)
}
for _, k := range arg {
switch k {
case INSTALL:
m.Echo(kit.Renders(`export ctx_dev={{.Option "httphost"}}{{.Option "ctx_env"}}; ctx_temp=$(mktemp); wget -O $ctx_temp -q $ctx_dev; source $ctx_temp app username {{.Option "user.name"}}`, m))
return
case ice.MISC:
if bin := path.Join(ice.USR_PUBLISH, kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)); !nfs.ExistsFile(m, bin) {
m.Cmd(nfs.LINK, bin, m.Cmdx(cli.RUNTIME, "boot.bin"))
}
case ice.CORE, ice.BASE:
if !nfs.ExistsFile(m, ".git") {
repos := web.MergeURL2(m, "/x/"+kit.Select(ice.Info.PathName, m.Option(ice.MSG_USERPOD)))
m.Cmd(cli.SYSTEM, "git", "init")
m.Cmd(cli.SYSTEM, "git", "remote", "add", "origin", repos)
m.Cmd("web.code.git.repos", mdb.CREATE, repos, "master", "", nfs.PWD)
}
m.Option("remote", kit.Select(ice.Info.Make.Remote, strings.TrimSpace(m.Cmdx(cli.SYSTEM, "git", "config", "remote.origin.url"))))
m.Option("pathname", strings.TrimSuffix(path.Base(m.Option("remote")), ".git"))
}
if buf, err := kit.Render(m.Config(kit.Keys(ice.CONTEXTS, k)), m); m.Assert(err) {
m.EchoScript(strings.TrimSpace(string(buf)))
}
}
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, kit.Select(nfs.PWD, arg, 1)).ProcessAgain() m.Cmdy(nfs.DIR, kit.Select(nfs.PWD, arg, 1)).ProcessAgain()
@ -134,35 +124,11 @@ func init() {
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) { nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.TRASH, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH))) m.Cmd(nfs.TRASH, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH)))
}}, }},
mdb.EXPORT: {Name: "export", Help: "工具链", Hand: func(m *ice.Message, arg ...string) {
var list = []string{ice.ETC_PATH}
m.Cmd(nfs.CAT, ice.ETC_PATH, func(text string) {
if strings.HasPrefix(text, ice.USR_PUBLISH) {
return
}
if strings.HasPrefix(text, ice.BIN) {
return
}
if strings.HasPrefix(text, ice.PS) {
return
}
list = append(list, text)
})
web.PushStream(m)
defer m.ProcessHold()
defer m.StatusTimeCount()
defer web.ToastSuccess(m)
m.Cmd(nfs.TAR, kit.Path(ice.USR_PUBLISH, "contexts.bin.tar.gz"), list)
m.Cmd(nfs.TAR, kit.Path(ice.USR_PUBLISH, "contexts.src.tar.gz"), ice.MAKEFILE, ice.ETC_MISS_SH, ice.SRC_MAIN_GO, ice.GO_MOD, ice.GO_SUM)
m.Cmd(nfs.TAR, kit.Path(ice.USR_PUBLISH, "contexts.home.tar.gz"), ".vim/plugged", kit.Dict(nfs.DIR_ROOT, kit.Env(cli.HOME)))
m.Cmd("web.code.git.server", mdb.IMPORT)
}},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH) m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
m.Cmdy(nfs.DIR, kit.Select("", arg, 0), nfs.DIR_WEB_FIELDS) m.Cmdy(nfs.DIR, kit.Select("", arg, 0), nfs.DIR_WEB_FIELDS)
}}, }},
}}) }, Configs: ice.Configs{PUBLISH: {Value: kit.Data(ice.CONTEXTS, _contexts)}}})
} }
var _contexts = kit.Dict( var _contexts = kit.Dict(

View File

@ -30,22 +30,12 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{ PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Go(func() { cli.IsAlpine(m, "python", "python2")
m.Sleep300ms() cli.IsAlpine(m, "python2")
cli.IsAlpine(m, "python", "python2") cli.IsAlpine(m, "python3")
cli.IsAlpine(m, "python2")
cli.IsAlpine(m, "python3")
})
}},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
// _py_exec(m, arg...)
}},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
_py_exec(m, arg...)
}},
TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(`print "hello world"`)
}}, }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _py_exec(m, arg...) }},
TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { m.Echo(`print "hello world"`) }},
}, PlugAction(), LangAction())}, }, PlugAction(), LangAction())},
}) })
} }

View File

@ -7,29 +7,31 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/ssh"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
const SHY = "shy" const SHY = "shy"
func init() { func init() {
const WEB_WIKI_WORD = "web.wiki.word"
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{ SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessCommand(m, "web.wiki.word", kit.Simple(path.Join(arg[2], arg[1]))) ctx.ProcessCommand(m, WEB_WIKI_WORD, kit.Simple(path.Join(arg[2], arg[1])))
}}, }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("source", path.Join(arg[2], arg[1])) m.Cmdy(ssh.SOURCE, path.Join(arg[2], arg[1]))
}}, }},
TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { TEMPLATE: {Hand: func(m *ice.Message, arg ...string) {
m.Echo(`chapter "hi"`) m.Echo(`chapter "hi"`)
}}, }},
}, PlugAction(), LangAction()), Hand: func(m *ice.Message, arg ...string) { }, PlugAction(), LangAction()), Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 && kit.Ext(arg[0]) == m.CommandKey() { if len(arg) > 0 && kit.Ext(arg[0]) == m.CommandKey() {
m.Cmdy("web.wiki.word", path.Join(ice.SRC, strings.TrimPrefix(arg[0], "src/"))) m.Cmdy(WEB_WIKI_WORD, path.Join(ice.SRC, strings.TrimPrefix(arg[0], "src/")))
return } else {
m.Cmdy(WEB_WIKI_WORD, arg)
} }
m.Cmdy("web.wiki.word", arg)
}}, }},
}) })
} }

View File

@ -18,17 +18,17 @@ const UPGRADE = "upgrade"
func init() { func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.Merge(&ice.Context{Configs: ice.Configs{
UPGRADE: {Name: UPGRADE, Help: "升级", Value: kit.Dict(mdb.HASH, kit.Dict( UPGRADE: {Name: UPGRADE, Help: "升级", Value: kit.Dict(mdb.HASH, kit.Dict(
nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, "ice.bin")), nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, ice.ICE_BIN)),
nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")),
nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")), nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")),
nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")),
))}, ))},
}, Commands: ice.Commands{ }, Commands: ice.Commands{
UPGRADE: {Name: "upgrade item=target,source,binary run restart", Help: "升级", Actions: ice.Actions{ UPGRADE: {Name: "upgrade item=target,binary,source run restart", Help: "升级", Actions: ice.Actions{
cli.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) { cli.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) }) m.Go(func() { m.Sleep300ms(ice.EXIT, 1) })
}}, }},
}, Hand: func(m *ice.Message, arg ...string) { }, Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelect(m, kit.Select(cli.SYSTEM, arg, 0)).Tables(func(value ice.Maps) { mdb.ZoneSelect(m, kit.Select(nfs.TARGET, arg, 0)).Tables(func(value ice.Maps) {
if value[nfs.FILE] == ice.ICE_BIN { // 程序文件 if value[nfs.FILE] == ice.ICE_BIN { // 程序文件
value[nfs.FILE] = kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH) value[nfs.FILE] = kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)
defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN) defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN)
@ -37,7 +37,7 @@ func init() {
// 下载文件 // 下载文件
dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH]) dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH])
m.Cmd(web.SPIDE, ice.DEV, web.SPIDE_SAVE, dir, web.SPIDE_GET, "/publish/"+kit.Format(value[nfs.FILE])) web.SpideSave(m, dir, "/publish/"+kit.Format(value[nfs.FILE]), nil)
switch value[mdb.TYPE] { switch value[mdb.TYPE] {
case ice.BIN: case ice.BIN:
os.Chmod(dir, 0755) os.Chmod(dir, 0755)
@ -46,7 +46,7 @@ func init() {
} }
}) })
if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE { if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE {
m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) }) m.Cmd("", cli.RESTART)
web.ToastRestart(m) web.ToastRestart(m)
} }
}}, }},

View File

@ -45,8 +45,7 @@ func init() {
default: default:
switch arg[0] { switch arg[0] {
case ctx.INDEX: case ctx.INDEX:
m.OptionFields(ctx.INDEX) m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX))
m.Cmdy(ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, kit.Select("", arg, 1), "")
default: default:
m.Cmdy(COMPLETE, mdb.FOREACH, arg[1], m.Option(ctx.ACTION)) m.Cmdy(COMPLETE, mdb.FOREACH, arg[1], m.Option(ctx.ACTION))
} }

View File

@ -60,12 +60,8 @@ func _webpack_cache(m *ice.Message, dir string, write bool) {
return return
} }
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
for _, k := range []string{LIB, PANEL, PLUGIN} { for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) { nfs.DirDeepAll(m, dir, k, func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == CSS { if kit.Ext(value[nfs.PATH]) == CSS {
_webpack_css(m, css, js, value[nfs.PATH]) _webpack_css(m, css, js, value[nfs.PATH])
} }
@ -74,7 +70,7 @@ func _webpack_cache(m *ice.Message, dir string, write bool) {
fmt.Fprintln(js) fmt.Fprintln(js)
for _, k := range []string{LIB, PANEL, PLUGIN} { for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) { nfs.DirDeepAll(m, dir, k, func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == JS { if kit.Ext(value[nfs.PATH]) == JS {
_webpack_js(m, js, value[nfs.PATH]) _webpack_js(m, js, value[nfs.PATH])
} }
@ -94,7 +90,7 @@ func _webpack_cache(m *ice.Message, dir string, write bool) {
return return
case nfs.JS: case nfs.JS:
default: default:
p = p + "/lib/" + p + ".js" p = path.Join(p, LIB, p+".js")
} }
_webpack_node(m, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, p)) _webpack_node(m, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, p))
}) })
@ -125,11 +121,9 @@ func _webpack_build(m *ice.Message, file string) {
<script>%s</script> <script>%s</script>
</body> </body>
`, `,
m.Cmdx(nfs.CAT, _volcanos(m, PAGE_INDEX_CSS)), m.Cmdx(nfs.CAT, _volcanos(m, PAGE_INDEX_CSS)), m.Cmdx(nfs.CAT, _volcanos(m, PAGE_CACHE_CSS)),
m.Cmdx(nfs.CAT, _volcanos(m, PAGE_CACHE_CSS)),
m.Cmdx(nfs.CAT, _volcanos(m, ice.PROTO_JS)), m.Cmdx(nfs.CAT, kit.Keys(file, JS)), m.Cmdx(nfs.CAT, _volcanos(m, ice.PROTO_JS)), m.Cmdx(nfs.CAT, kit.Keys(file, JS)),
m.Cmdx(nfs.CAT, _volcanos(m, PAGE_CACHE_JS)), m.Cmdx(nfs.CAT, _volcanos(m, PAGE_CACHE_JS)), m.Cmdx(nfs.CAT, _volcanos(m, PAGE_INDEX_JS)),
m.Cmdx(nfs.CAT, _volcanos(m, PAGE_INDEX_JS)),
) )
} }
} }
@ -174,8 +168,8 @@ func init() {
} }
}}, }},
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT) m.Option(nfs.DIR_TYPE, nfs.CAT)
m.Option(nfs.DIR_DEEP, ice.TRUE)
m.OptionFields(nfs.DIR_WEB_FIELDS) m.OptionFields(nfs.DIR_WEB_FIELDS)
m.Cmdy(nfs.DIR, _volcanos(m, PAGE)) m.Cmdy(nfs.DIR, _volcanos(m, PAGE))
m.Cmdy(nfs.DIR, _publish(m, WEBPACK)) m.Cmdy(nfs.DIR, _publish(m, WEBPACK))

View File

@ -108,9 +108,9 @@ func init() {
m.PushAction(web.WEBSITE, mdb.REMOVE) m.PushAction(web.WEBSITE, mdb.REMOVE)
m.Action(mdb.CREATE, mdb.PRUNES) m.Action(mdb.CREATE, mdb.PRUNES)
} else { } else {
ctx.Toolkit(m, FAVOR, "web.chat.iframe")
m.Action(INSTALL, "波浪线", "反引号") m.Action(INSTALL, "波浪线", "反引号")
ctx.DisplayLocal(m, "") ctx.DisplayLocal(m, "")
ctx.Toolkit(m, FAVOR, "web.chat.iframe")
} }
}}, }},
}) })

View File

@ -87,7 +87,7 @@ func init() {
m.Push(mdb.NAME, "open") m.Push(mdb.NAME, "open")
default: default:
if strings.HasSuffix(m.Option(mdb.TEXT), " ") { if strings.HasSuffix(m.Option(mdb.TEXT), ice.SP) {
m.Push(mdb.NAME, "index") m.Push(mdb.NAME, "index")
m.Push(mdb.NAME, "action") m.Push(mdb.NAME, "action")
m.Push(mdb.NAME, "args") m.Push(mdb.NAME, "args")

View File

@ -8,7 +8,7 @@ import (
) )
func _shell_show(m *ice.Message, name, text string, arg ...string) { func _shell_show(m *ice.Message, name, text string, arg ...string) {
m.Option(OUTPUT, m.Cmdx(cli.SYSTEM, "sh", "-c", m.Option(INPUT, text))) m.Option(OUTPUT, cli.SystemCmds(m, m.Option(INPUT, text)))
_wiki_template(m, SHELL, name, text, arg...) _wiki_template(m, SHELL, name, text, arg...)
} }

View File

@ -28,7 +28,8 @@ func (f *Frame) Begin(m *Message, arg ...string) Server {
} }
func (f *Frame) Start(m *Message, arg ...string) bool { func (f *Frame) Start(m *Message, arg ...string) bool {
m.Cap(CTX_STREAM, strings.Split(m.Time(), SP)[1]) m.Cap(CTX_STREAM, strings.Split(m.Time(), SP)[1])
m.Cmdy(kit.Keys(MDB, CTX_INIT)) m.Cmd(kit.Keys(MDB, CTX_INIT))
m.Cmd("cli.runtime", CTX_INIT)
m.Cmdy(INIT, arg) m.Cmdy(INIT, arg)
for _, k := range kit.Split(kit.Select("ctx,log,gdb,ssh", os.Getenv(CTX_DAEMON))) { for _, k := range kit.Split(kit.Select("ctx,log,gdb,ssh", os.Getenv(CTX_DAEMON))) {

View File

@ -242,7 +242,9 @@ func (m *Message) Length() (max int) {
func (m *Message) Tables(cbs ...func(value Maps)) *Message { func (m *Message) Tables(cbs ...func(value Maps)) *Message {
return m.Table(func(index int, value Maps, head []string) { return m.Table(func(index int, value Maps, head []string) {
for _, cb := range cbs { for _, cb := range cbs {
cb(value) if cb != nil {
cb(value)
}
} }
}) })
} }

View File

@ -49,12 +49,9 @@ func init() {
m.Conf(REPOS, mdb.HASH, "") m.Conf(REPOS, mdb.HASH, "")
_repos_insert(m, path.Base(kit.Pwd()), kit.Pwd()) _repos_insert(m, path.Base(kit.Pwd()), kit.Pwd())
m.Cmd(nfs.DIR, ice.USR, "name,path", func(value ice.Maps) { _repos_insert(m, value[mdb.NAME], value[nfs.PATH]) }) m.Cmd(nfs.DIR, ice.USR, "name,path", func(value ice.Maps) { _repos_insert(m, value[mdb.NAME], value[nfs.PATH]) })
m.Go(func() { cli.IsAlpine(m, GIT)
m.Sleep300ms() cli.IsCentos(m, GIT)
cli.IsAlpine(m, GIT) cli.IsUbuntu(m, GIT)
cli.IsCentos(m, GIT)
cli.IsUbuntu(m, GIT)
})
m.Config(REPOS, "https://shylinux.com/x") m.Config(REPOS, "https://shylinux.com/x")
}}, }},
mdb.CREATE: {Name: "create repos branch name path", Help: "添加", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create repos branch name path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {

View File

@ -23,16 +23,13 @@ type compile struct {
} }
func (s compile) Init(m *ice.Message) { func (s compile) Init(m *ice.Message) {
m.Go(func() { cli.IsAlpine(m.Message, JAVA, "openjdk8")
m.Sleep300ms() // after runtime init cli.IsAlpine(m.Message, JAVAC, "openjdk8")
cli.IsAlpine(m.Message, JAVA, "openjdk8") cli.IsAlpine(m.Message, MVN, "maven openjdk8")
cli.IsAlpine(m.Message, JAVAC, "openjdk8")
cli.IsAlpine(m.Message, MVN, "maven openjdk8")
cli.IsCentos(m.Message, JAVA, "java-1.8.0-openjdk-devel.x86_64") cli.IsCentos(m.Message, JAVA, "java-1.8.0-openjdk-devel.x86_64")
cli.IsCentos(m.Message, JAVAC, "java-1.8.0-openjdk-devel.x86_64") cli.IsCentos(m.Message, JAVAC, "java-1.8.0-openjdk-devel.x86_64")
cli.IsCentos(m.Message, MVN, "maven java-1.8.0-openjdk-devel.x86_64") cli.IsCentos(m.Message, MVN, "maven java-1.8.0-openjdk-devel.x86_64")
})
} }
func (s compile) Order(m *ice.Message) { func (s compile) Order(m *ice.Message) {
s.Code.Order(m, "", ice.BIN) s.Code.Order(m, "", ice.BIN)

View File

@ -20,11 +20,8 @@ type compile struct {
} }
func (s compile) Init(m *ice.Message) { func (s compile) Init(m *ice.Message) {
m.Go(func() { cli.IsAlpine(m.Message, NPM)
m.Sleep300ms() // after runtime init cli.IsAlpine(m.Message, NODE, "nodejs")
cli.IsAlpine(m.Message, NPM)
cli.IsAlpine(m.Message, NODE, "nodejs")
})
} }
func (s compile) List(m *ice.Message, arg ...string) { func (s compile) List(m *ice.Message, arg ...string) {
s.Code.Source(m, "", arg...) s.Code.Source(m, "", arg...)