forked from caarlos0/org-stats
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
115 lines (109 loc) · 2.51 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
package main
import (
"fmt"
"os"
orgstats "github.com/caarlos0/org-stats/orgstats"
"github.com/caarlos0/spin"
"github.com/urfave/cli"
)
var version = "master"
func main() {
app := cli.NewApp()
app.Name = "org-stats"
app.Version = version
app.Author = "Carlos Alexandro Becker (caarlos0@gmail.com)"
app.Usage = "Get the contributor stats summary from all repos of any given organization"
app.Flags = []cli.Flag{
cli.StringFlag{
EnvVar: "GITHUB_TOKEN",
Name: "token",
Usage: "Your GitHub token",
},
cli.StringFlag{
Name: "org, o",
Usage: "GitHub organization to scan",
},
cli.StringSliceFlag{
Name: "blacklist, b",
Usage: "Blacklist repos and/or users",
},
cli.IntFlag{
Name: "top",
Usage: "How many users to show",
Value: 3,
},
cli.StringFlag{
Name: "github-url",
Usage: "Custom GitHub URL (for GitHub Enterprise for example)",
},
}
app.Action = func(c *cli.Context) error {
var token = c.String("token")
var org = c.String("org")
var blacklist = c.StringSlice("blacklist")
var top = c.Int("top")
if token == "" {
return cli.NewExitError("missing github api token", 1)
}
if org == "" {
return cli.NewExitError("missing organization name", 1)
}
var spin = spin.New(" \033[36m%s Gathering data for '" + org + "'...\033[m")
spin.Start()
allStats, err := orgstats.Gather(token, org, blacklist, c.String("github-url"))
spin.Stop()
if err != nil {
return cli.NewExitError(err.Error(), 1)
}
printHighlights(allStats, top)
return nil
}
if err := app.Run(os.Args); err != nil {
panic(err)
}
}
func printHighlights(s orgstats.Stats, top int) {
data := []struct {
stats []orgstats.StatPair
trophy string
kind string
}{
{
stats: orgstats.Sort(s, orgstats.ExtractCommits),
trophy: "Commit",
kind: "commits",
}, {
stats: orgstats.Sort(s, orgstats.ExtractAdditions),
trophy: "Lines Added",
kind: "lines added",
}, {
stats: orgstats.Sort(s, orgstats.ExtractDeletions),
trophy: "Housekeeper",
kind: "lines removed",
},
}
for _, d := range data {
fmt.Printf("\033[1m%s champions are:\033[0m\n", d.trophy)
var j = top
if len(d.stats) < j {
j = len(d.stats)
}
for i := 0; i < j; i++ {
fmt.Printf(
"%s %s with %d %s!\n",
emojiForPos(i),
d.stats[i].Key,
d.stats[i].Value,
d.kind,
)
}
fmt.Printf("\n")
}
}
func emojiForPos(pos int) string {
var emojis = []string{"\U0001f3c6", "\U0001f948", "\U0001f949"}
if pos < len(emojis) {
return emojis[pos]
}
return " "
}