mirror of https://github.com/Hilbis/Hilbish
feat: add hilbish.jobs interface and add stop function to job in hooks (closes #109)
parent
654ca4b527
commit
2fe888e186
5
api.go
5
api.go
|
@ -107,11 +107,16 @@ Check out the {blue}{bold}guide{reset} command to get started.
|
||||||
util.Document(L, hshcomp, "Completions interface for Hilbish.")
|
util.Document(L, hshcomp, "Completions interface for Hilbish.")
|
||||||
L.SetField(mod, "completion", hshcomp)
|
L.SetField(mod, "completion", hshcomp)
|
||||||
|
|
||||||
|
// hilbish.runner table
|
||||||
runnerModule := runnerModeLoader(L)
|
runnerModule := runnerModeLoader(L)
|
||||||
util.Document(L, runnerModule, "Runner/exec interface for Hilbish.")
|
util.Document(L, runnerModule, "Runner/exec interface for Hilbish.")
|
||||||
L.SetField(mod, "runner", runnerModule)
|
L.SetField(mod, "runner", runnerModule)
|
||||||
|
|
||||||
|
// hilbish.jobs table
|
||||||
jobs = newJobHandler()
|
jobs = newJobHandler()
|
||||||
|
jobModule := jobs.loader(L)
|
||||||
|
util.Document(L, jobModule, "(Background) job interface.")
|
||||||
|
L.SetField(mod, "jobs", jobModule)
|
||||||
|
|
||||||
L.Push(mod)
|
L.Push(mod)
|
||||||
|
|
||||||
|
|
1
exec.go
1
exec.go
|
@ -262,6 +262,7 @@ func execCommand(cmd string) error {
|
||||||
|
|
||||||
err = cmd.Start()
|
err = cmd.Start()
|
||||||
job := jobs.getLatest()
|
job := jobs.getLatest()
|
||||||
|
job.setHandle(cmd.Process)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if bg {
|
if bg {
|
||||||
job.start(cmd.Process.Pid)
|
job.start(cmd.Process.Pid)
|
||||||
|
|
63
job.go
63
job.go
|
@ -2,6 +2,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/yuin/gopher-lua"
|
"github.com/yuin/gopher-lua"
|
||||||
)
|
)
|
||||||
|
@ -14,6 +15,7 @@ type job struct {
|
||||||
id int
|
id int
|
||||||
pid int
|
pid int
|
||||||
exitCode int
|
exitCode int
|
||||||
|
proc *os.Process
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *job) start(pid int) {
|
func (j *job) start(pid int) {
|
||||||
|
@ -22,15 +24,27 @@ func (j *job) start(pid int) {
|
||||||
hooks.Em.Emit("job.start", j.lua())
|
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() {
|
func (j *job) finish() {
|
||||||
j.running = false
|
j.running = false
|
||||||
hooks.Em.Emit("job.done", j.lua())
|
hooks.Em.Emit("job.done", j.lua())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (j *job) setHandle(handle *os.Process) {
|
||||||
|
j.proc = handle
|
||||||
|
}
|
||||||
|
|
||||||
func (j *job) lua() *lua.LTable {
|
func (j *job) lua() *lua.LTable {
|
||||||
// returns lua table for job
|
// returns lua table for job
|
||||||
// because userdata is gross
|
// 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, "cmd", lua.LString(j.cmd))
|
||||||
l.SetField(luaJob, "running", lua.LBool(j.running))
|
l.SetField(luaJob, "running", lua.LBool(j.running))
|
||||||
|
@ -41,6 +55,14 @@ func (j *job) lua() *lua.LTable {
|
||||||
return luaJob
|
return luaJob
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (j *job) luaStop(L *lua.LState) int {
|
||||||
|
if j.running {
|
||||||
|
j.stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
type jobHandler struct {
|
type jobHandler struct {
|
||||||
jobs map[int]*job
|
jobs map[int]*job
|
||||||
latestID int
|
latestID int
|
||||||
|
@ -73,3 +95,42 @@ func (j *jobHandler) getLatest() *job {
|
||||||
|
|
||||||
return j.jobs[j.latestID]
|
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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue