Advertisement
Guest User

Untitled

a guest
Sep 21st, 2015
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.         wg.Done()
  54.     }()
  55.  
  56.     cmd.Wait()
  57.     close(*kill)
  58.     wg.Wait()
  59.  
  60.     printLog(ColorGreen, "clean exit - waiting for changes before restart")
  61.  
  62.     gwg.Done()
  63. }
  64.  
  65. func init() {
  66.     flag.Parse()
  67.     log.SetPrefix("\x1b[3" + ColorGray + "m")
  68. }
  69.  
  70. func main() {
  71.     pattern := *flag.String("w", "**/*.*", "watching glob pattern")
  72.  
  73.     if len(flag.Args()) == 0 {
  74.         fmt.Println("Usage: godemon gofile [args]\n\n" +
  75.             "See \"godemon --help\" for more.")
  76.         os.Exit(0)
  77.     }
  78.  
  79.     printLog(ColorYellow, "v"+Version)
  80.     printLog(ColorYellow, "watching:", pattern)
  81.  
  82.     file := flag.Arg(0) + ".go"
  83.     args := flag.Args()[1:]
  84.  
  85.     for {
  86.         var wg sync.WaitGroup
  87.         kill := make(chan bool)
  88.  
  89.         wg.Add(1)
  90.         go startGo(file, args, &wg, &kill)
  91.         time.Sleep(time.Second)
  92.         kill <- true
  93.         wg.Wait()
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement