@@ -97,21 +97,26 @@ type tag struct {
97
97
}
98
98
99
99
func GetLatestTag (tool types.Tool ) (string , error ) {
100
- r , ok := getLatestRelease (tool )
100
+ r , ok , err := getLatestRelease (tool )
101
+ if err != nil {
102
+ return "" , err
103
+ }
104
+
101
105
if ! ok {
102
106
return "" , fmt .Errorf ("failed to get latest release for %s" , tool .Name )
103
107
}
108
+
104
109
return r .label , nil
105
110
}
106
111
107
- func getLatestRelease (tool types.Tool ) (* release , bool ) {
112
+ func getLatestRelease (tool types.Tool ) (* release , bool , error ) {
108
113
if tool .Source .Repo == nil || ! strings .HasPrefix (tool .Source .Repo .Root , "https://github.com/" ) {
109
- return nil , false
114
+ return nil , false , nil
110
115
}
111
116
112
117
parts := strings .Split (strings .TrimPrefix (strings .TrimSuffix (tool .Source .Repo .Root , ".git" ), "https://" ), "/" )
113
118
if len (parts ) != 3 {
114
- return nil , false
119
+ return nil , false , fmt . Errorf ( "invalid GitHub URL: %s" , tool . Source . Repo . Root )
115
120
}
116
121
117
122
client := http.Client {
@@ -124,41 +129,39 @@ func getLatestRelease(tool types.Tool) (*release, bool) {
124
129
125
130
resp , err := client .Get (fmt .Sprintf ("https://api.github.com/repos/%s/%s/tags" , account , repo ))
126
131
if err != nil {
127
- // ignore error
128
- return nil , false
132
+ return nil , false , fmt .Errorf ("failed to get tags: %w" , err )
129
133
}
130
134
defer resp .Body .Close ()
131
135
if resp .StatusCode != http .StatusOK {
132
- return nil , false
136
+ return nil , false , fmt . Errorf ( "unexpected status when getting tags: %s" , resp . Status )
133
137
}
134
138
135
139
var tags []tag
136
140
if err := json .NewDecoder (resp .Body ).Decode (& tags ); err != nil {
137
- return nil , false
141
+ return nil , false , fmt . Errorf ( "failed to decode GitHub tags: %w" , err )
138
142
}
139
143
for _ , tag := range tags {
140
144
if tag .Commit .Sha == tool .Source .Repo .Revision {
141
145
return & release {
142
146
account : account ,
143
147
repo : repo ,
144
148
label : tag .Name ,
145
- }, true
149
+ }, true , nil
146
150
}
147
151
}
148
152
149
153
resp , err = client .Get (fmt .Sprintf ("https://github.com/%s/%s/releases/latest" , account , repo ))
150
154
if err != nil {
151
- // ignore error
152
- return nil , false
155
+ return nil , false , fmt .Errorf ("failed to get latest release: %w" , err )
153
156
}
154
157
defer resp .Body .Close ()
155
158
if resp .StatusCode != http .StatusFound {
156
- return nil , false
159
+ return nil , false , fmt . Errorf ( "unexpected status when getting latest release: %s" , resp . Status )
157
160
}
158
161
159
162
target := resp .Header .Get ("Location" )
160
163
if target == "" {
161
- return nil , false
164
+ return nil , false , nil
162
165
}
163
166
164
167
parts = strings .Split (target , "/" )
@@ -168,7 +171,7 @@ func getLatestRelease(tool types.Tool) (*release, bool) {
168
171
account : account ,
169
172
repo : repo ,
170
173
label : label ,
171
- }, true
174
+ }, true , nil
172
175
}
173
176
174
177
func get (ctx context.Context , url string ) (* http.Response , error ) {
@@ -249,7 +252,8 @@ func (r *Runtime) Binary(ctx context.Context, tool types.Tool, _, toolSource str
249
252
return false , nil , nil
250
253
}
251
254
252
- rel , ok := getLatestRelease (tool )
255
+ // ignore the error
256
+ rel , ok , _ := getLatestRelease (tool )
253
257
if ! ok {
254
258
return false , nil , nil
255
259
}
@@ -286,7 +290,8 @@ func (r *Runtime) DownloadCredentialHelper(ctx context.Context, tool types.Tool,
286
290
return nil
287
291
}
288
292
289
- rel , ok := getLatestRelease (tool )
293
+ // ignore the error
294
+ rel , ok , _ := getLatestRelease (tool )
290
295
if ! ok {
291
296
return fmt .Errorf ("failed to find %s release" , r .ID ())
292
297
}
0 commit comments