github.com/mattn/gom@v0.0.0-20190726063113-0ebf2b5d812d/exec.go (about) 1 package main 2 3 import ( 4 "github.com/daviddengcn/go-colortext" 5 "os" 6 "os/exec" 7 "os/signal" 8 "path/filepath" 9 "strings" 10 "syscall" 11 ) 12 13 type Color int 14 15 const ( 16 None Color = Color(ct.None) 17 Red Color = Color(ct.Red) 18 Blue Color = Color(ct.Blue) 19 Green Color = Color(ct.Green) 20 ) 21 22 func handleSignal() { 23 sc := make(chan os.Signal, 10) 24 signal.Notify(sc, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP) 25 go func() { 26 <-sc 27 ct.ResetColor() 28 os.Exit(0) 29 }() 30 } 31 32 func ready() error { 33 dir, err := os.Getwd() 34 if err != nil { 35 return err 36 } 37 38 vendor, err := filepath.Abs(vendorFolder) 39 if err != nil { 40 return err 41 } 42 43 for { 44 file := filepath.Join(dir, "Gomfile") 45 if isFile(file) { 46 vendor = filepath.Join(dir, vendorFolder) 47 break 48 } 49 next := filepath.Clean(filepath.Join(dir, "..")) 50 if next == dir { 51 dir = "" 52 break 53 } 54 dir = next 55 } 56 57 binPath := os.Getenv("PATH") + 58 string(filepath.ListSeparator) + 59 filepath.Join(vendor, "bin") 60 err = os.Setenv("PATH", binPath) 61 if err != nil { 62 return err 63 } 64 65 var paths []string 66 if dir == "" { 67 paths = []string{vendor, os.Getenv("GOPATH")} 68 } else { 69 paths = []string{vendor, dir, os.Getenv("GOPATH")} 70 } 71 vendor = strings.Join(paths, string(filepath.ListSeparator)) 72 err = os.Setenv("GOPATH", vendor) 73 if err != nil { 74 return err 75 } 76 77 return nil 78 } 79 80 var stdout = os.Stdout 81 var stderr = os.Stderr 82 var stdin = os.Stdin 83 84 func run(args []string, c Color) error { 85 if err := ready(); err != nil { 86 return err 87 } 88 if len(args) == 0 { 89 usage() 90 } 91 cmd := exec.Command(args[0], args[1:]...) 92 cmd.Stdout = stdout 93 cmd.Stderr = stderr 94 cmd.Stdin = stdin 95 ct.ChangeColor(ct.Color(c), true, ct.None, false) 96 err := cmd.Run() 97 ct.ResetColor() 98 return err 99 }