@@ -19,6 +19,7 @@ import qualified Data.ByteString.Lazy as BSL
19
19
import qualified Data.ByteString.Lazy.Char8 as BC8L
20
20
import Data.List.NonEmpty ( toList )
21
21
import Distribution.Text
22
+ import Distribution.CabalSpecVersion
22
23
import Distribution.Pretty ( prettyShow )
23
24
import Distribution.Parsec ( PWarning , PError )
24
25
import Distribution.Version
@@ -45,22 +46,25 @@ import Distribution.PackageDescription.Parsec ( runParseResult, parseG
45
46
-- inferred 'specVersion'. IOW, Hackage ensures on upload that only
46
47
-- @.cabal@ files are accepted which support the heuristic parsing.
47
48
--
48
- -- If no valid version field can be found, @mkVersion [0] @ is returned.
49
- parseSpecVer :: ByteString -> Version
50
- parseSpecVer = maybe (mkVersion [ 0 ]) id . findCabVer
49
+ -- If no valid version field can be found, @Nothing @ is returned.
50
+ parseSpecVer :: ByteString -> Maybe CabalSpecVersion
51
+ parseSpecVer = findCabVer
51
52
52
- parseSpecVerLazy :: BSL. ByteString -> Version
53
+ parseSpecVerLazy :: BSL. ByteString -> Maybe CabalSpecVersion
53
54
parseSpecVerLazy = parseSpecVer . BSL. toStrict
54
55
56
+ versionToCabalSpecVersion :: Version -> Maybe CabalSpecVersion
57
+ versionToCabalSpecVersion = cabalSpecFromVersionDigits . versionNumbers
58
+
55
59
isWS :: Word8 -> Bool
56
60
isWS = (`elem` [0x20 ,0x09 ])
57
61
58
62
eatWS :: ByteString -> ByteString
59
63
eatWS = BS. dropWhile isWS
60
64
61
65
-- | Try to heuristically locate & parse a 'cabal-version' field
62
- findCabVer :: ByteString -> Maybe Version
63
- findCabVer raw = msum [ decodeVer y | (_,_,y) <- findCabVers raw ]
66
+ findCabVer :: ByteString -> Maybe CabalSpecVersion
67
+ findCabVer raw = msum [ versionToCabalSpecVersion =<< decodeVer y | (_,_,y) <- findCabVers raw ]
64
68
65
69
-- | Return list of @cabal-version@ candidates as 3-tuples of
66
70
-- (prefix,indentation-level,value-words) in reverse order of
@@ -282,16 +286,17 @@ scanSpecVersionLazy bs = do
282
286
-- * Starting with cabal-version:2.2 'scanSpecVersionLazy' must succeed
283
287
--
284
288
-- 'True' is returned in the first element if sanity checks passes.
285
- parseGenericPackageDescriptionChecked :: BSL. ByteString -> (Bool ,[PWarning ], Either (Maybe Version , [PError ]) GenericPackageDescription )
289
+ parseGenericPackageDescriptionChecked :: BSL. ByteString -> (Bool , [PWarning ], Either (Maybe Version , [PError ]) GenericPackageDescription )
286
290
parseGenericPackageDescriptionChecked bs = case parseGenericPackageDescription' bs of
287
291
(warns, Left pe) -> (False , warns, Left $ fmap toList pe)
288
- (warns, Right gpd) -> (isOk (specVersion (packageDescription gpd)),warns, Right gpd)
292
+ (warns, Right gpd) -> (isOk (specVersion (packageDescription gpd)), warns, Right gpd)
289
293
where
290
- isOk :: Version -> Bool
294
+ isOk :: CabalSpecVersion -> Bool
291
295
isOk v
292
- | v /= parseSpecVerLazy bs = False
293
- | Just v' <- scanSpecVersionLazy bs = v == v'
294
- | otherwise = v < mkVersion [2 ,3 ]
296
+ | Just v /= parseSpecVerLazy bs = False
297
+ | Just v' <- versionToCabalSpecVersion =<< scanSpecVersionLazy bs
298
+ = v == v'
299
+ | otherwise = v <= CabalSpecV2_2
295
300
296
301
#if defined(MIN_VERSION_cabal_parsers)
297
302
parseGenericPackageDescription' bs' = compatParseGenericPackageDescription (BSL. toStrict bs')
0 commit comments