diff --git a/.travis.yml b/.travis.yml index fd7e0a8..17cc93b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,12 +44,9 @@ matrix: # env: TEST=--disable-tests BENCH=--disable-benchmarks addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}} - compiler: "ghc-8.4.1" - env: GHCHEAD=true + # env: TEST=--disable-tests BENCH=--disable-benchmarks addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.4.1], sources: [hvr-ghc]}} - allow_failures: - - compiler: "ghc-8.4.1" - before_install: - HC=${CC} - HCPKG=${HC/ghc/ghc-pkg} @@ -71,24 +68,9 @@ install: - travis_retry cabal update -v - "sed -i.bak 's/^jobs:/-- jobs:/' ${HOME}/.cabal/config" - rm -fv cabal.project cabal.project.local - # Overlay Hackage Package Index for GHC HEAD: https://github.com/hvr/head.hackage - - | - if $GHCHEAD; then - sed -i.bak 's/-- allow-newer:.*/allow-newer: *:base, *:template-haskell, *:ghc, *:Cabal/' ${HOME}/.cabal/config - - echo 'repository head.hackage' >> ${HOME}/.cabal/config - echo ' url: http://head.hackage.haskell.org/' >> ${HOME}/.cabal/config - echo ' secure: True' >> ${HOME}/.cabal/config - echo ' root-keys: 07c59cb65787dedfaef5bd5f987ceb5f7e5ebf88b904bbd4c5cbdeb2ff71b740' >> ${HOME}/.cabal/config - echo ' 2e8555dde16ebd8df076f1a8ef13b8f14c66bad8eafefd7d9e37d0ed711821fb' >> ${HOME}/.cabal/config - echo ' 8f79fd2389ab2967354407ec852cbe73f2e8635793ac446d09461ffb99527f6e' >> ${HOME}/.cabal/config - echo ' key-threshold: 3' >> ${HOME}/.cabal.config - - cabal new-update head.hackage -v - fi - grep -Ev -- '^\s*--' ${HOME}/.cabal/config | grep -Ev '^\s*$' - - if [ $HCNUMVER -ge 80000 ]; then cabal new-install -w ${HC} --symlink-bindir=$HOME/.local/bin doctest --constraint='doctest ==0.13.*'; fi - - if [ $HCNUMVER -eq 80202 ]; then cabal new-install -w ${HC} --symlink-bindir=$HOME/.local/bin hlint --constraint='hlint ==2.0.*'; fi + - if [ $HCNUMVER -ge 80000 ]; then cabal new-install -w ${HC} --symlink-bindir=$HOME/.local/bin doctest --constraint='doctest ==0.14.*'; fi + - if [ $HCNUMVER -eq 80202 ]; then cabal new-install -w ${HC} --symlink-bindir=$HOME/.local/bin hlint --constraint='hlint ==2.1.*'; fi - "printf 'packages: \".\"\\n' > cabal.project" - cat cabal.project - if [ -f "./configure.ac" ]; then diff --git a/src/Distribution/Hackage/DB/Parsed.hs b/src/Distribution/Hackage/DB/Parsed.hs index fc789b4..e80788d 100644 --- a/src/Distribution/Hackage/DB/Parsed.hs +++ b/src/Distribution/Hackage/DB/Parsed.hs @@ -16,6 +16,7 @@ import Distribution.Hackage.DB.Utility import Control.Exception import Data.ByteString.Lazy as BS import Data.ByteString.Lazy.UTF8 as BS +import Data.List.NonEmpty import Data.Map as Map import Data.Maybe import Data.Time.Clock @@ -30,7 +31,7 @@ type HackageDB = Map PackageName PackageData type PackageData = Map Version VersionData -data VersionData = VersionData { cabalFile :: !GenericPackageDescription +data VersionData = VersionData { cabalFileRevisions :: NonEmpty GenericPackageDescription , tarballHashes :: !(Map String String) } deriving (Show, Eq, Generic) @@ -54,12 +55,12 @@ parsePackageData pn (U.PackageData pv vs') = | otherwise = parseText "preferred version range" (toString pv) parseVersionData :: PackageName -> Version -> U.VersionData -> VersionData -parseVersionData pn v (U.VersionData cf m) = +parseVersionData pn v (U.VersionData cfs m) = mapException (\e -> HackageDBPackageVersion v (e :: SomeException)) $ VersionData gpd (parseMetaData pn v m) where gpd = fromMaybe (throw (InvalidCabalFile (show (pn,v)))) $ - parseGenericPackageDescriptionMaybe (toStrict cf) + nonEmpty =<< traverse (parseGenericPackageDescriptionMaybe . toStrict) cfs parseMetaData :: PackageName -> Version -> ByteString -> Map String String parseMetaData pn v buf | BS.null buf = Map.empty diff --git a/src/Distribution/Hackage/DB/Unparsed.hs b/src/Distribution/Hackage/DB/Unparsed.hs index 48efcee..c93be5a 100644 --- a/src/Distribution/Hackage/DB/Unparsed.hs +++ b/src/Distribution/Hackage/DB/Unparsed.hs @@ -33,8 +33,8 @@ data PackageData = PackageData { preferredVersions :: ByteString } deriving (Show, Eq, Generic) -data VersionData = VersionData { cabalFile :: ByteString - , metaFile :: ByteString +data VersionData = VersionData { cabalFileRevisions :: [ByteString] + , metaFile :: ByteString } deriving (Show, Eq, Generic) @@ -62,8 +62,8 @@ handleEntry db e = (["preferred-versions"], NormalFile buf _) -> insertWith setConstraint pn (PackageData buf Map.empty) db ([v',file], NormalFile buf _) -> let v = parseText "Version" v' in - if file == pn' <.> "cabal" then insertVersionData setCabalFile pn v (VersionData buf BS.empty) db else - if file == "package.json" then insertVersionData setMetaFile pn v (VersionData BS.empty buf) db else + if file == pn' <.> "cabal" then insertVersionData setCabalFile pn v (VersionData [buf] BS.empty) db else + if file == "package.json" then insertVersionData setMetaFile pn v (VersionData [] buf) db else throw (UnsupportedTarEntry e) (_, Directory) -> db -- some tarballs have these superfluous entries @@ -84,7 +84,7 @@ insertVersionData setFile pn v vd = insertWith mergeVersionData pn pd mergeVersionData _ old = old { versions = insertWith setFile v vd (versions old) } setCabalFile :: VersionData -> VersionData -> VersionData -setCabalFile new old = old { cabalFile = cabalFile new } +setCabalFile new old = old { cabalFileRevisions = cabalFileRevisions old ++ cabalFileRevisions new } setMetaFile :: VersionData -> VersionData -> VersionData setMetaFile new old = old { metaFile = metaFile new }