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