@@ -420,8 +420,19 @@ instance Parsec VersionRange where
420
420
421
421
" ==" -> do
422
422
P. spaces
423
- (wild, v) <- verOrWild
424
- pure $ (if wild then withinVersion else thisVersion) v
423
+ (do (wild, v) <- verOrWild
424
+ pure $ (if wild then withinVersion else thisVersion) v
425
+ <|>
426
+ (verSet' thisVersion =<< verSet))
427
+
428
+ " ^>=" -> do
429
+ P. spaces
430
+ (do (wild, v) <- verOrWild
431
+ when wild $ P. unexpected $
432
+ " wild-card version after ^>= operator"
433
+ majorBoundVersion' v
434
+ <|>
435
+ (verSet' majorBoundVersion =<< verSet))
425
436
426
437
_ -> do
427
438
P. spaces
@@ -431,7 +442,6 @@ instance Parsec VersionRange where
431
442
case op of
432
443
" >=" -> pure $ orLaterVersion v
433
444
" <" -> pure $ earlierVersion v
434
- " ^>=" -> majorBoundVersion' v
435
445
" <=" -> pure $ orEarlierVersion v
436
446
" >" -> pure $ laterVersion v
437
447
_ -> fail $ " Unknown version operator " ++ show op
@@ -469,6 +479,31 @@ instance Parsec VersionRange where
469
479
(orLaterVersion u) (earlierVersion (majorUpperBound u))
470
480
embed vr = embedVersionRange vr
471
481
482
+ -- version set notation (e.g. "== { 0.0.1.0, 0.0.2.0, 0.1.0.0 }")
483
+ verSet' op vs = do
484
+ csv <- askCabalSpecVersion
485
+ if csv >= CabalSpecV3_0
486
+ then pure $ foldr1 unionVersionRanges (map op vs)
487
+ else fail $ unwords
488
+ [ " version set syntax used."
489
+ , " To use this syntax the package needs to specify at least 'cabal-version: 3.0'."
490
+ , " Alternatively, if broader compatibility is important then use"
491
+ , " a series of single version constraints joined with the || operator:"
492
+ , prettyShow (foldr1 unionVersionRanges (map op vs))
493
+ ]
494
+
495
+ verSet :: CabalParsing m => m [Version ]
496
+ verSet = do
497
+ _ <- P. char ' {'
498
+ vs <- P. sepBy1 (P. spaces *> verPlain) (P. try (P. spaces *> P. char ' ,' ))
499
+ P. spaces
500
+ _ <- P. char ' }'
501
+ pure vs
502
+
503
+ -- plain version without tags or wildcards
504
+ verPlain :: CabalParsing m => m Version
505
+ verPlain = mkVersion <$> P. sepBy1 P. integral (P. char ' .' )
506
+
472
507
-- either wildcard or normal version
473
508
verOrWild :: CabalParsing m => m (Bool , Version )
474
509
verOrWild = do
0 commit comments