@@ -32,6 +32,10 @@ func NewConstraint(c string) (*Constraints, error) {
32
32
return nil , fmt .Errorf ("improper constraint: %s" , v )
33
33
}
34
34
35
+ // If any part of the range uses a pre-release,
36
+ // then allow pre-release versions to match when the range is checked.
37
+ var rangeUsesPrerelease bool
38
+
35
39
cs := findConstraintRegex .FindAllString (v , - 1 )
36
40
if cs == nil {
37
41
cs = append (cs , v )
@@ -44,7 +48,21 @@ func NewConstraint(c string) (*Constraints, error) {
44
48
}
45
49
46
50
result [i ] = pc
51
+
52
+ // Check if the range uses a pre-release
53
+ if ! rangeUsesPrerelease && pc .con .Prerelease () != "" {
54
+ rangeUsesPrerelease = true
55
+ }
47
56
}
57
+
58
+ if rangeUsesPrerelease {
59
+ // If any part of the range used a pre-release,
60
+ // all versions in the range should allow pre-releases
61
+ for _ , pc := range result {
62
+ pc .allowPrerelease = true
63
+ }
64
+ }
65
+
48
66
or [k ] = result
49
67
}
50
68
@@ -202,6 +220,10 @@ type constraint struct {
202
220
minorDirty bool
203
221
dirty bool
204
222
patchDirty bool
223
+
224
+ // allowPrerelease indicates if the constraint should allow pre-releases,
225
+ // such as when part of a range constraint that uses pre-releases
226
+ allowPrerelease bool
205
227
}
206
228
207
229
// Check if a version meets the constraint
@@ -257,6 +279,7 @@ func parseConstraint(c string) (*constraint, error) {
257
279
cs .minorDirty = minorDirty
258
280
cs .patchDirty = patchDirty
259
281
cs .dirty = dirty
282
+ cs .allowPrerelease = cs .con .Prerelease () != ""
260
283
261
284
return cs , nil
262
285
}
@@ -389,7 +412,7 @@ func constraintGreaterThanEqual(v *Version, c *constraint) (bool, error) {
389
412
// If there is a pre-release on the version but the constraint isn't looking
390
413
// for them assume that pre-releases are not compatible. See issue 21 for
391
414
// more details.
392
- if v .Prerelease () != "" && c . con . Prerelease () == "" {
415
+ if v .Prerelease () != "" && ! c . allowPrerelease {
393
416
return false , fmt .Errorf ("%s is a prerelease version and the constraint is only looking for release versions" , v )
394
417
}
395
418
@@ -404,7 +427,7 @@ func constraintLessThanEqual(v *Version, c *constraint) (bool, error) {
404
427
// If there is a pre-release on the version but the constraint isn't looking
405
428
// for them assume that pre-releases are not compatible. See issue 21 for
406
429
// more details.
407
- if v .Prerelease () != "" && c . con . Prerelease () == "" {
430
+ if v .Prerelease () != "" && ! c . allowPrerelease {
408
431
return false , fmt .Errorf ("%s is a prerelease version and the constraint is only looking for release versions" , v )
409
432
}
410
433
@@ -437,7 +460,7 @@ func constraintTilde(v *Version, c *constraint) (bool, error) {
437
460
// If there is a pre-release on the version but the constraint isn't looking
438
461
// for them assume that pre-releases are not compatible. See issue 21 for
439
462
// more details.
440
- if v .Prerelease () != "" && c . con . Prerelease () == "" {
463
+ if v .Prerelease () != "" && ! c . allowPrerelease {
441
464
return false , fmt .Errorf ("%s is a prerelease version and the constraint is only looking for release versions" , v )
442
465
}
443
466
@@ -469,7 +492,7 @@ func constraintTildeOrEqual(v *Version, c *constraint) (bool, error) {
469
492
// If there is a pre-release on the version but the constraint isn't looking
470
493
// for them assume that pre-releases are not compatible. See issue 21 for
471
494
// more details.
472
- if v .Prerelease () != "" && c . con . Prerelease () == "" {
495
+ if v .Prerelease () != "" && ! c . allowPrerelease {
473
496
return false , fmt .Errorf ("%s is a prerelease version and the constraint is only looking for release versions" , v )
474
497
}
475
498
@@ -498,7 +521,7 @@ func constraintCaret(v *Version, c *constraint) (bool, error) {
498
521
// If there is a pre-release on the version but the constraint isn't looking
499
522
// for them assume that pre-releases are not compatible. See issue 21 for
500
523
// more details.
501
- if v .Prerelease () != "" && c . con . Prerelease () == "" {
524
+ if v .Prerelease () != "" && ! c . allowPrerelease {
502
525
return false , fmt .Errorf ("%s is a prerelease version and the constraint is only looking for release versions" , v )
503
526
}
504
527
0 commit comments