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  }