1
|
|
|
// Copyright 2018 Fedir RYKHTIK. All rights reserved. |
2
|
|
|
// Use of this source code is governed by the GNU GPL 3.0 |
3
|
|
|
// license that can be found in the LICENSE file. |
4
|
|
|
|
5
|
|
|
// ghstat - statistical multi-criteria decision-making comparator for Github's projects. |
6
|
|
|
package main |
7
|
|
|
|
8
|
|
|
import ( |
9
|
|
|
"flag" |
10
|
|
|
"os" |
11
|
|
|
"strings" |
12
|
|
|
"sync" |
13
|
|
|
|
14
|
|
|
"github.com/fedir/ghstat/github" |
15
|
|
|
) |
16
|
|
|
|
17
|
|
|
func main() { |
18
|
1 |
|
var ( |
19
|
|
|
clearHTTPCache = flag.Bool("cc", false, "Clear HTTP cache") |
20
|
|
|
clearHTTPCacheDryRun = flag.Bool("ccdr", false, "Clear HTTP cache (dry run)") |
21
|
|
|
debug = flag.Bool("d", false, "Debug mode") |
22
|
|
|
resultFileSavePath = flag.String("f", "", "File path where result CSV file will be saved") |
23
|
|
|
rateLimitCheck = flag.Bool("l", false, "Rate limit check") |
24
|
|
|
repositoriesKeysManual = flag.String("r", "", "Repositories keys") |
25
|
|
|
tmpFolder = flag.String("t", "test_data", "Temporary folder path") |
26
|
|
|
repositoriesKeys = []string{} |
27
|
|
|
) |
28
|
1 |
|
flag.Parse() |
29
|
1 |
|
if *clearHTTPCache || *clearHTTPCacheDryRun { |
30
|
|
|
clearHTTPCacheFolder(*tmpFolder, *clearHTTPCacheDryRun) |
31
|
|
|
os.Exit(0) |
32
|
|
|
} |
33
|
1 |
|
if *rateLimitCheck { |
34
|
|
|
github.CheckAndPrintRateLimit() |
35
|
|
|
os.Exit(0) |
36
|
|
|
} |
37
|
1 |
|
if *repositoriesKeysManual != "" { |
38
|
|
|
repositoriesKeys = uniqSlice(strings.Split(*repositoriesKeysManual, ",")) |
39
|
|
|
} else { |
40
|
1 |
|
repositoriesKeys = uniqSlice([]string{ |
41
|
|
|
"astaxie/beego", |
42
|
|
|
"gohugoio/hugo", |
43
|
|
|
"gin-gonic/gin", |
44
|
|
|
"labstack/echo", |
45
|
|
|
"revel/revel", |
46
|
|
|
"gobuffalo/buffalo", |
47
|
|
|
"go-chi/chi", |
48
|
|
|
"kataras/iris", |
49
|
|
|
"zenazn/goji", |
50
|
|
|
"go-macaron/macaron", |
51
|
|
|
"go-aah/aah", |
52
|
|
|
}) |
53
|
|
|
} |
54
|
|
|
|
55
|
1 |
|
csvFilePath := "" |
56
|
1 |
|
if *resultFileSavePath != "" { |
57
|
|
|
csvFilePath = *resultFileSavePath |
58
|
|
|
} else { |
59
|
1 |
|
csvFilePath = "result.csv" |
60
|
|
|
} |
61
|
1 |
|
var ghData = []Repository{} |
62
|
1 |
|
var wg sync.WaitGroup |
63
|
1 |
|
wg.Add(len(repositoriesKeys)) |
64
|
|
|
|
65
|
1 |
|
dataChan := make(chan Repository, len(repositoriesKeys)) |
66
|
1 |
|
for _, rKey := range repositoriesKeys { |
67
|
1 |
|
go repositoryData(rKey, *tmpFolder, *debug, dataChan, &wg) |
68
|
|
|
} |
69
|
1 |
|
for range repositoriesKeys { |
70
|
1 |
|
ghData = append(ghData, <-dataChan) |
71
|
|
|
} |
72
|
1 |
|
wg.Wait() |
73
|
1 |
|
rateAndPrintGreetings(ghData) |
74
|
1 |
|
writeCSVStatistics(ghData, csvFilePath) |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
func uniqSlice(s []string) []string { |
78
|
1 |
|
unique := make(map[string]bool, len(s)) |
79
|
1 |
|
us := make([]string, len(unique)) |
80
|
1 |
|
for _, elem := range s { |
81
|
1 |
|
if len(elem) != 0 { |
82
|
1 |
|
if !unique[elem] { |
83
|
1 |
|
us = append(us, elem) |
84
|
1 |
|
unique[elem] = true |
85
|
|
|
} |
86
|
|
|
} |
87
|
|
|
} |
88
|
1 |
|
return us |
89
|
|
|
} |
90
|
|
|
|