-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
126 lines (103 loc) · 2.24 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
package main
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"github.com/google/go-github/v25/github"
"golang.org/x/oauth2"
)
func main() {
ctx := context.Background()
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: "REPLACE_ME"},
)
tc := oauth2.NewClient(ctx, ts)
client := github.NewClient(tc)
// list all repositories for the authenticated user
languages := []string{
"c",
"cpp",
"css",
"html",
"php",
"scala",
"csharp",
"swift",
"go",
"rust",
"python",
"ruby",
"java",
"javascript",
"typescript",
"shell",
"ocaml",
"clojure",
"kotlin",
"julia",
"elixir",
"erlang",
"haskell",
"r",
"perl",
"lua",
"matlab",
}
repoMap := map[string][]string{}
for _, language := range languages {
rs, err := getRepos(ctx, client, language)
if err != nil {
log.Fatalf("error when fetching repos, err: %q", err)
}
names := []string{}
for _, r := range rs {
names = append(names, *r.FullName)
}
repoMap[language] = names
}
file, err := json.MarshalIndent(repoMap, "", " ")
if err != nil {
log.Fatalf("error when marshalling json, err: %q", err)
}
err = ioutil.WriteFile("repos.json", file, 0644)
if err != nil {
log.Fatalf("error when writing json file, err: %q", err)
}
}
func writeRepos(fileName string, repoNames []string) {
file, err := json.MarshalIndent(repoNames, "", " ")
if err != nil {
log.Fatalf("error when marshalling json, err: %q", err)
}
err = ioutil.WriteFile(fmt.Sprintf("%s.json", fileName), file, 0644)
if err != nil {
log.Fatalf("error when writing json file, err: %q", err)
}
}
func getRepos(ctx context.Context, c *github.Client, language string) ([]github.Repository, error) {
var allRepos []github.Repository
opt := &github.SearchOptions{
Sort: "stars",
Order: "desc",
ListOptions: github.ListOptions{
PerPage: 100,
},
}
for {
if len(allRepos) >= 1000 {
return allRepos, nil
}
result, response, err := c.Search.Repositories(ctx, fmt.Sprintf("language:%s", language), opt)
if err != nil {
return nil, err
}
log.Printf("rate limit: %s", response.Rate)
allRepos = append(allRepos, result.Repositories...)
if response.NextPage == 0 {
return allRepos, nil
}
opt.Page = response.NextPage
}
}