@@ -216,34 +216,35 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed
216
216
if err != nil {
217
217
return nil , err
218
218
}
219
- revErr := & modfetch. RevInfo { Origin : versions .Origin } // RevInfo to return with error
219
+ origin := versions .Origin
220
220
221
- releases , prereleases , err := qm .filterVersions (ctx , versions .List )
222
- if err != nil {
223
- return revErr , err
221
+ revWithOrigin := func (rev * modfetch.RevInfo ) * modfetch.RevInfo {
222
+ if rev == nil {
223
+ if origin == nil {
224
+ return nil
225
+ }
226
+ return & modfetch.RevInfo {Origin : origin }
227
+ }
228
+
229
+ clone := * rev
230
+ clone .Origin = origin
231
+ return & clone
224
232
}
225
233
226
- mergeRevOrigin := func (rev * modfetch.RevInfo , origin * codehost.Origin ) * modfetch.RevInfo {
227
- merged := mergeOrigin (rev .Origin , origin )
228
- if merged == rev .Origin {
229
- return rev
230
- }
231
- clone := new (modfetch.RevInfo )
232
- * clone = * rev
233
- clone .Origin = merged
234
- return clone
234
+ releases , prereleases , err := qm .filterVersions (ctx , versions .List )
235
+ if err != nil {
236
+ return revWithOrigin (nil ), err
235
237
}
236
238
237
239
lookup := func (v string ) (* modfetch.RevInfo , error ) {
238
240
rev , err := repo .Stat (ctx , v )
239
- // Stat can return a non-nil rev and a non- nil err,
240
- // in order to provide origin information to make the error cacheable.
241
- if rev == nil && err != nil {
242
- return revErr , err
241
+ if rev != nil {
242
+ // Note that Stat can return a non-nil rev and a non-nil err,
243
+ // in order to provide origin information to make the error cacheable.
244
+ origin = mergeOrigin ( origin , rev . Origin )
243
245
}
244
- rev = mergeRevOrigin (rev , versions .Origin )
245
246
if err != nil {
246
- return rev , err
247
+ return revWithOrigin ( nil ) , err
247
248
}
248
249
249
250
if (query == "upgrade" || query == "patch" ) && module .IsPseudoVersion (current ) && ! rev .Time .IsZero () {
@@ -268,18 +269,20 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed
268
269
currentTime , err := module .PseudoVersionTime (current )
269
270
if err == nil && rev .Time .Before (currentTime ) {
270
271
if err := allowed (ctx , module.Version {Path : path , Version : current }); errors .Is (err , ErrDisallowed ) {
271
- return revErr , err
272
+ return revWithOrigin ( nil ) , err
272
273
}
273
274
rev , err = repo .Stat (ctx , current )
274
- if rev == nil && err != nil {
275
- return revErr , err
275
+ if rev != nil {
276
+ origin = mergeOrigin (origin , rev .Origin )
277
+ }
278
+ if err != nil {
279
+ return revWithOrigin (nil ), err
276
280
}
277
- rev = mergeRevOrigin (rev , versions .Origin )
278
- return rev , err
281
+ return revWithOrigin (rev ), nil
279
282
}
280
283
}
281
284
282
- return rev , nil
285
+ return revWithOrigin ( rev ) , nil
283
286
}
284
287
285
288
if qm .preferLower {
@@ -300,24 +303,27 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed
300
303
301
304
if qm .mayUseLatest {
302
305
latest , err := repo .Latest (ctx )
306
+ if latest != nil {
307
+ origin = mergeOrigin (origin , latest .Origin )
308
+ }
303
309
if err == nil {
304
310
if qm .allowsVersion (ctx , latest .Version ) {
305
311
return lookup (latest .Version )
306
312
}
307
313
} else if ! errors .Is (err , fs .ErrNotExist ) {
308
- return revErr , err
314
+ return revWithOrigin ( nil ) , err
309
315
}
310
316
}
311
317
312
318
if (query == "upgrade" || query == "patch" ) && current != "" && current != "none" {
313
319
// "upgrade" and "patch" may stay on the current version if allowed.
314
320
if err := allowed (ctx , module.Version {Path : path , Version : current }); errors .Is (err , ErrDisallowed ) {
315
- return nil , err
321
+ return revWithOrigin ( nil ) , err
316
322
}
317
323
return lookup (current )
318
324
}
319
325
320
- return revErr , & NoMatchingVersionError {query : query , current : current }
326
+ return revWithOrigin ( nil ) , & NoMatchingVersionError {query : query , current : current }
321
327
}
322
328
323
329
// IsRevisionQuery returns true if vers is a version query that may refer to
0 commit comments