-
Notifications
You must be signed in to change notification settings - Fork 52
/
util.go
144 lines (118 loc) · 3.42 KB
/
util.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package util
import (
"fmt"
"io"
"log"
"os"
"os/exec"
"path"
"strings"
"sync"
"text/template"
"github.com/kyokomi/emoji"
"github.com/google/uuid"
"github.com/logrusorgru/aurora"
)
func CreateDirIfDoesNotExist(path string) error {
if _, err := os.Stat(path); os.IsNotExist(err) {
err = os.MkdirAll(path, os.ModePerm)
return err
}
return nil
}
func CleanGoIdentifier(identifier string) string {
return strings.ReplaceAll(identifier, "-", "")
}
var FuncMap = template.FuncMap{
"Title": strings.Title,
"ToLower": strings.ToLower,
"CleanGoIdentifier": CleanGoIdentifier,
"GenerateUUID": uuid.New,
}
func GetCwd() string {
dir, err := os.Getwd()
if err != nil {
log.Fatalf("Getting working directory failed: %v\n", err)
panic(err)
}
return dir
}
func createTemplatedFile(fullFilePath string, template *template.Template, wg *sync.WaitGroup, data interface{}) {
f, err := os.Create(fullFilePath)
if err != nil {
log.Println(aurora.Red(emoji.Sprintf(":exclamation: Error creating file '%s' : %v", fullFilePath, err)))
}
wg.Add(1)
go func() {
err = template.Execute(f, data)
if err != nil {
log.Println(aurora.Red(emoji.Sprintf(":exclamation: Error templating '%s': %v", fullFilePath, err)))
}
log.Println(aurora.Green(emoji.Sprintf(":white_check_mark: Finished templating : %v", fullFilePath)))
wg.Done()
}()
}
func TemplateFileAndOverwrite(fileDir string, fileName string, template *template.Template, wg *sync.WaitGroup, data interface{}) {
fullFilePath := fmt.Sprintf("%v/%v", fileDir, fileName)
err := os.MkdirAll(fileDir, os.ModePerm)
if err != nil {
log.Println(aurora.Red(emoji.Sprintf(":exclamation: Error creating directory %v: %v", fullFilePath, err)))
}
createTemplatedFile(fullFilePath, template, wg, data)
}
func TemplateFileIfDoesNotExist(fileDir string, fileName string, template *template.Template, wg *sync.WaitGroup, data interface{}) {
fullFilePath := path.Join(fileDir, fileName)
if _, err := os.Stat(fullFilePath); os.IsNotExist(err) {
if fileDir != "" {
err := CreateDirIfDoesNotExist(fileDir)
if err != nil {
log.Println(aurora.Red(emoji.Sprintf(":exclamation: Error creating directory %v: %v", fullFilePath, err)))
}
}
createTemplatedFile(fullFilePath, template, wg, data)
} else {
log.Println(aurora.Yellow(emoji.Sprintf("%v already exists. skipping.", fullFilePath)))
}
}
func ExecuteCommand(cmd *exec.Cmd, pathPrefix string, envars []string) {
dir := GetCwd()
cmd.Dir = path.Join(dir, pathPrefix)
stdoutPipe, _ := cmd.StdoutPipe()
stderrPipe, _ := cmd.StderrPipe()
var errStdout, errStderr error
if envars != nil {
cmd.Env = envars
}
err := cmd.Start()
if err != nil {
log.Fatalf("Starting command failed: %v\n", err)
}
go func() {
_, errStdout = io.Copy(os.Stdout, stdoutPipe)
}()
go func() {
_, errStderr = io.Copy(os.Stderr, stderrPipe)
}()
err = cmd.Wait()
if err != nil {
log.Fatalf("Executing command failed: %v\n", err)
}
if errStdout != nil {
log.Printf("Failed to capture stdout: %v\n", errStdout)
}
if errStderr != nil {
log.Printf("Failed to capture stderr: %v\n", errStderr)
}
}
func ExecuteCommandOutput(cmd *exec.Cmd, pathPrefix string, envars []string) string {
dir := GetCwd()
cmd.Dir = path.Join(dir, pathPrefix)
if envars != nil {
cmd.Env = envars
}
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("Executing command failed: (%v) %s\n", err, out)
}
return string(out)
}