Compare commits

...

4 Commits

Author SHA1 Message Date
TorchedSammy 754a63c74b
chore: merge 2022-03-20 19:10:41 -04:00
TorchedSammy 2fe888e186
feat: add hilbish.jobs interface and add stop function to job in hooks (closes #109) 2022-03-20 19:10:12 -04:00
TorchedSammy 0d4143582f docs: [ci] generate new docs 2022-03-20 21:54:55 +00:00
TorchedSammy 654ca4b527
docs: fix hilbish.alias doc 2022-03-20 17:54:02 -04:00
5 changed files with 71 additions and 4 deletions

7
api.go
View File

@ -107,11 +107,16 @@ Check out the {blue}{bold}guide{reset} command to get started.
util.Document(L, hshcomp, "Completions interface for Hilbish.")
L.SetField(mod, "completion", hshcomp)
// hilbish.runner table
runnerModule := runnerModeLoader(L)
util.Document(L, runnerModule, "Runner/exec interface for Hilbish.")
L.SetField(mod, "runner", runnerModule)
// hilbish.jobs table
jobs = newJobHandler()
jobModule := jobs.loader(L)
util.Document(L, jobModule, "(Background) job interface.")
L.SetField(mod, "jobs", jobModule)
L.Push(mod)
@ -254,7 +259,7 @@ func hlmlprompt(L *lua.LState) int {
}
// alias(cmd, orig)
// Sets an alias of `orig` to `cmd`
// Sets an alias of `cmd` to `orig`
// --- @param cmd string
// --- @param orig string
func hlalias(L *lua.LState) int {

View File

@ -1,4 +1,4 @@
alias(cmd, orig) > Sets an alias of `orig` to `cmd`
alias(cmd, orig) > Sets an alias of `cmd` to `orig`
appendPath(dir) > Appends `dir` to $PATH

View File

@ -2,7 +2,7 @@
local hilbish = {}
--- Sets an alias of `orig` to `cmd`
--- Sets an alias of `cmd` to `orig`
--- @param cmd string
--- @param orig string
function hilbish.alias(cmd, orig) end

View File

@ -262,6 +262,7 @@ func execCommand(cmd string) error {
err = cmd.Start()
job := jobs.getLatest()
job.setHandle(cmd.Process)
if err == nil {
if bg {
job.start(cmd.Process.Pid)

63
job.go
View File

@ -2,6 +2,7 @@ package main
import (
"sync"
"os"
"github.com/yuin/gopher-lua"
)
@ -14,6 +15,7 @@ type job struct {
id int
pid int
exitCode int
proc *os.Process
}
func (j *job) start(pid int) {
@ -22,15 +24,27 @@ func (j *job) start(pid int) {
hooks.Em.Emit("job.start", j.lua())
}
func (j *job) stop() {
// finish will be called in exec handle
j.proc.Kill()
}
func (j *job) finish() {
j.running = false
hooks.Em.Emit("job.done", j.lua())
}
func (j *job) setHandle(handle *os.Process) {
j.proc = handle
}
func (j *job) lua() *lua.LTable {
// returns lua table for job
// because userdata is gross
luaJob := l.NewTable()
jobFuncs := map[string]lua.LGFunction{
"stop": j.luaStop,
}
luaJob := l.SetFuncs(l.NewTable(), jobFuncs)
l.SetField(luaJob, "cmd", lua.LString(j.cmd))
l.SetField(luaJob, "running", lua.LBool(j.running))
@ -41,6 +55,14 @@ func (j *job) lua() *lua.LTable {
return luaJob
}
func (j *job) luaStop(L *lua.LState) int {
if j.running {
j.stop()
}
return 0
}
type jobHandler struct {
jobs map[int]*job
latestID int
@ -73,3 +95,42 @@ func (j *jobHandler) getLatest() *job {
return j.jobs[j.latestID]
}
func (j *jobHandler) loader(L *lua.LState) *lua.LTable {
jobFuncs := map[string]lua.LGFunction{
"all": j.luaAllJobs,
"get": j.luaGetJob,
}
luaJob := l.SetFuncs(l.NewTable(), jobFuncs)
return luaJob
}
func (j *jobHandler) luaGetJob(L *lua.LState) int {
j.mu.RLock()
defer j.mu.RUnlock()
jobID := L.CheckInt(1)
job := j.jobs[jobID]
if job != nil {
return 0
}
L.Push(job.lua())
return 1
}
func (j *jobHandler) luaAllJobs(L *lua.LState) int {
j.mu.RLock()
defer j.mu.RUnlock()
jobTbl := L.NewTable()
for id, job := range j.jobs {
jobTbl.Insert(id, job.lua())
}
L.Push(jobTbl)
return 1
}