/
dotrun.go
88 lines (82 loc) · 1.7 KB
/
dotrun.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
import (
"fmt"
"os"
"os/exec"
"os/user"
"path/filepath"
"strings"
"syscall"
"github.com/joho/godotenv"
)
const (
help = `Usage: dotrun [-env .env] command args...
-env file Alternative dotenv file
command The command to run
args The command arguments`
)
// Execute runs command with given arguments and return exit value.
func Execute(command string, args ...string) int {
cmd := exec.Command(command, args...)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
err := cmd.Run()
exit := 0
if err != nil {
message := err.Error()
if !strings.HasPrefix(message, "exit status") {
println(message)
}
if exitError, ok := err.(*exec.ExitError); ok {
ws := exitError.Sys().(syscall.WaitStatus)
exit = ws.ExitStatus()
} else {
exit = -4
}
}
return exit
}
func expandPath(path string) string {
usr, _ := user.Current()
dir := usr.HomeDir
if strings.HasPrefix(path, "~/") {
return filepath.Join(dir, path[2:])
}
return path
}
func main() {
if os.Args[1] == "-help" {
println(help)
os.Exit(0)
}
if len(os.Args) < 2 {
println("ERROR you must pass command to run on command line")
println(help)
os.Exit(-1)
}
var file = ".env"
var command string
var args []string
if os.Args[1] == "-env" {
if len(os.Args) < 3 {
println("ERROR you must specify dotenv file after '-env' option")
os.Exit(-1)
}
file = os.Args[2]
command = os.Args[3]
args = os.Args[4:]
} else {
command = os.Args[1]
args = os.Args[2:]
}
file = expandPath(file)
err := godotenv.Load(file)
if err != nil {
println(fmt.Sprintf("ERROR loading dotenv file '%s': %v", file, err))
}
exit := Execute(command, args...)
if exit != 0 {
os.Exit(exit)
}
}