@@ -6,37 +6,115 @@ import (
6
6
"fmt"
7
7
"io/ioutil"
8
8
"net/http"
9
+ "reflect"
10
+ "strings"
9
11
"time"
10
12
11
13
"github.com/cli/cli/api"
12
14
"github.com/cli/cli/internal/ghinstance"
13
15
"github.com/cli/cli/internal/ghrepo"
14
16
)
15
17
18
+ var ReleaseFields = []string {
19
+ "url" ,
20
+ "apiUrl" ,
21
+ "uploadUrl" ,
22
+ "tarballUrl" ,
23
+ "zipballUrl" ,
24
+ "id" ,
25
+ "tagName" ,
26
+ "name" ,
27
+ "body" ,
28
+ "isDraft" ,
29
+ "isPrerelease" ,
30
+ "createdAt" ,
31
+ "publishedAt" ,
32
+ "targetCommitish" ,
33
+ "author" ,
34
+ "assets" ,
35
+ }
36
+
16
37
type Release struct {
17
- TagName string `json:"tag_name"`
18
- Name string `json:"name"`
19
- Body string `json:"body"`
20
- IsDraft bool `json:"draft"`
21
- IsPrerelease bool `json:"prerelease"`
22
- CreatedAt time.Time `json:"created_at"`
23
- PublishedAt time.Time `json:"published_at"`
24
-
25
- APIURL string `json:"url"`
26
- UploadURL string `json:"upload_url"`
27
- HTMLURL string `json:"html_url"`
28
- Assets []ReleaseAsset
38
+ ID string `json:"node_id"`
39
+ TagName string `json:"tag_name"`
40
+ Name string `json:"name"`
41
+ Body string `json:"body"`
42
+ IsDraft bool `json:"draft"`
43
+ IsPrerelease bool `json:"prerelease"`
44
+ CreatedAt time.Time `json:"created_at"`
45
+ PublishedAt * time.Time `json:"published_at"`
46
+
47
+ TargetCommitish string `json:"target_commitish"`
48
+
49
+ APIURL string `json:"url"`
50
+ UploadURL string `json:"upload_url"`
51
+ TarballURL string `json:"tarball_url"`
52
+ ZipballURL string `json:"zipball_url"`
53
+ URL string `json:"html_url"`
54
+ Assets []ReleaseAsset
29
55
30
56
Author struct {
31
- Login string
57
+ ID string `json:"node_id"`
58
+ Login string `json:"login"`
32
59
}
33
60
}
34
61
35
62
type ReleaseAsset struct {
63
+ ID string `json:"node_id"`
36
64
Name string
65
+ Label string
37
66
Size int64
38
67
State string
39
68
APIURL string `json:"url"`
69
+
70
+ CreatedAt time.Time `json:"created_at"`
71
+ UpdatedAt time.Time `json:"updated_at"`
72
+ DownloadCount int `json:"download_count"`
73
+ ContentType string `json:"content_type"`
74
+ BrowserDownloadURL string `json:"browser_download_url"`
75
+ }
76
+
77
+ func (rel * Release ) ExportData (fields []string ) * map [string ]interface {} {
78
+ v := reflect .ValueOf (rel ).Elem ()
79
+ fieldByName := func (v reflect.Value , field string ) reflect.Value {
80
+ return v .FieldByNameFunc (func (s string ) bool {
81
+ return strings .EqualFold (field , s )
82
+ })
83
+ }
84
+ data := map [string ]interface {}{}
85
+
86
+ for _ , f := range fields {
87
+ switch f {
88
+ case "author" :
89
+ data [f ] = map [string ]interface {}{
90
+ "id" : rel .Author .ID ,
91
+ "login" : rel .Author .Login ,
92
+ }
93
+ case "assets" :
94
+ assets := make ([]interface {}, 0 , len (rel .Assets ))
95
+ for _ , a := range rel .Assets {
96
+ assets = append (assets , map [string ]interface {}{
97
+ "url" : a .BrowserDownloadURL ,
98
+ "apiUrl" : a .APIURL ,
99
+ "id" : a .ID ,
100
+ "name" : a .Name ,
101
+ "label" : a .Label ,
102
+ "size" : a .Size ,
103
+ "state" : a .State ,
104
+ "createdAt" : a .CreatedAt ,
105
+ "updatedAt" : a .UpdatedAt ,
106
+ "downloadCount" : a .DownloadCount ,
107
+ "contentType" : a .ContentType ,
108
+ })
109
+ }
110
+ data [f ] = assets
111
+ default :
112
+ sf := fieldByName (v , f )
113
+ data [f ] = sf .Interface ()
114
+ }
115
+ }
116
+
117
+ return & data
40
118
}
41
119
42
120
// FetchRelease finds a repository release by its tagName.
@@ -55,11 +133,7 @@ func FetchRelease(httpClient *http.Client, baseRepo ghrepo.Interface, tagName st
55
133
defer resp .Body .Close ()
56
134
57
135
if resp .StatusCode == 404 {
58
- if canPush , err := api .CanPushToRepo (httpClient , baseRepo ); err == nil && canPush {
59
- return FindDraftRelease (httpClient , baseRepo , tagName )
60
- } else if err != nil {
61
- return nil , err
62
- }
136
+ return FindDraftRelease (httpClient , baseRepo , tagName )
63
137
}
64
138
65
139
if resp .StatusCode > 299 {
@@ -152,11 +226,8 @@ func FindDraftRelease(httpClient *http.Client, baseRepo ghrepo.Interface, tagNam
152
226
return & r , nil
153
227
}
154
228
}
155
-
156
- if len (releases ) < perPage {
157
- break
158
- }
159
- page ++
229
+ //nolint:staticcheck
230
+ break
160
231
}
161
232
162
233
return nil , errors .New ("release not found" )
0 commit comments