cabal-install-parsers 0.5 → 0.6
raw patch · 4 files changed
+85/−44 lines, 4 filesdep ~tree-diffPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: tree-diff
API changes (from Hackage documentation)
- Cabal.Index: [riCabal] :: ReleaseInfo -> !SHA256
- Cabal.Index: [riTarball] :: ReleaseInfo -> !SHA256
- Cabal.Index: data InvalidHash
- Cabal.Index: instance GHC.Exception.Type.Exception Cabal.Index.InvalidHash
- Cabal.Index: instance GHC.Show.Show Cabal.Index.InvalidHash
+ Cabal.Index: InvalidSize :: PackageName -> Version -> String -> InvalidData
+ Cabal.Index: [riCabalHash] :: ReleaseInfo -> !SHA256
+ Cabal.Index: [riCabalSize] :: ReleaseInfo -> !Word64
+ Cabal.Index: [riTarballHash] :: ReleaseInfo -> !SHA256
+ Cabal.Index: [riTarballSize] :: ReleaseInfo -> !Word64
+ Cabal.Index: data InvalidData
+ Cabal.Index: instance GHC.Exception.Type.Exception Cabal.Index.InvalidData
+ Cabal.Index: instance GHC.Show.Show Cabal.Index.InvalidData
- Cabal.Index: InvalidHash :: PackageName -> Version -> String -> InvalidHash
+ Cabal.Index: InvalidHash :: PackageName -> Version -> String -> InvalidData
- Cabal.Index: ReleaseInfo :: !Word32 -> !TarEntryOffset -> !SHA256 -> !SHA256 -> ReleaseInfo
+ Cabal.Index: ReleaseInfo :: !Word32 -> !TarEntryOffset -> !SHA256 -> !Word64 -> !SHA256 -> !Word64 -> ReleaseInfo
Files
- Changelog.md +4/−0
- cabal-install-parsers.cabal +24/−13
- src/Cabal/Index.hs +49/−29
- test/Index.hs +8/−2
Changelog.md view
@@ -1,3 +1,7 @@+## 0.6++- Add sizes of tarball and cabal files to `Cabal.Index.ReleaseInfo` data structure.+ ## 0.5 - Move to use `Cabal-syntax` package
cabal-install-parsers.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: cabal-install-parsers-version: 0.5+version: 0.6 synopsis: Utilities to work with cabal-install files description: @cabal-install-parsers@ provides parsers for @cabal-install@ files:@@ -15,18 +15,29 @@ homepage: https://haskell-ci.rtfd.org/ bug-reports: https://github.com/haskell-CI/haskell-ci/issues license: GPL-2.0-or-later AND BSD-3-Clause-license-files: LICENSE LICENSE.GPLv2 LICENSE.GPLv3+license-files:+ LICENSE+ LICENSE.GPLv2+ LICENSE.GPLv3+ author: Herbert Valerio Riedel, Oleg Grenrus maintainer: hvr@gnu.org, oleg.grenrus@iki.fi category: Development build-type: Simple tested-with:- GHC ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.4 || ==9.4.1+ GHC ==8.2.2+ || ==8.4.4+ || ==8.6.5+ || ==8.8.4+ || ==8.10.7+ || ==9.0.2+ || ==9.2.5+ || ==9.4.4 extra-source-files: Changelog.md- fixtures/*.project fixtures/*.golden+ fixtures/*.project source-repository head type: git@@ -54,18 +65,18 @@ -- GHC-boot libraries build-depends:- , base >=4.10 && <4.18+ , base >=4.10 && <4.18 , binary ^>=0.8.5 , bytestring ^>=0.10.8.1 || ^>=0.11.1.0 , Cabal-syntax ^>=3.8.1.0- , containers ^>=0.5.7.1 || ^>=0.6.0.1+ , containers ^>=0.5.7.1 || ^>=0.6.0.1 , deepseq ^>=1.4.2.0 , directory ^>=1.3.0.0 , filepath ^>=1.4.1.1 , parsec ^>=3.1.13.0 , pretty ^>=1.1.3.3- , text ^>=1.2.3.0 || ^>=2.0.1- , time ^>=1.8.0.2 || ^>=1.9.3 || ^>=1.11.1.1 || ^>=1.12.2+ , text ^>=1.2.3.0 || ^>=2.0.1+ , time ^>=1.8.0.2 || ^>=1.9.3 || ^>=1.11.1.1 || ^>=1.12.2 , transformers ^>=0.5.2.0 -- extra dependencies@@ -92,8 +103,8 @@ , base , base16-bytestring , bytestring- , Cabal-syntax , cabal-install-parsers+ , Cabal-syntax , containers , tar @@ -112,8 +123,8 @@ build-depends: , base , bytestring- , Cabal-syntax , cabal-install-parsers+ , Cabal-syntax , containers , directory , filepath@@ -121,10 +132,10 @@ -- dependencies needing explicit constraints build-depends:- , ansi-terminal >=0.10 && <0.12+ , ansi-terminal >=0.10 && <0.12 , tasty ^>=1.4 , tasty-golden ^>=2.3.1.1- , tree-diff ^>=0.2+ , tree-diff >=0.2 && <0.4 benchmark cabal-parsers-bench default-language: Haskell2010@@ -136,8 +147,8 @@ build-depends: , base , bytestring- , Cabal-syntax , cabal-install-parsers+ , Cabal-syntax , containers , directory , filepath
src/Cabal/Index.hs view
@@ -10,7 +10,7 @@ cachedHackageMetadata, -- ** Exceptions thrown MetadataParseError (..),- InvalidHash (..),+ InvalidData (..), InvalidIndexFile (..), NoHackageRepository (..), -- * Metadata types@@ -35,7 +35,7 @@ foldIndex, IndexEntry (..), IndexFileType (..),- ) where+) where import Prelude hiding (pi) @@ -354,10 +354,12 @@ -- | Package's release information. data ReleaseInfo = ReleaseInfo- { riRevision :: !Word32 -- ^ revision number- , riTarOffset :: !Tar.TarEntryOffset -- ^ offset into tar file- , riCabal :: !SHA256 -- ^ hash of the last revision of @.cabal@ file- , riTarball :: !SHA256 -- ^ hash of the @.tar.gz@ file.+ { riRevision :: !Word32 -- ^ revision number+ , riTarOffset :: !Tar.TarEntryOffset -- ^ offset into tar file+ , riCabalHash :: !SHA256 -- ^ hash of the last revision of @.cabal@ file+ , riCabalSize :: !Word64 -- ^ size of the last revision of @.cabal@ file+ , riTarballHash :: !SHA256 -- ^ hash of the @.tar.gz@ file+ , riTarballSize :: !Word64 -- ^ size of the @.tar.gz@ file } deriving (Eq, Show, Generic) @@ -389,20 +391,30 @@ digest :: SHA256 digest = sha256 contents + size :: Word64+ size = fromIntegral $ BS.length contents+ offset :: Tar.TarEntryOffset offset = entryTarOffset indexEntry f :: Maybe TmpPackageInfo -> Maybe TmpPackageInfo f Nothing = Just TmpPackageInfo- { tmpPiVersions = Map.singleton ver (TmpReleaseInfo 0 offset (Just digest) Nothing)+ { tmpPiVersions = Map.singleton ver TmpReleaseInfo + { tmpRiRevision = 0+ , tmpRiTarOffset = offset+ , tmpRiCabalHash = Just digest+ , tmpRiCabalSize = Just size+ , tmpRiTarballHash = Nothing+ , tmpRiTarballSize = Nothing+ } , tmpPiPreferred = C.anyVersion } f (Just pi) = Just pi { tmpPiVersions = Map.alter g ver (tmpPiVersions pi) } g :: Maybe TmpReleaseInfo -> Maybe TmpReleaseInfo- g Nothing = Just $ TmpReleaseInfo 0 offset (Just digest) Nothing- g (Just (TmpReleaseInfo _r _o Nothing t)) = Just $ TmpReleaseInfo 0 offset (Just digest) t- g (Just (TmpReleaseInfo r _o _c t)) = Just $ TmpReleaseInfo (succ r) offset (Just digest) t+ g Nothing = Just $ TmpReleaseInfo 0 offset (Just digest) (Just size) Nothing Nothing+ g (Just (TmpReleaseInfo _r _o Nothing _ th ts)) = Just $ TmpReleaseInfo 0 offset (Just digest) (Just size) th ts+ g (Just (TmpReleaseInfo r _o _c _ th ts)) = Just $ TmpReleaseInfo (succ r) offset (Just digest) (Just size) th ts PackageJson pn ver -> case A.eitherDecodeStrict contents of Left err -> throwIO $ MetadataParseError (entryPath indexEntry) err@@ -413,14 +425,14 @@ where f :: Target -> Maybe TmpPackageInfo -> Maybe TmpPackageInfo f t Nothing = Just TmpPackageInfo- { tmpPiVersions = Map.singleton ver (TmpReleaseInfo 0 0 Nothing (Just (hashSHA256 (targetHashes t))))+ { tmpPiVersions = Map.singleton ver $ TmpReleaseInfo 0 0 Nothing Nothing (Just (hashSHA256 (targetHashes t))) (Just (targetLength t)) , tmpPiPreferred = C.anyVersion } f t (Just pi) = Just pi { tmpPiVersions = Map.alter (g t) ver (tmpPiVersions pi) } g :: Target -> Maybe TmpReleaseInfo -> Maybe TmpReleaseInfo- g t Nothing = Just $ TmpReleaseInfo 0 0 Nothing (Just (hashSHA256 (targetHashes t)))- g t (Just (TmpReleaseInfo r o c _)) = Just $ TmpReleaseInfo r o c (Just (hashSHA256 (targetHashes t)))+ g t Nothing = Just $ TmpReleaseInfo 0 0 Nothing Nothing (Just (hashSHA256 (targetHashes t))) (Just (targetLength t))+ g t (Just (TmpReleaseInfo r o ch cs _ _)) = Just $ TmpReleaseInfo r o ch cs (Just (hashSHA256 (targetHashes t))) (Just (targetLength t)) PreferredVersions pn | BS.null contents -> return m@@ -446,13 +458,17 @@ postCheck :: Map C.PackageName TmpPackageInfo -> IO (Map C.PackageName PackageInfo) postCheck meta = ifor meta $ \pn pi -> do versions <- ifor (tmpPiVersions pi) $ \ver ri -> do- cabal <- maybe (throwIO $ InvalidHash pn ver "cabal") return (tmpRiCabal ri)- tarball <- maybe (throwIO $ InvalidHash pn ver "tarball") return (tmpRiTarball ri)+ cabalHash <- maybe (throwIO $ InvalidHash pn ver "cabal") return (tmpRiCabalHash ri)+ cabalSize <- maybe (throwIO $ InvalidSize pn ver "cabal") return (tmpRiCabalSize ri)+ tarballHash <- maybe (throwIO $ InvalidHash pn ver "tarball") return (tmpRiTarballHash ri)+ tarballSize <- maybe (throwIO $ InvalidSize pn ver "tarball") return (tmpRiTarballSize ri) return ReleaseInfo- { riRevision = tmpRiRevision ri- , riTarOffset = tmpRiTarOffset ri- , riCabal = cabal- , riTarball = tarball+ { riRevision = tmpRiRevision ri+ , riTarOffset = tmpRiTarOffset ri+ , riCabalHash = cabalHash+ , riCabalSize = cabalSize+ , riTarballHash = tarballHash+ , riTarballSize = tarballSize } return PackageInfo@@ -470,10 +486,12 @@ instance Exception MetadataParseError -- | Thrown if we fail consistency check, we don't know a hash for some file.-data InvalidHash = InvalidHash C.PackageName C.Version String+data InvalidData+ = InvalidHash C.PackageName C.Version String+ | InvalidSize C.PackageName C.Version String deriving (Show) -instance Exception InvalidHash+instance Exception InvalidData ------------------------------------------------------------------------------- -- Temporary types for indexMetadata@@ -485,10 +503,12 @@ } data TmpReleaseInfo = TmpReleaseInfo- { tmpRiRevision :: !Word32 -- ^ revision number- , tmpRiTarOffset :: !Tar.TarEntryOffset -- ^ offset into tar file- , tmpRiCabal :: !(Maybe SHA256) -- ^ hash of the last revision of @.cabal@ file- , tmpRiTarball :: !(Maybe SHA256) -- ^ hash of the @.tar.gz@ file.+ { tmpRiRevision :: !Word32 -- ^ revision number+ , tmpRiTarOffset :: !Tar.TarEntryOffset -- ^ offset into tar file+ , tmpRiCabalHash :: !(Maybe SHA256) -- ^ hash of the last revision of @.cabal@ file+ , tmpRiCabalSize :: !(Maybe Word64) -- ^ size of the last revision of @.cabal@ file+ , tmpRiTarballHash :: !(Maybe SHA256) -- ^ hash of the @.tar.gz@ file.+ , tmpRiTarballSize :: !(Maybe Word64) -- ^ size of the @.tar.gz@ file. } -------------------------------------------------------------------------------@@ -656,14 +676,14 @@ deriving Show data Target = Target- { _targetLength :: Word- , targetHashes :: Hashes+ { targetLength :: !Word64+ , targetHashes :: !Hashes } deriving Show data Hashes = Hashes- { _hashMD5 :: MD5- , hashSHA256 :: SHA256+ { _hashMD5 :: !MD5+ , hashSHA256 :: !SHA256 } deriving Show
test/Index.hs view
@@ -57,12 +57,18 @@ -- revision and cabal hash check will start failing -- tarball hash shouldn't ever change. assertEqual "revision" 1 (riRevision ri)+ assertEqual "cabal size"+ 7251+ (riCabalSize ri) assertEqual "cabal hash" (unsafeMkSHA256 "a6f5eddcff9526c786a1b77bdfade54b42f67c066b379bbc4b55ffb291e6c7d6")- (riCabal ri)+ (riCabalHash ri)+ assertEqual "tarball size"+ 279980+ (riTarballSize ri) assertEqual "tarball hash" (unsafeMkSHA256 "17c67cdaca651e18f310b21b2b12bac6bcec5188c3ac0e4b64cc60c94d7e4d2e")- (riTarball ri)+ (riTarballHash ri) -- check contents withFile indexPath ReadMode $ \hdl -> do