From 826b0789cbbc7e4633f9f1d02e89b44a473921e1 Mon Sep 17 00:00:00 2001 From: sammyette Date: Fri, 19 Jul 2024 17:43:49 -0400 Subject: [PATCH 1/9] docs: promote midnight edition on main readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 9d6446c..4566c30 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +> [!TIP] +> Check out [Hilbish: Midnight Edition](https://github.com/Rosettea/Hilbish/tree/midnight-edition) if you want to use C Lua, LuaJIT or anything related! +
🌓 The Moon-powered shell! A comfy and extensible shell for Lua fans! 🌺 ✨ From 41e5e3f789b2c3b730e48b1216d80ded6f768f03 Mon Sep 17 00:00:00 2001 From: sammyette Date: Fri, 19 Jul 2024 18:46:46 -0400 Subject: [PATCH 2/9] feat: commanders can exit via ctrl c (#313) --- CHANGELOG.md | 2 ++ exec.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4db0c7..dcee77d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ hilbish.run('wc -l', { ### Fixed - Fix ansi attributes causing issues with text when cut off in greenhouse - `exec` command should return if no arg presented +- Commanders can now be cancelled by Ctrl-C and wont hang the shell anymore. +See [issue 198](https://github.com/Rosettea/Hilbish/issues/198). ## [2.2.3] - 2024-04-27 ### Fixed diff --git a/exec.go b/exec.go index cf1b299..5def9aa 100644 --- a/exec.go +++ b/exec.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "os" + "os/signal" "path/filepath" "runtime" "strings" @@ -353,7 +354,34 @@ func execHandle(bg bool) interp.ExecHandlerFunc { sinks.Set(rt.StringValue("out"), rt.UserDataValue(stdout.ud)) sinks.Set(rt.StringValue("err"), rt.UserDataValue(stderr.ud)) - luaexitcode, err := rt.Call1(l.MainThread(), rt.FunctionValue(cmd), rt.TableValue(luacmdArgs), rt.TableValue(sinks)) + t := rt.NewThread(l) + sig := make(chan os.Signal) + exit := make(chan bool) + + luaexitcode := rt.IntValue(63) + var err error + go func() { + defer func() { + if r := recover(); r != nil { + exit <- true + } + }() + + signal.Notify(sig, os.Interrupt) + select { + case <-sig: + t.KillContext() + return + } + + }() + + go func() { + luaexitcode, err = rt.Call1(t, rt.FunctionValue(cmd), rt.TableValue(luacmdArgs), rt.TableValue(sinks)) + exit <- true + }() + + <-exit if err != nil { fmt.Fprintln(os.Stderr, "Error in command:\n" + err.Error()) return interp.NewExitStatus(1) From 5f8d942f0a80863a4190f9cb20db61fd24ba11fd Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 20 Jul 2024 09:31:57 -0400 Subject: [PATCH 3/9] fix: reuse shell runner instance (#312) --- CHANGELOG.md | 1 + exec.go | 2 -- go.mod | 11 +++++---- go.sum | 44 ++++++++++++++--------------------- golibs/fs/fs.go | 62 ++++++++++++++++++++++++++++++------------------- lua.go | 3 ++- main.go | 3 +++ 7 files changed, 69 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcee77d..b97e2a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ hilbish.run('wc -l', { - `exec` command should return if no arg presented - Commanders can now be cancelled by Ctrl-C and wont hang the shell anymore. See [issue 198](https://github.com/Rosettea/Hilbish/issues/198). +- Shell interpreter can now preserve its environment and set PWD properly. ## [2.2.3] - 2024-04-27 ### Fixed diff --git a/exec.go b/exec.go index 5def9aa..446a14d 100644 --- a/exec.go +++ b/exec.go @@ -270,8 +270,6 @@ func execCommand(cmd string, strms *streams) (io.Writer, io.Writer, error) { return nil, nil, err } - runner, _ := interp.New() - if strms == nil { strms = &streams{} } diff --git a/go.mod b/go.mod index a7975b7..985f2e2 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module hilbish -go 1.18 +go 1.21 + +toolchain go1.22.2 require ( github.com/arnodel/golua v0.0.0-20230215163904-e0b5347eaaa1 @@ -9,8 +11,8 @@ require ( github.com/maxlandon/readline v1.0.14 github.com/pborman/getopt v1.1.0 github.com/sahilm/fuzzy v0.1.1 - golang.org/x/sys v0.19.0 - golang.org/x/term v0.19.0 + golang.org/x/sys v0.22.0 + golang.org/x/term v0.22.0 mvdan.cc/sh/v3 v3.8.0 ) @@ -19,13 +21,14 @@ require ( github.com/arnodel/strftime v0.1.6 // indirect github.com/evilsocket/islazy v1.11.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect github.com/olekukonko/ts v0.0.0-20171002115256-78ecb04241c0 // indirect github.com/rivo/uniseg v0.4.7 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/text v0.14.0 // indirect ) -replace mvdan.cc/sh/v3 => github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20220524215627-dfd9a4fa219b +replace mvdan.cc/sh/v3 => github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20240720131751-805c301321fd replace github.com/maxlandon/readline => ./readline diff --git a/go.sum b/go.sum index 193f17e..136f827 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/Rosettea/golua v0.0.0-20240427174124-d239074c1749 h1:jIFnWBTsYw8s7RX7H2AOXjDVhWP3ol7OzUVaPN2KnGI= github.com/Rosettea/golua v0.0.0-20240427174124-d239074c1749/go.mod h1:9jzpYPiU2is0HVGCiuIOBSXdergHUW44IEjmuN1UrIE= -github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20220524215627-dfd9a4fa219b h1:s5eDMhBk6H1BgipgLub/gv9qeyBaTuiHM0k3h2/9TSE= -github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20220524215627-dfd9a4fa219b/go.mod h1:R09vh/04ILvP2Gj8/Z9Jd0Dh0ZIvaucowMEs6abQpWs= +github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20240720131751-805c301321fd h1:THNle0FR2g7DMO1y3Bx1Zr7rYeiLXt3st3UkxEsMzL4= +github.com/Rosettea/sh/v3 v3.4.0-0.dev.0.20240720131751-805c301321fd/go.mod h1:YZalN5H7WNQw3DGij6IvHsEhn5YMW7M2FCwG6gnfKy4= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/arnodel/strftime v0.1.6 h1:0hc0pUvk8KhEMXE+htyaOUV42zNcf/csIbjzEFCJqsw= @@ -10,45 +10,37 @@ github.com/atsushinee/go-markdown-generator v0.0.0-20191121114853-83f9e1f68504 h github.com/atsushinee/go-markdown-generator v0.0.0-20191121114853-83f9e1f68504/go.mod h1:kHBCvAXJIatTX1pw6tLiOspjGc3MhUDRlog9yrCUS+k= github.com/blackfireio/osinfo v1.0.5 h1:6hlaWzfcpb87gRmznVf7wSdhysGqLRz9V/xuSdCEXrA= github.com/blackfireio/osinfo v1.0.5/go.mod h1:Pd987poVNmd5Wsx6PRPw4+w7kLlf9iJxoRKPtPAjOrA= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.15 h1:cKRCLMj3Ddm54bKSpemfQ8AtYFBhAI2MPmdys22fBdc= -github.com/creack/pty v1.1.15/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/evilsocket/islazy v1.11.0 h1:B5w6uuS6ki6iDG+aH/RFeoMb8ijQh/pGabewqp2UeJ0= github.com/evilsocket/islazy v1.11.0/go.mod h1:muYH4x5MB5YRdkxnrOtrXLIBX6LySj1uFIqys94LKdo= -github.com/google/renameio v1.0.1/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/olekukonko/ts v0.0.0-20171002115256-78ecb04241c0 h1:LiZB1h0GIcudcDci2bxbqI6DXV8bF8POAnArqvRrIyw= github.com/olekukonko/ts v0.0.0-20171002115256-78ecb04241c0/go.mod h1:F/7q8/HZz+TXjlsoZQQKVYvXTZaFH4QRa3y+j1p7MS0= github.com/pborman/getopt v1.1.0 h1:eJ3aFZroQqq0bWmraivjQNt6Dmm5M0h2JcDW38/Azb0= github.com/pborman/getopt v1.1.0/go.mod h1:FxXoW1Re00sQG/+KIkuSqRL/LwQgSkv7uyac+STFsbk= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1-0.20210923151022-86f73c517451 h1:d1PiN4RxzIFXCJTvRkvSkKqwtRAl5ZV4lATKtQI0B7I= -github.com/rogpeppe/go-internal v1.8.1-0.20210923151022-86f73c517451/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA= github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210925032602-92d5a993a665/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20210916214954-140adaaadfaf/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -mvdan.cc/editorconfig v0.2.0/go.mod h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0= diff --git a/golibs/fs/fs.go b/golibs/fs/fs.go index 9e03325..13f972d 100644 --- a/golibs/fs/fs.go +++ b/golibs/fs/fs.go @@ -19,25 +19,38 @@ import ( rt "github.com/arnodel/golua/runtime" "github.com/arnodel/golua/lib/packagelib" "github.com/arnodel/golua/lib/iolib" + "mvdan.cc/sh/v3/interp" ) -var Loader = packagelib.Loader{ - Load: loaderFunc, - Name: "fs", +type fs struct{ + runner *interp.Runner + Loader packagelib.Loader } -func loaderFunc(rtm *rt.Runtime) (rt.Value, func()) { +func New(runner *interp.Runner) *fs { + f := &fs{ + runner: runner, + } + f.Loader = packagelib.Loader{ + Load: f.loaderFunc, + Name: "fs", + } + + return f +} + +func (f *fs) loaderFunc(rtm *rt.Runtime) (rt.Value, func()) { exports := map[string]util.LuaExport{ - "cd": util.LuaExport{fcd, 1, false}, - "mkdir": util.LuaExport{fmkdir, 2, false}, - "stat": util.LuaExport{fstat, 1, false}, - "readdir": util.LuaExport{freaddir, 1, false}, - "abs": util.LuaExport{fabs, 1, false}, - "basename": util.LuaExport{fbasename, 1, false}, - "dir": util.LuaExport{fdir, 1, false}, - "glob": util.LuaExport{fglob, 1, false}, - "join": util.LuaExport{fjoin, 0, true}, - "pipe": util.LuaExport{fpipe, 0, false}, + "cd": util.LuaExport{f.fcd, 1, false}, + "mkdir": util.LuaExport{f.fmkdir, 2, false}, + "stat": util.LuaExport{f.fstat, 1, false}, + "readdir": util.LuaExport{f.freaddir, 1, false}, + "abs": util.LuaExport{f.fabs, 1, false}, + "basename": util.LuaExport{f.fbasename, 1, false}, + "dir": util.LuaExport{f.fdir, 1, false}, + "glob": util.LuaExport{f.fglob, 1, false}, + "join": util.LuaExport{f.fjoin, 0, true}, + "pipe": util.LuaExport{f.fpipe, 0, false}, } mod := rt.NewTable() util.SetExports(rtm, mod, exports) @@ -52,7 +65,7 @@ func loaderFunc(rtm *rt.Runtime) (rt.Value, func()) { // This can be used to resolve short paths like `..` to `/home/user`. // #param path string // #returns string -func fabs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fabs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { path, err := c.StringArg(0) if err != nil { return nil, err @@ -72,7 +85,7 @@ func fabs(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // `.` will be returned. // #param path string Path to get the base name of. // #returns string -func fbasename(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fbasename(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -87,7 +100,7 @@ func fbasename(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // cd(dir) // Changes Hilbish's directory to `dir`. // #param dir string Path to change directory to. -func fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -101,6 +114,7 @@ func fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err != nil { return nil, err } + interp.Dir(path)(f.runner) return c.Next(), err } @@ -110,7 +124,7 @@ func fcd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // `~/Documents/doc.txt` then this function will return `~/Documents`. // #param path string Path to get the directory for. // #returns string -func fdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -141,7 +155,7 @@ print(matches) -- -> {'init.lua', 'code.lua'} #example */ -func fglob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fglob(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -175,7 +189,7 @@ print(fs.join(hilbish.userDir.config, 'hilbish')) -- -> '/home/user/.config/hilbish' on Linux #example */ -func fjoin(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fjoin(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { strs := make([]string, len(c.Etc())) for i, v := range c.Etc() { if v.Type() != rt.StringType { @@ -202,7 +216,7 @@ func fjoin(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { fs.mkdir('./foo/bar', true) #example */ -func fmkdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fmkdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.CheckNArgs(2); err != nil { return nil, err } @@ -233,7 +247,7 @@ func fmkdir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // The type returned is a Lua file, same as returned from `io` functions. // #returns File // #returns File -func fpipe(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fpipe(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { rf, wf, err := os.Pipe() if err != nil { return nil, err @@ -248,7 +262,7 @@ func fpipe(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { // Returns a list of all files and directories in the provided path. // #param dir string // #returns table -func freaddir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) freaddir(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } @@ -296,7 +310,7 @@ Would print the following: ]]-- #example */ -func fstat(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { +func (f *fs) fstat(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { if err := c.Check1Arg(); err != nil { return nil, err } diff --git a/lua.go b/lua.go index 94b7910..88fedf8 100644 --- a/lua.go +++ b/lua.go @@ -30,7 +30,8 @@ func luaInit() { util.DoString(l, "hilbish = require 'hilbish'") // Add fs and terminal module module to Lua - lib.LoadLibs(l, fs.Loader) + f := fs.New(runner) + lib.LoadLibs(l, f.Loader) lib.LoadLibs(l, terminal.Loader) cmds = commander.New(l) diff --git a/main.go b/main.go index fd511a9..41d1d35 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,7 @@ import ( "github.com/pborman/getopt" "github.com/maxlandon/readline" "golang.org/x/term" + "mvdan.cc/sh/v3/interp" ) var ( @@ -37,9 +38,11 @@ var ( cmds *commander.Commander defaultConfPath string defaultHistPath string + runner *interp.Runner ) func main() { + runner, _ = interp.New() curuser, _ = user.Current() homedir := curuser.HomeDir confDir, _ = os.UserConfigDir() From 4e882b376b8d6b9c07a7b837813a55fafb71a700 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 20 Jul 2024 09:36:42 -0400 Subject: [PATCH 4/9] chore: update version info --- CHANGELOG.md | 3 ++- vars.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b97e2a0..eb95cc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # 🎀 Changelog -## Unreleased +## [2.3.0] - 2024-07-20 ### Added - `fs.pipe` function to get a pair of connected files (a pipe). - Added an alternative 2nd parameter to `hilbish.run`, which is `streams`. @@ -751,6 +751,7 @@ This input for example will prompt for more input to complete: First "stable" release of Hilbish. +[2.3.0]: https://github.com/Rosettea/Hilbish/compare/v2.2.3...v2.3.0 [2.2.3]: https://github.com/Rosettea/Hilbish/compare/v2.2.2...v2.2.3 [2.2.2]: https://github.com/Rosettea/Hilbish/compare/v2.2.1...v2.2.2 [2.2.1]: https://github.com/Rosettea/Hilbish/compare/v2.2.0...v2.2.1 diff --git a/vars.go b/vars.go index 1be257c..bad94db 100644 --- a/vars.go +++ b/vars.go @@ -11,8 +11,8 @@ var ( // Version info var ( - ver = "v2.2.3" - releaseName = "Poppy" + ver = "v2.3.0" + releaseName = "Alyssum" gitCommit string gitBranch string From 92448eec67f3de15813047033fc8b89aa3d22d7f Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 20 Jul 2024 09:57:51 -0400 Subject: [PATCH 5/9] ci: add workflow dispatch to website --- .github/workflows/website.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 4b9b8af..56da2e6 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -7,6 +7,7 @@ on: pull_request: branches: - master + workflow_dispatch: jobs: deploy: From 44d63a398ad6d49ef53a2230f6717e3e34eec1bc Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 20 Jul 2024 10:03:36 -0400 Subject: [PATCH 6/9] chore: update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb95cc8..f0f00a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [2.3.0] - 2024-07-20 ### Added +- `commander.registry` function to get all registered commanders. - `fs.pipe` function to get a pair of connected files (a pipe). - Added an alternative 2nd parameter to `hilbish.run`, which is `streams`. `streams` is a table of input and output streams to run the command with. @@ -28,8 +29,14 @@ hilbish.run('wc -l', { }) ``` +### Changed +- The `-S` flag will be set to Hilbish's absolute path +- Hilbish now builds on any Unix (if any dependencies also work, which should.) + ### Fixed - Fix ansi attributes causing issues with text when cut off in greenhouse +- Fix greenhouse appearing on terminal resize +- Fix crashes when history goes out of bounds when using history navigation - `exec` command should return if no arg presented - Commanders can now be cancelled by Ctrl-C and wont hang the shell anymore. See [issue 198](https://github.com/Rosettea/Hilbish/issues/198). From 1ba0dd183c94d41d0e0669ea94bc90070448e8d4 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 20 Jul 2024 10:14:16 -0400 Subject: [PATCH 7/9] blog: add v2.3 release blog --- website/content/blog/v2.3-release.md | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 website/content/blog/v2.3-release.md diff --git a/website/content/blog/v2.3-release.md b/website/content/blog/v2.3-release.md new file mode 100644 index 0000000..3185148 --- /dev/null +++ b/website/content/blog/v2.3-release.md @@ -0,0 +1,48 @@ +--- +title: "v2.3 Release" +date: 2024-07-20T10:05:17-04:00 +draft: false +--- + + +> The release with full changelogs and prebuilt binaries can be +seen at the [v2.3.0](https://github.com/Rosettea/Hilbish/releases/tag/v2.3.0) +tag. + +Hilbish v2.3 has now been released! This is small feature and bug fix release +which took a while to cme ut since I took a long break from programming in general. +The next release will be great, so stay tuned for that. + +# Features +## Pipes (via Lua) +Commands can now be piped to each other via the Lua API with the `hilbish.run` +function and an `fs.pipe`. + +Here is a minimal example of the new usage which allows users to now pipe commands +directly via Lua functions: + +```lua +local fs = require 'fs' +local pr, pw = fs.pipe() +hilbish.run('ls -l', { + stdout = pw, + stderr = pw, +}) + +pw:close() + +hilbish.run('wc -l', { + stdin = pr +}) +``` + +This also means it's easier to make commands output to any stream output, +including in commanders. + +# Bug Fixes +- Commanders can now be cancelled with Ctrl-C, which means if they froze for some reason +they can now be exited. +- The shell script interpreter now keeps its environment, and this also fixes the +current working directory being wrong with some commands. +- Some greenhouse bugs have been fixed, like randomly appearing when resizing the terminal +and some text attributes like color appearing where they weren't supposed to. From cc43cb2d6eb0b030beacc1646adb67f408dd92e5 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 20 Jul 2024 10:19:22 -0400 Subject: [PATCH 8/9] fix: make website build on tag pushes --- .github/workflows/website.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 56da2e6..dba7ca0 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -4,6 +4,8 @@ on: push: branches: - master + tags: + - v[0-9]+.* pull_request: branches: - master From 8a1614ab591aec6b03e6fe0a289aa0fa6723644a Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 20 Jul 2024 10:24:56 -0400 Subject: [PATCH 9/9] ci: use wildcard for refs on branch name --- .github/workflows/website.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index dba7ca0..d5859b8 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -28,7 +28,7 @@ jobs: - name: Set branch name id: branch - run: echo "BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> "$GITHUB_ENV" + run: echo "BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/*/}}" >> "$GITHUB_ENV" - name: Fix base URL if: env.BRANCH_NAME != 'master' && github.repository_owner == 'Rosettea'