Skip to content

Commit 4c28d99

Browse files
committed
Add sizes of tarball and cabalfile to ReleaseInfo
1 parent eaaf40c commit 4c28d99

File tree

5 files changed

+86
-45
lines changed

5 files changed

+86
-45
lines changed

cabal-install-parsers/Changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.6
2+
3+
- Add sizes of tarball and cabal files to `Cabal.Index.ReleaseInfo` data structure.
4+
15
## 0.5
26

37
- Move to use `Cabal-syntax` package

cabal-install-parsers/cabal-install-parsers.cabal

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 2.2
22
name: cabal-install-parsers
3-
version: 0.5
3+
version: 0.6
44
synopsis: Utilities to work with cabal-install files
55
description:
66
@cabal-install-parsers@ provides parsers for @cabal-install@ files:
@@ -15,18 +15,29 @@ description:
1515
homepage: https://haskell-ci.rtfd.org/
1616
bug-reports: https://github.com/haskell-CI/haskell-ci/issues
1717
license: GPL-2.0-or-later AND BSD-3-Clause
18-
license-files: LICENSE LICENSE.GPLv2 LICENSE.GPLv3
18+
license-files:
19+
LICENSE
20+
LICENSE.GPLv2
21+
LICENSE.GPLv3
22+
1923
author: Herbert Valerio Riedel, Oleg Grenrus
2024
2125
category: Development
2226
build-type: Simple
2327
tested-with:
24-
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
28+
GHC ==8.2.2
29+
|| ==8.4.4
30+
|| ==8.6.5
31+
|| ==8.8.4
32+
|| ==8.10.7
33+
|| ==9.0.2
34+
|| ==9.2.5
35+
|| ==9.4.4
2536

2637
extra-source-files:
2738
Changelog.md
28-
fixtures/*.project
2939
fixtures/*.golden
40+
fixtures/*.project
3041

3142
source-repository head
3243
type: git
@@ -54,18 +65,18 @@ library
5465

5566
-- GHC-boot libraries
5667
build-depends:
57-
, base >=4.10 && <4.18
68+
, base >=4.10 && <4.18
5869
, binary ^>=0.8.5
5970
, bytestring ^>=0.10.8.1 || ^>=0.11.1.0
6071
, Cabal-syntax ^>=3.8.1.0
61-
, containers ^>=0.5.7.1 || ^>=0.6.0.1
72+
, containers ^>=0.5.7.1 || ^>=0.6.0.1
6273
, deepseq ^>=1.4.2.0
6374
, directory ^>=1.3.0.0
6475
, filepath ^>=1.4.1.1
6576
, parsec ^>=3.1.13.0
6677
, pretty ^>=1.1.3.3
67-
, text ^>=1.2.3.0 || ^>=2.0.1
68-
, time ^>=1.8.0.2 || ^>=1.9.3 || ^>=1.11.1.1 || ^>=1.12.2
78+
, text ^>=1.2.3.0 || ^>=2.0.1
79+
, time ^>=1.8.0.2 || ^>=1.9.3 || ^>=1.11.1.1 || ^>=1.12.2
6980
, transformers ^>=0.5.2.0
7081

7182
-- extra dependencies
@@ -92,8 +103,8 @@ test-suite cabal-parsers-index
92103
, base
93104
, base16-bytestring
94105
, bytestring
95-
, Cabal-syntax
96106
, cabal-install-parsers
107+
, Cabal-syntax
97108
, containers
98109
, tar
99110

@@ -112,19 +123,19 @@ test-suite cabal-parsers-golden
112123
build-depends:
113124
, base
114125
, bytestring
115-
, Cabal-syntax
116126
, cabal-install-parsers
127+
, Cabal-syntax
117128
, containers
118129
, directory
119130
, filepath
120131
, pretty
121132

122133
-- dependencies needing explicit constraints
123134
build-depends:
124-
, ansi-terminal >=0.10 && <0.12
135+
, ansi-terminal >=0.10 && <0.12
125136
, tasty ^>=1.4
126137
, tasty-golden ^>=2.3.1.1
127-
, tree-diff >=0.2 && <0.4
138+
, tree-diff >=0.2 && <0.4
128139

129140
benchmark cabal-parsers-bench
130141
default-language: Haskell2010
@@ -136,8 +147,8 @@ benchmark cabal-parsers-bench
136147
build-depends:
137148
, base
138149
, bytestring
139-
, Cabal-syntax
140150
, cabal-install-parsers
151+
, Cabal-syntax
141152
, containers
142153
, directory
143154
, filepath

cabal-install-parsers/src/Cabal/Index.hs

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4040
import Prelude hiding (pi)
4141

@@ -354,10 +354,12 @@ piPreferredVersions pi =
354354

355355
-- | Package's release information.
356356
data 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
446458
postCheck :: Map C.PackageName TmpPackageInfo -> IO (Map C.PackageName PackageInfo)
447459
postCheck 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
470486
instance 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

487505
data 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

658678
data Target = Target
659-
{ _targetLength :: Word
660-
, targetHashes :: Hashes
679+
{ targetLength :: !Word64
680+
, targetHashes :: !Hashes
661681
}
662682
deriving Show
663683

664684
data Hashes = Hashes
665-
{ _hashMD5 :: MD5
666-
, hashSHA256 :: SHA256
685+
{ _hashMD5 :: !MD5
686+
, hashSHA256 :: !SHA256
667687
}
668688
deriving Show
669689

cabal-install-parsers/test/Index.hs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,18 @@ main = defaultMain $ testGroup "Cabal.Index"
5757
-- revision and cabal hash check will start failing
5858
-- tarball hash shouldn't ever change.
5959
assertEqual "revision" 1 (riRevision ri)
60+
assertEqual "cabal size"
61+
7251
62+
(riCabalSize ri)
6063
assertEqual "cabal hash"
6164
(unsafeMkSHA256 "a6f5eddcff9526c786a1b77bdfade54b42f67c066b379bbc4b55ffb291e6c7d6")
62-
(riCabal ri)
65+
(riCabalHash ri)
66+
assertEqual "tarball size"
67+
279980
68+
(riTarballSize ri)
6369
assertEqual "tarball hash"
6470
(unsafeMkSHA256 "17c67cdaca651e18f310b21b2b12bac6bcec5188c3ac0e4b64cc60c94d7e4d2e")
65-
(riTarball ri)
71+
(riTarballHash ri)
6672

6773
-- check contents
6874
withFile indexPath ReadMode $ \hdl -> do

haskell-ci.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ library haskell-ci-internal
166166
, attoparsec ^>=0.14.1
167167
, base-compat ^>=0.12
168168
, base16-bytestring ^>=1.0.1.0
169-
, cabal-install-parsers ^>=0.5
169+
, cabal-install-parsers ^>=0.6
170170
, cryptohash-sha256 ^>=0.11.101.0
171171
, exceptions ^>=0.10.0
172172
, generic-lens-lite ^>=0.1

0 commit comments

Comments
 (0)