/
main.go
127 lines (112 loc) · 3.49 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
package main
import (
"fmt"
"os"
"github.com/codegangsta/cli"
"github.com/evizitei/jira-stats/jira"
)
func getDateFlag(c *cli.Context, defaultMessage string) string {
val := c.GlobalString("date-range")
if val == "default" {
println("Checking data for", defaultMessage, "...")
} else {
println("Checking data for", val, "...")
}
return val
}
func cycleTime(c *cli.Context) {
config, cnfErr := LoadConfig()
if cnfErr != nil {
println("Configuration Error:", cnfErr.Error())
return
}
dateRange := getDateFlag(c, "last 7 days")
jiraClient := jira.Client{Config: config.Jira}
api := jira.HttpApi{}
var result jira.SearchResult
err := jiraClient.QueryRecentlyClosedIssues(api, dateRange, &result)
if err != nil {
return
}
average, max := jira.CalculateCycleTime(result)
println(fmt.Sprintf("Project: %s", config.Jira.Project))
println(fmt.Sprintf("Username: %s", config.Jira.Username))
println(fmt.Sprintf("%d total issues resolved", result.Total))
println(fmt.Sprintf("average cycle time: %f hours", average))
println(fmt.Sprintf("max cycle time: %f hours", max))
}
func laptopToLive(c *cli.Context) {
config, cnfErr := LoadConfig()
if cnfErr != nil {
println("Configuration Error:", cnfErr.Error())
return
}
dateRange := getDateFlag(c, "last 6 weeks")
jiraClient := jira.Client{Config: config.Jira}
api := jira.HttpApi{}
var result jira.SearchResult
err := jiraClient.QueryRecentlyDeployedIssues(api, dateRange, &result)
changelogs, err := jiraClient.QueryChangelogsForResultSet(api, &result)
average, max := jira.CalculateLaptopToLive(changelogs)
if err != nil {
return
}
println(fmt.Sprintf("Project: %s", config.Jira.Project))
println(fmt.Sprintf("Username: %s", config.Jira.Username))
println(fmt.Sprintf("%d total issues deployed", result.Total))
println(fmt.Sprintf("average laptop-to-live time: %f hours", average))
println(fmt.Sprintf("max laptop-to-live time: %f hours", max))
}
func bugRatio(c *cli.Context) {
config, cnfErr := LoadConfig()
if cnfErr != nil {
println("Configuration Error:", cnfErr.Error())
return
}
dateRange := getDateFlag(c, "last 7 days")
jiraClient := jira.Client{Config: config.Jira}
api := jira.HttpApi{}
var result jira.SearchResult
err := jiraClient.QueryRecentlyCreatedIssues(api, dateRange, &result)
if err != nil {
return
}
bugsOverFeatures := jira.CalculateBugRatio(result)
println(fmt.Sprintf("Project: %s", config.Jira.Project))
println(fmt.Sprintf("Username: %s", config.Jira.Username))
println(fmt.Sprintf("%d total issues created", result.Total))
println(fmt.Sprintf("bug ratio (bugs/features): %f", bugsOverFeatures))
}
func main() {
app := cli.NewApp()
app.Name = "jira-stats"
app.Usage = "Gather metrics about a JIRA project"
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "date-range",
Value: "default",
Usage: "Date range to check data, the default value is specific to each command but is rational. Provided like \"YYYY-MM-DD:YYYY-MM-DD\" with the earlier date first.",
},
}
app.Commands = []cli.Command{
{
Name: "cycle-time",
Aliases: []string{"ct"},
Usage: "Calculate how long it takes on average from ticket-entry to done",
Action: cycleTime,
},
{
Name: "laptop-to-live",
Aliases: []string{"ltl"},
Usage: "Calculate cycle time for 'someone started' to 'on production'",
Action: laptopToLive,
},
{
Name: "bug-ratio",
Aliases: []string{"br"},
Usage: "give the ratio of bugs to feature tickets created",
Action: bugRatio,
},
}
app.Run(os.Args)
}