-
Notifications
You must be signed in to change notification settings - Fork 0
/
gitignore.go
129 lines (106 loc) · 2.69 KB
/
gitignore.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
128
129
package gitignore
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
)
// Parsed response from GitHub API containing relevant repository details
type RepoResponse struct {
// Parsed list of relevant file data from repository
Data []RepoResponseItem
// HTTP Response object
HTTPResponse *http.Response
}
// Close the HTTP Response Body
func (r *RepoResponse) Close() {
r.HTTPResponse.Body.Close()
}
// A parsed, single relevant file item from GitHub's gitignore repository
type RepoResponseItem struct {
// Name of gitignore file
TypeName string `json:"name"`
// URL pointing to a downloadable gitignore file
DownloadURL string `json:"download_url"`
}
// Name or type of a .gitignore file
type Type struct {
// Complete .gitignore file name (e.g. "Go.gitignore")
Name string
}
// Shortened, lowercased version of FileName (e.g. "go" (from Go.gitignore))
func (t *Type) ShortName() string {
return strings.ToLower(strings.TrimSuffix(t.Name, ".gitignore"))
}
// Requested gitignore type does not exist
type DoesNotExistError struct {
TypeName string
}
func (e *DoesNotExistError) Error() string {
return fmt.Sprintf("%s.gitignore does not exist.", e.TypeName)
}
// Make an initial
func Request() (*RepoResponse, error) {
response, err := http.Get("https://api.github.com/repos/github/gitignore/contents")
if err != nil {
return nil, err
}
body, err := io.ReadAll(response.Body)
if err != nil {
return nil, err
}
var contents []RepoResponseItem
err = json.Unmarshal(body, &contents)
if err != nil {
return nil, err
}
result := &RepoResponse{
HTTPResponse: response,
Data: contents,
}
return result, nil
}
// Fetch a list of supported gitignore types that can be fetched
func TypesList(repoResponse *RepoResponse) []Type {
types := make([]Type, 0)
for _, v := range repoResponse.Data {
if !strings.HasSuffix(v.TypeName, ".gitignore") {
continue
}
t := Type{
Name: v.TypeName,
}
types = append(types, t)
}
return types
}
// Fetch gitignore file content from a URL that points to the file
func FetchFromURL(rawFileURL string) ([]byte, error) {
response, err := http.Get(rawFileURL)
if err != nil {
return nil, err
}
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil {
return nil, err
}
return body, nil
}
// Fetch gitignore file content from a short name
func FetchFromShortName(repoResponse *RepoResponse, shortName string) ([]byte, error) {
url := ""
for _, v := range repoResponse.Data {
if strings.ToLower(v.TypeName) == strings.ToLower(shortName+".gitignore") {
url = v.DownloadURL
break
}
}
if url == "" {
return nil, &DoesNotExistError{
TypeName: shortName,
}
}
return FetchFromURL(url)
}