1
0
mirror of https://shylinux.com/x/icebergs synced 2025-05-05 12:47:03 +08:00

opt sh.go

This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-03-04 16:46:44 +08:00
parent b15547d281
commit e460316ede
12 changed files with 93 additions and 26 deletions

View File

@ -195,6 +195,15 @@ func init() {
}) })
} }
func SplitPath(m *ice.Message, p string) []string {
if ls := kit.Split(p, ice.PS); len(ls) == 1 {
return []string{PWD, ls[0]}
} else if ls[0] == ice.USR {
return []string{strings.Join(ls[:2], ice.PS) + ice.PS, strings.Join(ls[2:], ice.PS)}
} else {
return []string{strings.Join(ls[:1], ice.PS) + ice.PS, strings.Join(ls[1:], ice.PS)}
}
}
func Dir(m *ice.Message, sort string) *ice.Message { func Dir(m *ice.Message, sort string) *ice.Message {
m.Copy(m.Cmd(DIR, PWD, kit.Dict(DIR_TYPE, TYPE_DIR)).Sort(sort)) m.Copy(m.Cmd(DIR, PWD, kit.Dict(DIR_TYPE, TYPE_DIR)).Sort(sort))
m.Copy(m.Cmd(DIR, PWD, kit.Dict(DIR_TYPE, TYPE_CAT)).Sort(sort)) m.Copy(m.Cmd(DIR, PWD, kit.Dict(DIR_TYPE, TYPE_CAT)).Sort(sort))

View File

@ -206,6 +206,7 @@ func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server
const ( const (
MESSAGE = "message" MESSAGE = "message"
SHELL = "shell"
FRAME = "frame" FRAME = "frame"
STDIO = "stdio" STDIO = "stdio"
PS1 = "PS1" PS1 = "PS1"

View File

@ -26,6 +26,7 @@ const (
CODE_VIMER = "web.code.vimer" CODE_VIMER = "web.code.vimer"
CODE_INNER = "web.code.inner" CODE_INNER = "web.code.inner"
CODE_XTERM = "web.code.xterm"
WIKI_WORD = "web.wiki.word" WIKI_WORD = "web.wiki.word"
) )
@ -45,8 +46,6 @@ func Render(m *ice.Message, cmd string, args ...ice.Any) bool {
RenderCookie(m, arg[0], arg[1:]...) RenderCookie(m, arg[0], arg[1:]...)
case STATUS, ice.RENDER_STATUS: // [code [text]] case STATUS, ice.RENDER_STATUS: // [code [text]]
m.Debug("what %v", m.FormatStack(1, 10))
m.Debug("what %v", arg)
RenderStatus(m.W, kit.Int(kit.Select("200", arg, 0)), strings.Join(kit.Slice(arg, 1), " ")) RenderStatus(m.W, kit.Int(kit.Select("200", arg, 0)), strings.Join(kit.Slice(arg, 1), " "))
case ice.RENDER_REDIRECT: // url [arg...] case ice.RENDER_REDIRECT: // url [arg...]

View File

@ -255,6 +255,14 @@ func init() {
m.RenderRedirect("/") m.RenderRedirect("/")
}}, }},
PP(ice.REQUIRE): {Name: "/require/shylinux.com/x/volcanos/proto.js", Help: "代码库", Hand: func(m *ice.Message, arg ...string) { PP(ice.REQUIRE): {Name: "/require/shylinux.com/x/volcanos/proto.js", Help: "代码库", Hand: func(m *ice.Message, arg ...string) {
if len(arg) < 4 {
m.RenderStatusBadRequest()
return
}
if path.Join(arg[:3]...) == ice.Info.Make.Module && nfs.ExistsFile(m, path.Join(arg[3:]...)) {
m.RenderDownload(path.Join(arg[3:]...))
return
}
cache := kit.Select(ice.USR_REQUIRE, m.Cmdx(cli.SYSTEM, "go", "env", "GOMODCACHE")) cache := kit.Select(ice.USR_REQUIRE, m.Cmdx(cli.SYSTEM, "go", "env", "GOMODCACHE"))
p := path.Join(cache, path.Join(arg...)) p := path.Join(cache, path.Join(arg...))
if !nfs.ExistsFile(m, p) { if !nfs.ExistsFile(m, p) {

View File

@ -51,6 +51,10 @@ func init() {
if len(arg[0]) == 0 || arg[0] == "" { if len(arg[0]) == 0 || arg[0] == "" {
return return
} }
if m.IsCliUA() {
m.Cmdy(arg, m.Optionv(ice.ARG)).RenderResult()
return
}
if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 { if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 {
web.RenderCmd(m, arg[0], arg[1:]) web.RenderCmd(m, arg[0], arg[1:])
} }

View File

@ -9,6 +9,7 @@ import (
"shylinux.com/x/icebergs/base/gdb" "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/ssh"
"shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
@ -37,7 +38,7 @@ func init() {
mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] { switch mdb.HashInputs(m, arg); arg[0] {
case mdb.TYPE: case mdb.TYPE:
m.Push(arg[0], mdb.TEXT, ctx.INDEX) m.Push(arg[0], web.LINK, nfs.FILE, mdb.TEXT, ctx.INDEX, ssh.SHELL)
case mdb.NAME: case mdb.NAME:
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {
case ctx.INDEX: case ctx.INDEX:
@ -81,7 +82,18 @@ func init() {
}}, }},
ctx.INDEX: {Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.INDEX: {Help: "命令", Hand: func(m *ice.Message, arg ...string) {
msg := mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)) msg := mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH))
ctx.ProcessField(m, msg.Append(mdb.NAME), kit.Simple(kit.UnMarshal(msg.Option(mdb.TEXT))), arg...) ls := kit.Split(msg.Option(mdb.TEXT))
ctx.ProcessField(m, ls[0], ls[1:], arg...)
}},
"vimer": {Help: "源码", Hand: func(m *ice.Message, arg ...string) {
args := []string{}
if len(arg) == 0 || arg[0] != ice.RUN {
args = nfs.SplitPath(m, m.Option(mdb.TEXT))
}
ctx.ProcessField(m, web.CODE_VIMER, args, arg...)
}},
"xterm": {Help: "命令", Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessField(m, web.CODE_XTERM, []string{m.Option(mdb.TEXT)}, arg...)
}}, }},
ice.RUN: {Hand: func(m *ice.Message, arg ...string) { ice.RUN: {Hand: func(m *ice.Message, arg ...string) {
m.Option(mdb.TYPE, mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)).Append(mdb.TYPE)) m.Option(mdb.TYPE, mdb.HashSelects(m.Spawn(), m.Option(mdb.HASH)).Append(mdb.TYPE))
@ -113,8 +125,12 @@ func init() {
return return
} }
switch value[mdb.TYPE] { switch value[mdb.TYPE] {
case ssh.SHELL:
m.PushButton("xterm", mdb.REMOVE)
case ctx.INDEX: case ctx.INDEX:
m.PushButton(ctx.INDEX, mdb.REMOVE) m.PushButton(ctx.INDEX, mdb.REMOVE)
case nfs.FILE:
m.PushButton("vimer", mdb.REMOVE)
default: default:
if strings.HasPrefix(value[mdb.TEXT], ice.VAR_FILE) { if strings.HasPrefix(value[mdb.TEXT], ice.VAR_FILE) {
if _favor_is_image(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_video(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_audio(m, value[mdb.NAME], value[mdb.TYPE]) { if _favor_is_image(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_video(m, value[mdb.NAME], value[mdb.TYPE]) || _favor_is_audio(m, value[mdb.NAME], value[mdb.TYPE]) {

View File

@ -32,7 +32,7 @@ func init() {
FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) { FAVOR_TABLES: {Hand: func(m *ice.Message, arg ...string) {
switch arg[1] { switch arg[1] {
case web.LINK: case web.LINK:
m.PushButton(IFRAME, web.OPEN, mdb.REMOVE) m.PushButton(IFRAME, mdb.REMOVE)
} }
}}, }},
FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) { FAVOR_ACTION: {Hand: func(m *ice.Message, arg ...string) {

View File

@ -19,7 +19,7 @@ import (
func _inner_list(m *ice.Message, ext, file, dir string) { func _inner_list(m *ice.Message, ext, file, dir string) {
kit.If(aaa.Right(m, dir, file), func() { kit.If(aaa.Right(m, dir, file), func() {
kit.If(nfs.IsSourceFile(m, ext), func() { m.Cmdy(nfs.CAT, path.Join(dir, file)) }) kit.If(nfs.IsSourceFile(m, ext), func() { m.Cmdy(nfs.CAT, path.Join(dir, file)) })
kit.If(m.IsErrNotFound(), func() { _inner_show(m.RenderResult().SetResult(), ext, file, dir) }) // kit.If(m.IsErrNotFound(), func() { _inner_show(m.RenderResult().SetResult(), ext, file, dir) })
}) })
} }
func _inner_show(m *ice.Message, ext, file, dir string) { func _inner_show(m *ice.Message, ext, file, dir string) {
@ -124,7 +124,7 @@ func init() {
} }
arg[1] = strings.Split(arg[1], ice.FS)[0] arg[1] = strings.Split(arg[1], ice.FS)[0]
_inner_list(m, kit.Ext(arg[1]), arg[1], arg[0]) _inner_list(m, kit.Ext(arg[1]), arg[1], arg[0])
m.Cmd(FAVOR, mdb.INSERT, mdb.ZONE, "_recent_file", nfs.PATH, arg[0], nfs.FILE, arg[1]) // m.Cmd(FAVOR, mdb.INSERT, mdb.ZONE, "_recent_file", nfs.PATH, arg[0], nfs.FILE, arg[1])
m.Option(nfs.REPOS, kit.Join(m.Cmd("web.code.git.repos", ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Appendv(nfs.PATH))) m.Option(nfs.REPOS, kit.Join(m.Cmd("web.code.git.repos", ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Appendv(nfs.PATH)))
ctx.DisplayLocal(m, "") ctx.DisplayLocal(m, "")
}}, }},

View File

@ -8,13 +8,16 @@ import (
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"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/ssh"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _sh_exec(m *ice.Message, arg ...string) { func _sh_cmds(m *ice.Message, arg ...string) (string, string) {
m.Cmdy(cli.SYSTEM, SH, "-c", kit.Format(_sh_template, m.Option(ice.MSG_USERHOST), m.Option(ice.MSG_USERPOD), path.Join(arg[2], arg[1]))) cmds, text := kit.Select(SH, m.Config(ssh.SHELL)), kit.Format(strings.TrimSpace(_sh_cmd_template), m.Option(ice.MSG_USERHOST), m.Option(ice.MSG_USERPOD), path.Join(arg[2], arg[1]))
m.StatusTime("script", kit.Renders(kit.Format(`export ctx_dev={{.Option "user.host"}}%s; temp=$(mktemp); wget -O $temp -q $ctx_dev; source $temp %s`, if head := kit.Select("", strings.Split(m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1])), ice.NL), 0); strings.HasPrefix(head, "#!") {
kit.Select("", " ctx_pod="+m.Option(ice.MSG_USERPOD), m.Option(ice.MSG_USERPOD) != ""), path.Join(arg[2], arg[1])), m)) cmds = strings.TrimSpace(strings.TrimPrefix(head, "#!"))
}
return cmds, text
} }
const SH = nfs.SH const SH = nfs.SH
@ -23,21 +26,25 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeActions(ice.Actions{ SH: {Name: "sh 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) {
cmds, text := SH, kit.Format(_sh_template, m.Option(ice.MSG_USERHOST), m.Option(ice.MSG_USERPOD), path.Join(arg[2], arg[1])) cmds, text := _sh_cmds(m, arg...)
if strings.HasPrefix(text, "#!") { _xterm_show(m, cmds, text, path.Join(arg[2], arg[1]))
// cmds = strings.TrimSpace(strings.SplitN(text, ice.NL, 2)[0][2:])
}
_xterm_show(m, cmds, text)
}}, }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
_sh_exec(m, arg...) cmds, text := _sh_cmds(m, arg...)
m.Cmdy(cli.SYSTEM, cmds, "-c", text).Status(ssh.SHELL, strings.ReplaceAll(text, ice.NL, "; "))
}}, }},
TEMPLATE: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_sh_template) }},
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())}, }, PlugAction())},
}) })
} }
var _sh_template = `#!/bin/sh var _sh_template = `#!/bin/sh
export ctx_dev=%s ctx_pod=%s ctx_mod=%s
demo() {
echo "hello world"
}
`
var _sh_cmd_template = `export ctx_dev=%s ctx_pod=%s ctx_mod=%s
temp=$(mktemp); if curl -V &>/dev/null; then curl -o $temp -fsSL $ctx_dev; else wget -O $temp -q $ctx_dev; fi && source $temp $ctx_mod temp=$(mktemp); if curl -V &>/dev/null; then curl -o $temp -fsSL $ctx_dev; else wget -O $temp -q $ctx_dev; fi && source $temp $ctx_mod
` `

View File

@ -55,7 +55,17 @@ func init() {
switch m.Option(ctx.ACTION) { switch m.Option(ctx.ACTION) {
case web.DREAM, AUTOGEN, XTERM: case web.DREAM, AUTOGEN, XTERM:
m.Cmdy(m.Option(ctx.ACTION), mdb.INPUTS, arg) m.Cmdy(m.Option(ctx.ACTION), mdb.INPUTS, arg)
case web.WEBSITE, nfs.SCRIPT: case nfs.MODULE:
m.Cmdy(AUTOGEN, mdb.INPUTS, arg)
case nfs.SCRIPT:
// p := path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE))
p := path.Join(m.Option(nfs.FILE))
for _, ext := range []string{"sh", "shy", "py", "js"} {
m.Push(nfs.PATH, kit.ExtChange(p, ext))
}
m.Option(nfs.DIR_REG, kit.FileReg("(sh|shy|py|js)"))
nfs.DirDeepAll(m, "src/", "./", nil, nfs.PATH)
case web.WEBSITE:
m.Cmdy(COMPLETE, mdb.FOREACH, kit.Select("", arg, 1), m.Option(ctx.ACTION)) m.Cmdy(COMPLETE, mdb.FOREACH, kit.Select("", arg, 1), m.Option(ctx.ACTION))
case "extension": case "extension":
nfs.DirDeepAll(m, "usr/volcanos/plugin/local/code/", "inner/", nil, nfs.PATH) nfs.DirDeepAll(m, "usr/volcanos/plugin/local/code/", "inner/", nil, nfs.PATH)
@ -106,6 +116,9 @@ func init() {
} }
}}, }},
nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, arg[0]) }}, nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, arg[0]) }},
nfs.MODULE: {Name: "create name*=h2 help=示例 type*=Zone,Hash,Data,Code main*=main.go zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(AUTOGEN, nfs.MODULE, arg)
}},
nfs.SCRIPT: {Name: "script file*=hi/hi.js", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { nfs.SCRIPT: {Name: "script file*=hi/hi.js", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DEFS, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)), m.Cmdx("", TEMPLATE)) m.Cmdy(nfs.DEFS, path.Join(m.Option(nfs.PATH), m.Option(nfs.FILE)), m.Cmdx("", TEMPLATE))
}}, }},
@ -115,7 +128,7 @@ func init() {
web.DREAM: {Name: "dream name*=hi repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) { web.DREAM: {Name: "dream name*=hi repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.DREAM, cli.START, arg) m.Cmdy(web.DREAM, cli.START, arg)
}}, }},
nfs.REPOS: {Name: "repos", Help: "仓库", Hand: func(m *ice.Message, arg ...string) { nfs.REPOS: {Help: "仓库", Hand: func(m *ice.Message, arg ...string) {
m.Option("view", "change") m.Option("view", "change")
m.Cmd("web.code.git.status", func(value ice.Maps) { m.Cmd("web.code.git.status", func(value ice.Maps) {
m.Push(mdb.TYPE, value[mdb.TYPE]) m.Push(mdb.TYPE, value[mdb.TYPE])

View File

@ -45,7 +45,8 @@ func _xterm_get(m *ice.Message, h string) _xterm {
tty, err := pty.Start(cmd) tty, err := pty.Start(cmd)
m.Assert(err) m.Assert(err)
m.Go(func() { m.Go(func() {
defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) }) // defer mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) })
defer mdb.HashRemove(m, mdb.HASH, h)
defer tty.Close() defer tty.Close()
// m.Option("log.disable", ice.TRUE) // m.Option("log.disable", ice.TRUE)
buf := make([]byte, ice.MOD_BUFS) buf := make([]byte, ice.MOD_BUFS)
@ -85,7 +86,8 @@ func init() {
} }
}}, }},
mdb.CREATE: {Name: "create type=sh name text theme:textarea", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type=sh name text theme:textarea", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0], m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT, "theme")) m.Debug("what %v", m.FormatChain())
mdb.HashCreate(m, mdb.NAME, m.OptionDefault(mdb.NAME, kit.Split(m.Option(mdb.TYPE))[0]), m.OptionSimple(mdb.TYPE, mdb.NAME, mdb.TEXT, web.THEME))
}}, }},
"resize": {Hand: func(m *ice.Message, arg ...string) { "resize": {Hand: func(m *ice.Message, arg ...string) {
_xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80")) _xterm_get(m, "").Setsize(m.OptionDefault("rows", "24"), m.OptionDefault("cols", "80"))
@ -112,13 +114,18 @@ func init() {
if mdb.HashSelect(m, arg...); len(arg) == 0 { if mdb.HashSelect(m, arg...); len(arg) == 0 {
m.PushAction(web.WEBSITE, mdb.REMOVE).Action(mdb.CREATE, mdb.PRUNES) m.PushAction(web.WEBSITE, mdb.REMOVE).Action(mdb.CREATE, mdb.PRUNES)
} else { } else {
m.Action(INSTALL, "debug", "proxy", "波浪线", "反引号") if m.Length() == 0 {
arg[0] = m.Cmdx("", mdb.CREATE, mdb.TYPE, arg[0])
mdb.HashSelect(m, arg[0])
m.Push(mdb.HASH, arg[0])
}
m.Action(INSTALL, "debug", "proxy")
ctx.DisplayLocal(m, "") ctx.DisplayLocal(m, "")
} }
}}, }},
}) })
} }
func _xterm_show(m *ice.Message, cmds, text string) { func _xterm_show(m *ice.Message, cmds, text string, arg ...string) {
m.Cmdy(ctx.COMMAND, XTERM).Push(ctx.ARGS, kit.Format([]string{m.Cmdx(XTERM, mdb.CREATE, mdb.TYPE, cmds, mdb.TEXT, text)})).ProcessField(XTERM) m.Cmdy(ctx.COMMAND, XTERM).Push(ctx.ARGS, kit.Format([]string{m.Cmdx(XTERM, mdb.CREATE, mdb.TYPE, cmds, mdb.NAME, kit.Select("", arg, 0), mdb.TEXT, text)})).ProcessField(XTERM)
} }

View File

@ -99,7 +99,7 @@ func init() {
}) })
return return
} }
if !m.IsCliUA() || strings.Contains(arg[0], ice.AT) { if !m.IsCliUA() || strings.Contains(arg[0], ice.AT) || arg[1] == "src" {
if strings.Contains(arg[0], ice.AT) { if strings.Contains(arg[0], ice.AT) {
ls := strings.Split(arg[0], ice.AT) ls := strings.Split(arg[0], ice.AT)
_repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, ls[0]), "master", ls[1], path.Join(arg[1:]...)) _repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, ls[0]), "master", ls[1], path.Join(arg[1:]...))
@ -107,6 +107,9 @@ func init() {
} else if strings.HasPrefix(arg[1], "v") && strings.Contains(arg[1], ice.PT) { } else if strings.HasPrefix(arg[1], "v") && strings.Contains(arg[1], ice.PT) {
_repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, arg[0]), "master", arg[1], path.Join(arg[2:]...)) _repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, arg[0]), "master", arg[1], path.Join(arg[2:]...))
m.RenderResult() m.RenderResult()
} else if arg[1] == "src" {
_repos_cat(m, path.Join(ice.USR_LOCAL_REPOS, arg[0]), "master", "", path.Join(arg[1:]...))
m.RenderResult()
} else { } else {
web.RenderCmds(m, kit.Dict(ctx.DISPLAY, "/plugin/local/code/repos.js", ctx.INDEX, "web.code.git.inner", web.RenderCmds(m, kit.Dict(ctx.DISPLAY, "/plugin/local/code/repos.js", ctx.INDEX, "web.code.git.inner",
ctx.ARGS, kit.List(strings.TrimSuffix(arg[0], ".git"), arg[1], "pwd", kit.Select("README.md", path.Join(kit.Slice(arg, 2)...))))) ctx.ARGS, kit.List(strings.TrimSuffix(arg[0], ".git"), arg[1], "pwd", kit.Select("README.md", path.Join(kit.Slice(arg, 2)...)))))