From 1f192607b2a3f460abf5c5ed31067451727c9e64 Mon Sep 17 00:00:00 2001 From: Aidan Date: Thu, 23 Jul 2020 12:08:29 -0700 Subject: [PATCH] update debug log usage and add fanciness to log printing --- ast/func_table.go | 15 +++++++++++---- config/config.go | 2 +- log/logger.go | 2 +- stdlib/control_flow.go | 4 ++-- stdlib/list.go | 2 +- stdlib/shell.go | 23 +++++++++-------------- stdlib/stdlib.go | 2 +- util/shell_complete.go | 2 +- 8 files changed, 27 insertions(+), 25 deletions(-) diff --git a/ast/func_table.go b/ast/func_table.go index b939e0c..734f9ee 100644 --- a/ast/func_table.go +++ b/ast/func_table.go @@ -17,7 +17,10 @@ package ast -import "gitlab.com/whom/shs/log" +import ( + "fmt" + "gitlab.com/whom/shs/log" +) /* expected function header for any stdlib function */ @@ -61,8 +64,12 @@ func (f Function) ParseFunction(args *Token) bool { if i != 0 { log.Log(log.ERR, - "Incorrect number of arguments", - "eval") + "Incorrect number of arguments", + "eval") + log.Log(log.DEBUG, + fmt.Sprintf("Function %s expects %d arguments. You've provided %d arguments.", + f.Name, f.Args, f.Args - i), + "eval") return false } @@ -89,7 +96,7 @@ func (f Function) CallFunction(args *Token, vt VarTable, ft FuncTable) *Token { func GetFunction(arg string, table FuncTable) *Function { target, ok := (*table)[arg] if !ok { - log.Log(log.DEBUG, + log.Log(log.INFO, "function " + arg + " not found", "ftable") return nil diff --git a/config/config.go b/config/config.go index fc8eda3..feef48e 100644 --- a/config/config.go +++ b/config/config.go @@ -39,7 +39,7 @@ func InitFromConfig(configFile string) (ast.VarTable, ast.FuncTable) { util.LoadScript(configFile, vars, funcs) - log.Log(log.DEBUG, + log.Log(log.INFO, "config file fully evaluated", "config") return vars, funcs diff --git a/log/logger.go b/log/logger.go index 2d736e6..7c9a110 100644 --- a/log/logger.go +++ b/log/logger.go @@ -51,5 +51,5 @@ func Log(lvl int, msg, context string) { return } - fmt.Println("[" + context + "] " + msg) + fmt.Println("\033[3m[" + context + "] " + msg + "\033[0m") } diff --git a/stdlib/control_flow.go b/stdlib/control_flow.go index 0238ff5..51c4deb 100644 --- a/stdlib/control_flow.go +++ b/stdlib/control_flow.go @@ -45,8 +45,8 @@ func ShsProgn(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { * (if (eq (number "3") 3) (print "test passed") (print "test failed")) */ func ShsIf(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { - cond := in - t := cond.Next + cond := in.Copy() + t := cond.Next.Copy() f := t.Next cond.Next = nil t.Next = nil diff --git a/stdlib/list.go b/stdlib/list.go index cec7d80..748414b 100644 --- a/stdlib/list.go +++ b/stdlib/list.go @@ -29,7 +29,7 @@ import ( */ func Expand(input *ast.Token, vars ast.VarTable, funcs ast.FuncTable) *ast.Token { if input.Tag != ast.LIST { - log.Log(log.DEBUG, "expand called on not a list", "expand") + log.Log(log.INFO, "expand called on not a list", "expand") return input } diff --git a/stdlib/shell.go b/stdlib/shell.go index 68afea0..41914ee 100644 --- a/stdlib/shell.go +++ b/stdlib/shell.go @@ -68,7 +68,7 @@ var LastExitCode int func signalHandler() { for { <- sigChan - log.Log(log.DEBUG, + log.Log(log.INFO, "caught SIGINT", "jobctl") @@ -174,7 +174,11 @@ func LaunchProcess( stderr io.Writer ) { c, cancel := context.WithCancel(context.Background()) cmd := exec.CommandContext(c, path, args...) - cmd.SysProcAttr = &syscall.SysProcAttr{Foreground: !background, Setpgid: true} + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + + if !background { + cmd.SysProcAttr.Foreground = true + } if stdin == nil { stdin = os.Stdin @@ -201,6 +205,7 @@ func LaunchProcess( CurCancel = &cancel if background { + cmd.Process.Signal(syscall.SIGTSTP) go func(){ waitChan <- cmd.Wait() delete(JobMap, cpid) @@ -317,7 +322,7 @@ func Fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { } ipid := int(pid) - proc, ok := JobMap[ipid] + _, ok := JobMap[ipid] if !ok { log.Log(log.ERR, "Process not found, was it started by this shell?", @@ -325,17 +330,7 @@ func Fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { return nil } - cmd := proc.Ctl - cmd.Process.Signal(syscall.SIGCONT) - err = cmd.Wait() - if err != nil { - if exitError, ok := err.(*exec.ExitError); ok { - LastExitCode = exitError.ExitCode() - } else { - log.Log(log.ERR, "Execution step returned error: " + err.Error(), "call") - } - } - + tcsetpgrp(0, ipid) return nil } diff --git a/stdlib/stdlib.go b/stdlib/stdlib.go index 83749c2..292b7da 100644 --- a/stdlib/stdlib.go +++ b/stdlib/stdlib.go @@ -238,7 +238,7 @@ func GenFuncTable() ast.FuncTable { Function: Fg, Name: "foreground", TimesCalled: 0, - Args: 0, + Args: 1, }, "$": &ast.Function{ diff --git a/util/shell_complete.go b/util/shell_complete.go index 2d41440..86410d8 100644 --- a/util/shell_complete.go +++ b/util/shell_complete.go @@ -51,7 +51,7 @@ func ShellCompleter(line string, vt ast.VarTable, ft ast.FuncTable) []string { fobjs, err := ioutil.ReadDir(dir) if err != nil { - log.Log(log.DEBUG, + log.Log(log.INFO, "couldnt read dir " + dir + ": " + err.Error(), "complete") if path {