This repository has been archived by the owner on Dec 13, 2020. It is now read-only.
/
gists.go
123 lines (107 loc) · 2.84 KB
/
gists.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
package api
import (
"errors"
"sort"
"strings"
"time"
"github.com/Robpol86/githubBackup/config"
"github.com/google/go-github/github"
)
// GitHubGist holds data for one GitHub Gist.
type GitHubGist struct {
Name string
Size int
Private bool
PushedAt time.Time
CloneURL string
HasComments bool
}
// GitHubGists is a slice of GitHubGist with attached convenience function receivers.
type GitHubGists []GitHubGist
// Counts returns the number of gists (values) for specific types/categories (keys).
func (g *GitHubGists) Counts() map[string]int {
counts := map[string]int{
"all": 0,
"public": 0,
"private": 0,
"comments": 0,
}
for _, gist := range *g {
counts["all"]++
if gist.Private {
counts["private"]++
} else {
counts["public"]++
}
if gist.HasComments {
counts["comments"]++
}
}
return counts
}
func (a *API) parseGist(gist *github.Gist, name string, size int, ghGists *GitHubGists) {
ghGist := GitHubGist{
Name: name,
Size: size,
Private: !*gist.Public,
PushedAt: *gist.UpdatedAt,
CloneURL: *gist.GitPullURL,
HasComments: *gist.Comments > 0,
}
// Override if no comments desired.
if a.NoComments {
ghGist.HasComments = false
}
*ghGists = append(*ghGists, ghGist)
}
// GetGists retrieves the list of public and secret GitHub gists on the user's account.
//
// :param ghGists: Add gists to this.
func (a *API) GetGists(ghGists *GitHubGists) error {
log := config.GetLogger()
client := a.getClient()
// Configure request options.
options := github.GistListOptions{}
options.PerPage = 100
for {
// Query API.
gists, response, err := client.Gists.List(a.User, &options)
logWithFields := log.WithField("page", options.ListOptions.Page).WithField("numGists", len(gists))
logWithFields.WithField("response", response).Debug("Got response from GitHub gists API.")
if err != nil {
if strings.HasPrefix(err.Error(), "invalid character ") {
err = errors.New("invalid JSON response from server")
}
logWithFields.WithField("error", err.Error()).Debug("Failed to query for gists.")
return err
}
// Note rate limiting.
a.Limit = response.Limit
a.Remaining = response.Remaining
a.Reset = response.Reset
// Parse.
for _, gist := range gists {
var fileNames []string
var size int
for name, data := range gist.Files {
fileNames = append(fileNames, string(name))
size += *data.Size
}
sort.Strings(fileNames)
name := fileNames[0]
if a.NoPublic && *gist.Public {
logWithFields.Debugf("Skipping public gist: %s", name)
} else if a.NoPrivate && !*gist.Public {
logWithFields.Debugf("Skipping secret gist: %s", name)
} else {
a.parseGist(gist, name, size, ghGists)
}
}
// Next page or exit.
if response.NextPage == 0 {
break
}
options.ListOptions.Page = response.NextPage
}
return nil
}