diff --git a/README.md b/README.md index 1387431..df9af6e 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ ### Manual installation ```sh -git clone https://github/eliasuran/gomon +git clone https://github/eliasuran/gomon@latest cd gomon go install ``` diff --git a/gomon.go b/gomon.go index d777259..2634279 100644 --- a/gomon.go +++ b/gomon.go @@ -16,7 +16,7 @@ func main() { // sjekk help flag har blitt gitt og display hjelp message om den er det help := lib.ParseFlags() if help { - fmt.Println("Provide the path to a directory containing a main.go file to run it using through gomon") + fmt.Println("Provide the path to a directory containing a main.go file to run it using gomon") return } @@ -34,16 +34,20 @@ func main() { file := getPath() // starter server og får prosessen til serveren som bruker til å interacte serveren som kjører - process := startServer(file) - - // gir response om at serveren har startet - response(200, "Server started successfully!") + process, err := startServer(file) + if err != nil { + // gir response om at en error var funnet i initial build + response(400, "Found error in server") + } else { + // gir response om at serveren har startet + response(200, "Server started successfully!") + } // starter listener som sjekker for endringer i fila før programmet starter for første gang changeListener(file, process) } -func startServer(file string) *os.Process { +func startServer(file string) (*os.Process, error) { // initialiserer go build cmd cmd := exec.Command("go", "build", "-o", filepath.Join(file, "server"), file) cmd.Stdout = os.Stdout @@ -53,6 +57,7 @@ func startServer(file string) *os.Process { err := cmd.Run() if err != nil { response(400, "Error building program: "+err.Error()) + return nil, err } // kjører executablen som ble laget @@ -62,19 +67,20 @@ func startServer(file string) *os.Process { err = cmd.Start() if err != nil { response(400, "Error starting server: "+err.Error()) + return nil, err } // lagrer prosessen i en variabel, dette gjør at jeg slipper å returnere cmd siden dette er det eneste den brukes til (for nå) process := cmd.Process // returnerer prosessen - return process + return process, nil } func response(status int, message string) { t := time.Now().Format("15:04:05") formatting := "%s | [ %d ] %s" - if status == 400 { + if status != 200 { color.Red(formatting, t, status, message) return } @@ -85,36 +91,42 @@ func response(status int, message string) { func changeListener(filePath string, process *os.Process) { fullPath := filepath.Join(filePath, "main.go") initialStat, err := os.Stat(fullPath) - if err != nil { - response(400, "Error doing something: "+err.Error()) - } else { - for { - stat, err := os.Stat(fullPath) - if err != nil { - response(400, "Error in code, pls fix") - break - } + response(400, "Error getting initial stats of file: "+err.Error()) + return + } + + for { + stat, err := os.Stat(fullPath) + if err != nil { + response(400, "Error getting newest stats of file: "+err.Error()) + break + } - if stat.ModTime() != initialStat.ModTime() { - response(200, "Change in file, resarting server...") + if stat.ModTime() != initialStat.ModTime() { + response(200, "Change in file, resarting server...") - if process != nil { + if process != nil { + go func() { err = process.Signal(syscall.SIGTERM) if err != nil { response(400, "Error when killing previous process: "+err.Error()) } process.Wait() - } - - process = startServer(filePath) + }() + } - initialStat = stat + process, err = startServer(filePath) + if err != nil { + response(400, "Error starting server: "+err.Error()) + } else { response(200, "Sucessfully updated") } - time.Sleep(1 * time.Second) + initialStat = stat } + + time.Sleep(1 * time.Second) } } @@ -122,10 +134,10 @@ func changeListener(filePath string, process *os.Process) { func getPath() string { files := os.Args[1:] if len(files) == 0 { - fmt.Println("No file provided\nProvide -help flag for help") + response(400, "No file provided\nProvide -help flag for help") os.Exit(1) } else if len(files) != 1 { - fmt.Println("Too many files provided") + response(400, "Too many files provided\nProvide -help flag for help") os.Exit(1) } diff --git a/test/server b/test/server new file mode 100755 index 0000000..2d2aecb Binary files /dev/null and b/test/server differ