@@ -196,6 +196,26 @@ func (p *proxyRepo) ModulePath() string {
196
196
return p .path
197
197
}
198
198
199
+ // versionError returns err wrapped in a ModuleError for p.path.
200
+ func (p * proxyRepo ) versionError (version string , err error ) error {
201
+ if version != "" && version != module .CanonicalVersion (version ) {
202
+ return & module.ModuleError {
203
+ Path : p .path ,
204
+ Err : & module.InvalidVersionError {
205
+ Version : version ,
206
+ Pseudo : IsPseudoVersion (version ),
207
+ Err : err ,
208
+ },
209
+ }
210
+ }
211
+
212
+ return & module.ModuleError {
213
+ Path : p .path ,
214
+ Version : version ,
215
+ Err : err ,
216
+ }
217
+ }
218
+
199
219
func (p * proxyRepo ) getBytes (path string ) ([]byte , error ) {
200
220
body , err := p .getBody (path )
201
221
if err != nil {
@@ -226,7 +246,7 @@ func (p *proxyRepo) getBody(path string) (io.ReadCloser, error) {
226
246
func (p * proxyRepo ) Versions (prefix string ) ([]string , error ) {
227
247
data , err := p .getBytes ("@v/list" )
228
248
if err != nil {
229
- return nil , err
249
+ return nil , p . versionError ( "" , err )
230
250
}
231
251
var list []string
232
252
for _ , line := range strings .Split (string (data ), "\n " ) {
@@ -242,7 +262,7 @@ func (p *proxyRepo) Versions(prefix string) ([]string, error) {
242
262
func (p * proxyRepo ) latest () (* RevInfo , error ) {
243
263
data , err := p .getBytes ("@v/list" )
244
264
if err != nil {
245
- return nil , err
265
+ return nil , p . versionError ( "" , err )
246
266
}
247
267
var best time.Time
248
268
var bestVersion string
@@ -257,7 +277,7 @@ func (p *proxyRepo) latest() (*RevInfo, error) {
257
277
}
258
278
}
259
279
if bestVersion == "" {
260
- return nil , fmt . Errorf ( "no commits" )
280
+ return nil , p . versionError ( "" , codehost . ErrNoCommits )
261
281
}
262
282
info := & RevInfo {
263
283
Version : bestVersion ,
@@ -271,21 +291,21 @@ func (p *proxyRepo) latest() (*RevInfo, error) {
271
291
func (p * proxyRepo ) Stat (rev string ) (* RevInfo , error ) {
272
292
encRev , err := module .EncodeVersion (rev )
273
293
if err != nil {
274
- return nil , err
294
+ return nil , p . versionError ( rev , err )
275
295
}
276
296
data , err := p .getBytes ("@v/" + encRev + ".info" )
277
297
if err != nil {
278
- return nil , err
298
+ return nil , p . versionError ( rev , err )
279
299
}
280
300
info := new (RevInfo )
281
301
if err := json .Unmarshal (data , info ); err != nil {
282
- return nil , err
302
+ return nil , p . versionError ( rev , err )
283
303
}
284
304
if info .Version != rev && rev == module .CanonicalVersion (rev ) && module .Check (p .path , rev ) == nil {
285
305
// If we request a correct, appropriate version for the module path, the
286
306
// proxy must return either exactly that version or an error — not some
287
307
// arbitrary other version.
288
- return nil , fmt .Errorf ("requested canonical version %s, but proxy returned info for version %s" , rev , info .Version )
308
+ return nil , p . versionError ( rev , fmt .Errorf ("proxy returned info for version %s instead of requested version " , info .Version ) )
289
309
}
290
310
return info , nil
291
311
}
@@ -298,48 +318,48 @@ func (p *proxyRepo) Latest() (*RevInfo, error) {
298
318
}
299
319
info := new (RevInfo )
300
320
if err := json .Unmarshal (data , info ); err != nil {
301
- return nil , err
321
+ return nil , p . versionError ( "" , err )
302
322
}
303
323
return info , nil
304
324
}
305
325
306
326
func (p * proxyRepo ) GoMod (version string ) ([]byte , error ) {
307
327
if version != module .CanonicalVersion (version ) {
308
- return nil , fmt .Errorf ("version %s is not canonical" , version )
328
+ return nil , p . versionError ( version , fmt .Errorf ("internal error: version passed to GoMod is not canonical" ) )
309
329
}
310
330
311
331
encVer , err := module .EncodeVersion (version )
312
332
if err != nil {
313
- return nil , err
333
+ return nil , p . versionError ( version , err )
314
334
}
315
335
data , err := p .getBytes ("@v/" + encVer + ".mod" )
316
336
if err != nil {
317
- return nil , err
337
+ return nil , p . versionError ( version , err )
318
338
}
319
339
return data , nil
320
340
}
321
341
322
342
func (p * proxyRepo ) Zip (dst io.Writer , version string ) error {
323
343
if version != module .CanonicalVersion (version ) {
324
- return fmt .Errorf ("version %s is not canonical" , version )
344
+ return p . versionError ( version , fmt .Errorf ("internal error: version passed to Zip is not canonical" ) )
325
345
}
326
346
327
347
encVer , err := module .EncodeVersion (version )
328
348
if err != nil {
329
- return err
349
+ return p . versionError ( version , err )
330
350
}
331
351
body , err := p .getBody ("@v/" + encVer + ".zip" )
332
352
if err != nil {
333
- return err
353
+ return p . versionError ( version , err )
334
354
}
335
355
defer body .Close ()
336
356
337
357
lr := & io.LimitedReader {R : body , N : codehost .MaxZipFile + 1 }
338
358
if _ , err := io .Copy (dst , lr ); err != nil {
339
- return err
359
+ return p . versionError ( version , err )
340
360
}
341
361
if lr .N <= 0 {
342
- return fmt .Errorf ("downloaded zip file too large" )
362
+ return p . versionError ( version , fmt .Errorf ("downloaded zip file too large" ) )
343
363
}
344
364
return nil
345
365
}
0 commit comments