@@ -10,7 +10,7 @@ module Cabal.Index (
1010 cachedHackageMetadata ,
1111 -- ** Exceptions thrown
1212 MetadataParseError (.. ),
13- InvalidHash (.. ),
13+ InvalidData (.. ),
1414 InvalidIndexFile (.. ),
1515 NoHackageRepository (.. ),
1616 -- * Metadata types
@@ -35,7 +35,7 @@ module Cabal.Index (
3535 foldIndex ,
3636 IndexEntry (.. ),
3737 IndexFileType (.. ),
38- ) where
38+ ) where
3939
4040import Prelude hiding (pi )
4141
@@ -354,10 +354,12 @@ piPreferredVersions pi =
354354
355355-- | Package's release information.
356356data ReleaseInfo = ReleaseInfo
357- { riRevision :: ! Word32 -- ^ revision number
358- , riTarOffset :: ! Tar. TarEntryOffset -- ^ offset into tar file
359- , riCabal :: ! SHA256 -- ^ hash of the last revision of @.cabal@ file
360- , riTarball :: ! SHA256 -- ^ hash of the @.tar.gz@ file.
357+ { riRevision :: ! Word32 -- ^ revision number
358+ , riTarOffset :: ! Tar. TarEntryOffset -- ^ offset into tar file
359+ , riCabalHash :: ! SHA256 -- ^ hash of the last revision of @.cabal@ file
360+ , riCabalSize :: ! Word64 -- ^ size of the last revision of @.cabal@ file
361+ , riTarballHash :: ! SHA256 -- ^ hash of the @.tar.gz@ file
362+ , riTarballSize :: ! Word64 -- ^ size of the @.tar.gz@ file
361363 }
362364 deriving (Eq , Show , Generic )
363365
@@ -389,20 +391,30 @@ indexMetadata indexFilepath mindexState = do
389391 digest :: SHA256
390392 digest = sha256 contents
391393
394+ size :: Word64
395+ size = fromIntegral $ BS. length contents
396+
392397 offset :: Tar. TarEntryOffset
393398 offset = entryTarOffset indexEntry
394399
395400 f :: Maybe TmpPackageInfo -> Maybe TmpPackageInfo
396401 f Nothing = Just TmpPackageInfo
397- { tmpPiVersions = Map. singleton ver (TmpReleaseInfo 0 offset (Just digest) Nothing )
402+ { tmpPiVersions = Map. singleton ver TmpReleaseInfo
403+ { tmpRiRevision = 0
404+ , tmpRiTarOffset = offset
405+ , tmpRiCabalHash = Just digest
406+ , tmpRiCabalSize = Just size
407+ , tmpRiTarballHash = Nothing
408+ , tmpRiTarballSize = Nothing
409+ }
398410 , tmpPiPreferred = C. anyVersion
399411 }
400412 f (Just pi ) = Just pi { tmpPiVersions = Map. alter g ver (tmpPiVersions pi ) }
401413
402414 g :: Maybe TmpReleaseInfo -> Maybe TmpReleaseInfo
403- g Nothing = Just $ TmpReleaseInfo 0 offset (Just digest) Nothing
404- g (Just (TmpReleaseInfo _r _o Nothing t )) = Just $ TmpReleaseInfo 0 offset (Just digest) t
405- g (Just (TmpReleaseInfo r _o _c t )) = Just $ TmpReleaseInfo (succ r) offset (Just digest) t
415+ g Nothing = Just $ TmpReleaseInfo 0 offset (Just digest) ( Just size) Nothing Nothing
416+ g (Just (TmpReleaseInfo _r _o Nothing _ th ts )) = Just $ TmpReleaseInfo 0 offset (Just digest) ( Just size) th ts
417+ g (Just (TmpReleaseInfo r _o _c _ th ts )) = Just $ TmpReleaseInfo (succ r) offset (Just digest) ( Just size) th ts
406418
407419 PackageJson pn ver -> case A. eitherDecodeStrict contents of
408420 Left err -> throwIO $ MetadataParseError (entryPath indexEntry) err
@@ -413,14 +425,14 @@ indexMetadata indexFilepath mindexState = do
413425 where
414426 f :: Target -> Maybe TmpPackageInfo -> Maybe TmpPackageInfo
415427 f t Nothing = Just TmpPackageInfo
416- { tmpPiVersions = Map. singleton ver ( TmpReleaseInfo 0 0 Nothing (Just (hashSHA256 (targetHashes t))))
428+ { tmpPiVersions = Map. singleton ver $ TmpReleaseInfo 0 0 Nothing Nothing (Just (hashSHA256 (targetHashes t))) ( Just (targetLength t ))
417429 , tmpPiPreferred = C. anyVersion
418430 }
419431 f t (Just pi ) = Just pi { tmpPiVersions = Map. alter (g t) ver (tmpPiVersions pi ) }
420432
421433 g :: Target -> Maybe TmpReleaseInfo -> Maybe TmpReleaseInfo
422- g t Nothing = Just $ TmpReleaseInfo 0 0 Nothing (Just (hashSHA256 (targetHashes t)))
423- g t (Just (TmpReleaseInfo r o c _ )) = Just $ TmpReleaseInfo r o c (Just (hashSHA256 (targetHashes t)))
434+ g t Nothing = Just $ TmpReleaseInfo 0 0 Nothing Nothing (Just (hashSHA256 (targetHashes t))) ( Just (targetLength t ))
435+ g t (Just (TmpReleaseInfo r o ch cs _ _ )) = Just $ TmpReleaseInfo r o ch cs (Just (hashSHA256 (targetHashes t))) ( Just (targetLength t ))
424436
425437 PreferredVersions pn
426438 | BS. null contents -> return m
@@ -446,13 +458,17 @@ indexMetadata indexFilepath mindexState = do
446458postCheck :: Map C. PackageName TmpPackageInfo -> IO (Map C. PackageName PackageInfo )
447459postCheck meta = ifor meta $ \ pn pi -> do
448460 versions <- ifor (tmpPiVersions pi ) $ \ ver ri -> do
449- cabal <- maybe (throwIO $ InvalidHash pn ver " cabal" ) return (tmpRiCabal ri)
450- tarball <- maybe (throwIO $ InvalidHash pn ver " tarball" ) return (tmpRiTarball ri)
461+ cabalHash <- maybe (throwIO $ InvalidHash pn ver " cabal" ) return (tmpRiCabalHash ri)
462+ cabalSize <- maybe (throwIO $ InvalidSize pn ver " cabal" ) return (tmpRiCabalSize ri)
463+ tarballHash <- maybe (throwIO $ InvalidHash pn ver " tarball" ) return (tmpRiTarballHash ri)
464+ tarballSize <- maybe (throwIO $ InvalidSize pn ver " tarball" ) return (tmpRiTarballSize ri)
451465 return ReleaseInfo
452- { riRevision = tmpRiRevision ri
453- , riTarOffset = tmpRiTarOffset ri
454- , riCabal = cabal
455- , riTarball = tarball
466+ { riRevision = tmpRiRevision ri
467+ , riTarOffset = tmpRiTarOffset ri
468+ , riCabalHash = cabalHash
469+ , riCabalSize = cabalSize
470+ , riTarballHash = tarballHash
471+ , riTarballSize = tarballSize
456472 }
457473
458474 return PackageInfo
@@ -470,10 +486,12 @@ data MetadataParseError = MetadataParseError FilePath String
470486instance Exception MetadataParseError
471487
472488-- | Thrown if we fail consistency check, we don't know a hash for some file.
473- data InvalidHash = InvalidHash C. PackageName C. Version String
489+ data InvalidData
490+ = InvalidHash C. PackageName C. Version String
491+ | InvalidSize C. PackageName C. Version String
474492 deriving (Show )
475493
476- instance Exception InvalidHash
494+ instance Exception InvalidData
477495
478496-------------------------------------------------------------------------------
479497-- Temporary types for indexMetadata
@@ -485,10 +503,12 @@ data TmpPackageInfo = TmpPackageInfo
485503 }
486504
487505data TmpReleaseInfo = TmpReleaseInfo
488- { tmpRiRevision :: ! Word32 -- ^ revision number
489- , tmpRiTarOffset :: ! Tar. TarEntryOffset -- ^ offset into tar file
490- , tmpRiCabal :: ! (Maybe SHA256 ) -- ^ hash of the last revision of @.cabal@ file
491- , tmpRiTarball :: ! (Maybe SHA256 ) -- ^ hash of the @.tar.gz@ file.
506+ { tmpRiRevision :: ! Word32 -- ^ revision number
507+ , tmpRiTarOffset :: ! Tar. TarEntryOffset -- ^ offset into tar file
508+ , tmpRiCabalHash :: ! (Maybe SHA256 ) -- ^ hash of the last revision of @.cabal@ file
509+ , tmpRiCabalSize :: ! (Maybe Word64 ) -- ^ size of the last revision of @.cabal@ file
510+ , tmpRiTarballHash :: ! (Maybe SHA256 ) -- ^ hash of the @.tar.gz@ file.
511+ , tmpRiTarballSize :: ! (Maybe Word64 ) -- ^ size of the @.tar.gz@ file.
492512 }
493513
494514-------------------------------------------------------------------------------
@@ -656,14 +676,14 @@ newtype Targets = Targets (Map FilePath Target)
656676 deriving Show
657677
658678data Target = Target
659- { _targetLength :: Word
660- , targetHashes :: Hashes
679+ { targetLength :: ! Word64
680+ , targetHashes :: ! Hashes
661681 }
662682 deriving Show
663683
664684data Hashes = Hashes
665- { _hashMD5 :: MD5
666- , hashSHA256 :: SHA256
685+ { _hashMD5 :: ! MD5
686+ , hashSHA256 :: ! SHA256
667687 }
668688 deriving Show
669689
0 commit comments