Guest User

Untitled

a guest
Sep 21st, 2015
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.68 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "flag"
  5.     "fmt"
  6.     "log"
  7.     "os"
  8.     "os/exec"
  9.     "strconv"
  10.     "sync"
  11.     "time"
  12. )
  13.  
  14. type Color string
  15.  
  16. const (
  17.     Version = "0.1"
  18.  
  19.     ColorGreen  = "2"
  20.     ColorYellow = "3"
  21.     ColorGray   = "7"
  22. )
  23.  
  24. var (
  25.     roIndex int
  26. )
  27.  
  28. func printLog(color Color, args ...interface{}) {
  29.     format := []interface{}{"- \x1b[3" + color + "m[godemon]"}
  30.     format = append(format, args...)
  31.     format = append(format, "\x1b[0m")
  32.     log.Println(format...)
  33. }
  34.  
  35. func startGo(file string, args []string, gwg *sync.WaitGroup, kill *chan bool) {
  36.     params := []string{"run", file}
  37.     params = append(params, args...)
  38.     params = append(params, strconv.Itoa(roIndex))
  39.     roIndex += 1
  40.  
  41.     printLog(ColorGreen, "starting `"+file+"`")
  42.  
  43.     cmd := exec.Command("go", params...)
  44.     cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
  45.     cmd.Start()
  46.  
  47.     var wg sync.WaitGroup
  48.     wg.Add(1)
  49.  
  50.     go func() {
  51.         <-*kill
  52.         //cmd.Process.Kill()
  53.         cmd.Process.Signal(os.Kill)
  54.         wg.Done()
  55.     }()
  56.  
  57.     cmd.Wait()
  58.     close(*kill)
  59.     wg.Wait()
  60.  
  61.     printLog(ColorGreen, "clean exit - waiting for changes before restart")
  62.  
  63.     gwg.Done()
  64. }
  65.  
  66. func init() {
  67.     flag.Parse()
  68.     log.SetPrefix("\x1b[3" + ColorGray + "m")
  69. }
  70.  
  71. func main() {
  72.     pattern := *flag.String("w", "**/*.*", "watching glob pattern")
  73.  
  74.     if len(flag.Args()) == 0 {
  75.         fmt.Println("Usage: godemon gofile [args]\n\n" +
  76.             "See \"godemon --help\" for more.")
  77.         os.Exit(0)
  78.     }
  79.  
  80.     printLog(ColorYellow, "v"+Version)
  81.     printLog(ColorYellow, "watching:", pattern)
  82.  
  83.     file := flag.Arg(0) + ".go"
  84.     args := flag.Args()[1:]
  85.  
  86.     for {
  87.         var wg sync.WaitGroup
  88.         kill := make(chan bool)
  89.  
  90.         wg.Add(1)
  91.         go startGo(file, args, &wg, &kill)
  92.         time.Sleep(time.Second)
  93.         kill <- true
  94.         wg.Wait()
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment