-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
172 lines (156 loc) · 3.84 KB
/
main.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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"strings"
"text/tabwriter"
"text/template"
"github.com/urfave/cli/v2"
"gopkg.in/yaml.v2"
)
type User struct {
ShortName string
FullName string
Email string
}
type MessageContent struct {
Collaborators []User
Message string
TicketTag string
TicketNumber int
}
type Config struct {
Users []User
TicketTag string
}
func main() {
var ConfigPath = getConfigPath()
var team, ticketTag = loadConfig(ConfigPath)
var pair string
var FullMsg MessageContent
FullMsg.TicketTag = ticketTag
app := &cli.App{
Name: "Git Team template ",
Usage: "Easy to use git comment generator",
Commands: []*cli.Command{
{
Name: "commit",
Usage: "Record changes to the repository",
Flags: []cli.Flag{
&cli.StringFlag{
Name: "message, m",
Aliases: []string{"m"},
Usage: "commit message ",
Destination: &FullMsg.Message,
Required: true,
},
&cli.StringFlag{
Name: "pair",
Aliases: []string{"p"},
Usage: "add pair(s) name(s) to commit message",
Destination: &pair,
},
&cli.IntFlag{
Name: "ticket",
Aliases: []string{"t"},
Usage: "add ticket number to commit message",
Destination: &FullMsg.TicketNumber,
},
},
Action: func(c *cli.Context) error {
FullMsg.Collaborators = getPairDetails(pair, team)
formattedMsg, err := format(FullMsg)
if err != nil {
return err
}
return commitMsg(formattedMsg)
},
},
{
Name: "pair-list",
Aliases: []string{"pl"},
Usage: "List available pairs",
Action: func(c *cli.Context) error {
printPairs(team)
return nil
},
},
},
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
func getConfigPath() string {
defaultPath := "./config.yml"
pathFromEnvironmentVariable := os.Getenv("GIT_TEAM_CONFIG_PATH")
if len(pathFromEnvironmentVariable) == 0 {
return defaultPath
}
return pathFromEnvironmentVariable
}
func printPairs(team []User) {
tabFormat := new(tabwriter.Writer)
tabFormat.Init(os.Stdout, 8, 8, 0, '\t', 0)
defer tabFormat.Flush()
fmt.Fprintf(tabFormat, "\n %s\t\t%s\t%s\t", "User", "FullName", "Email")
fmt.Fprintf(tabFormat, "\n %s\t\t%s\t%s\t", "----", "----", "----")
for _, user := range team {
fmt.Fprintf(tabFormat, "\n %s\t\t%s\t%s\t", user.ShortName, user.FullName, user.Email)
}
}
func getPairDetails(pair string, team []User) []User {
var pairNames = strings.Split(pair, ",")
var pairDetails []User
for _, pairName := range pairNames {
for _, collaborator := range team {
if pairName == collaborator.ShortName {
pairDetails = append(pairDetails, collaborator)
}
}
}
return pairDetails
}
func commitMsg(formattedMsg string) error {
cmd := exec.Command("git", "commit", "-m", formattedMsg)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
return fmt.Errorf("Commit unsuccessful: %w - %s\n", err, stderr.String())
} else {
fmt.Println("Commit successful: " + out.String())
return nil
}
}
func format(FullMsg MessageContent) (string, error) {
buf := new(bytes.Buffer)
t, err := template.New("commitMessage").Parse(msgFormat)
if err != nil {
return "", fmt.Errorf("Error creating template: %w\n", err)
}
err = t.Execute(buf, FullMsg)
if err != nil {
return "", fmt.Errorf("Error parsing template: %w\n", err)
}
return buf.String(), nil
}
func loadConfig(configPath string) ([]User, string) {
data, err := ioutil.ReadFile(configPath)
if err != nil {
fmt.Errorf("Error while loading config file: %w\n", err)
}
var config Config
err = yaml.Unmarshal(data, &config)
if err != nil {
fmt.Errorf("Error while marshaling: %w\n", err)
}
return config.Users, config.TicketTag
}