packages feed

cabal-cache 1.0.2.1 → 1.0.3.0

raw patch · 11 files changed

+136/−16 lines, 11 filesdep ~aesondep ~bytestringdep ~generic-lensPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: aeson, bytestring, generic-lens, http-client, lens, selective

API changes (from Hackage documentation)

- HaskellWorks.CabalCache.Location: instance (a Data.Type.Equality.~ GHC.Types.Char) => HaskellWorks.CabalCache.Location.IsPath [a] [a]
+ App.Commands.Options.Types: PlanOptions :: FilePath -> FilePath -> Maybe String -> FilePath -> PlanOptions
+ App.Commands.Options.Types: [$sel:buildPath:PlanOptions] :: PlanOptions -> FilePath
+ App.Commands.Options.Types: [$sel:outputFile:PlanOptions] :: PlanOptions -> FilePath
+ App.Commands.Options.Types: [$sel:storePath:PlanOptions] :: PlanOptions -> FilePath
+ App.Commands.Options.Types: [$sel:storePathHash:PlanOptions] :: PlanOptions -> Maybe String
+ App.Commands.Options.Types: data PlanOptions
+ App.Commands.Options.Types: instance GHC.Classes.Eq App.Commands.Options.Types.PlanOptions
+ App.Commands.Options.Types: instance GHC.Generics.Generic App.Commands.Options.Types.PlanOptions
+ App.Commands.Options.Types: instance GHC.Show.Show App.Commands.Options.Types.PlanOptions
+ App.Commands.Plan: cmdPlan :: Mod CommandFields (IO ())
+ HaskellWorks.CabalCache.Location: instance (a GHC.Types.~ GHC.Types.Char) => HaskellWorks.CabalCache.Location.IsPath [a] [a]

Files

cabal-cache.cabal view
@@ -1,7 +1,7 @@ cabal-version:          2.2  name:                   cabal-cache-version:                1.0.2.1+version:                1.0.3.0 synopsis:               CI Assistant for Haskell projects description:            CI Assistant for Haskell projects.  Implements package caching. homepage:               https://github.com/haskell-works/cabal-cache@@ -9,7 +9,7 @@ license-file:           LICENSE author:                 John Ky maintainer:             newhoggy@gmail.com-copyright:              John Ky 2019+copyright:              John Ky 2019-2020 category:               Development extra-source-files:     CHANGELOG.md, README.md @@ -106,6 +106,7 @@       App.Commands       App.Commands.Options.Parser       App.Commands.Options.Types+      App.Commands.Plan       App.Commands.SyncFromArchive       App.Commands.SyncToArchive       App.Commands.Version
src/App/Commands.hs view
@@ -1,16 +1,20 @@ module App.Commands where  import App.Commands.SyncFromArchive+import App.Commands.Plan import App.Commands.SyncToArchive import App.Commands.Version import Options.Applicative +{- HLINT ignore "Monoid law, left identity" -}+ commands :: Parser (IO ()) commands = commandsGeneral  commandsGeneral :: Parser (IO ()) commandsGeneral = subparser $ mempty   <>  commandGroup "Commands:"+  <>  cmdPlan   <>  cmdSyncFromArchive   <>  cmdSyncToArchive   <>  cmdVersion
src/App/Commands/Options/Parser.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE OverloadedStrings #-}- module App.Commands.Options.Parser where  import Antiope.Core               (FromText, fromText)
src/App/Commands/Options/Types.hs view
@@ -19,6 +19,13 @@   , awsLogLevel   :: Maybe AWS.LogLevel   } deriving (Eq, Show, Generic) +data PlanOptions = PlanOptions+  { buildPath     :: FilePath+  , storePath     :: FilePath+  , storePathHash :: Maybe String+  , outputFile    :: FilePath+  } deriving (Eq, Show, Generic)+ data SyncFromArchiveOptions = SyncFromArchiveOptions   { region        :: Region   , archiveUris   :: [Location]
+ src/App/Commands/Plan.hs view
@@ -0,0 +1,107 @@+{-# LANGUAGE BlockArguments      #-}+{-# LANGUAGE DataKinds           #-}+{-# LANGUAGE OverloadedStrings   #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications    #-}++module App.Commands.Plan+  ( cmdPlan+  ) where++import Antiope.Core                     (toText)+import App.Commands.Options.Types       (PlanOptions (PlanOptions))+import Control.Applicative+import Control.Lens                     hiding ((<.>))+import Control.Monad.Except+import Data.Generics.Product.Any        (the)+import Data.Maybe+import HaskellWorks.CabalCache.AppError+import HaskellWorks.CabalCache.Location (Location (..), (<.>), (</>))+import HaskellWorks.CabalCache.Show+import HaskellWorks.CabalCache.Version  (archiveVersion)+import Options.Applicative              hiding (columns)++import qualified App.Commands.Options.Types         as Z+import qualified App.Static                         as AS+import qualified Control.Concurrent.STM             as STM+import qualified Data.ByteString.Lazy               as LBS+import qualified Data.Text                          as T+import qualified HaskellWorks.CabalCache.Core       as Z+import qualified HaskellWorks.CabalCache.Hash       as H+import qualified HaskellWorks.CabalCache.IO.Console as CIO+import qualified System.IO                          as IO+import qualified Data.Aeson as J++{- HLINT ignore "Monoid law, left identity" -}+{- HLINT ignore "Redundant do"              -}+{- HLINT ignore "Reduce duplication"        -}++runPlan :: Z.PlanOptions -> IO ()+runPlan opts = do+  let storePath             = opts ^. the @"storePath"+  let archiveUris           = [Local ""]+  let storePathHash         = opts ^. the @"storePathHash" & fromMaybe (H.hashStorePath storePath)+  let versionedArchiveUris  = archiveUris & each %~ (</> archiveVersion)+  let outputFile            = opts ^. the @"outputFile"++  CIO.putStrLn $ "Store path: "       <> toText storePath+  CIO.putStrLn $ "Store path hash: "  <> T.pack storePathHash+  CIO.putStrLn $ "Archive URIs: "     <> tshow archiveUris+  CIO.putStrLn $ "Archive version: "  <> archiveVersion++  tEarlyExit <- STM.newTVarIO False++  mbPlan <- Z.loadPlan $ opts ^. the @"buildPath"++  case mbPlan of+    Right planJson -> do+      packages <- Z.getPackages storePath planJson++      plan <- forM packages $ \pInfo -> do+        let archiveFileBasename = Z.packageDir pInfo <.> ".tar.gz"+        let archiveFiles         = versionedArchiveUris <&> (</> T.pack archiveFileBasename)+        let scopedArchiveFiles   = versionedArchiveUris <&> (</> T.pack storePathHash </> T.pack archiveFileBasename)++        return $ archiveFiles <> scopedArchiveFiles++      if outputFile == "-"+        then LBS.putStr $ J.encode (fmap (fmap toText) plan)+        else LBS.writeFile outputFile $ J.encode (fmap (fmap toText) plan)++    Left (appError :: AppError) -> do+      CIO.hPutStrLn IO.stderr $ "ERROR: Unable to parse plan.json file: " <> displayAppError appError++  earlyExit <- STM.readTVarIO tEarlyExit++  when earlyExit $ CIO.hPutStrLn IO.stderr "Early exit due to error"++optsPlan :: Parser PlanOptions+optsPlan = PlanOptions+  <$> strOption+      (   long "build-path"+      <>  help ("Path to cabal build directory.  Defaults to " <> show AS.buildPath)+      <>  metavar "DIRECTORY"+      <>  value AS.buildPath+      )+  <*> strOption+      (   long "store-path"+      <>  help "Path to cabal store"+      <>  metavar "DIRECTORY"+      <>  value (AS.cabalDirectory </> "store")+      )+  <*> optional+      ( strOption+        (   long "store-path-hash"+        <>  help "Store path hash (do not use)"+        <>  metavar "HASH"+        )+      )+  <*> strOption+      (   long "output-file"+      <>  help "Output file"+      <>  metavar "FILE"+      <>  value "-"+      )++cmdPlan :: Mod CommandFields (IO ())+cmdPlan = command "plan"  $ flip info idm $ runPlan <$> optsPlan
src/App/Commands/SyncFromArchive.hs view
@@ -55,11 +55,12 @@ import qualified System.IO.Temp                                   as IO import qualified System.IO.Unsafe                                 as IO -{- HLINT ignore "Redundant do"        -}-{- HLINT ignore "Reduce duplication"  -}+{- HLINT ignore "Monoid law, left identity" -}+{- HLINT ignore "Reduce duplication"        -}+{- HLINT ignore "Redundant do"              -}  skippable :: Z.Package -> Bool-skippable package = (package ^. the @"packageType" == "pre-existing")+skippable package = package ^. the @"packageType" == "pre-existing"  runSyncFromArchive :: Z.SyncFromArchiveOptions -> IO () runSyncFromArchive opts = do@@ -131,8 +132,9 @@                 let archiveFiles        = versionedArchiveUris & each %~ (</> T.pack archiveBaseName)                 let scopedArchiveFiles  = scopedArchiveUris & each %~ (</> T.pack archiveBaseName)                 let packageStorePath    = storePath </> Z.packageDir pInfo+                let maybePackage        = M.lookup packageId planPackages+                 storeDirectoryExists <- doesDirectoryExist packageStorePath-                let maybePackage = M.lookup packageId planPackages                  case maybePackage of                   Nothing -> do
src/App/Commands/SyncToArchive.hs view
@@ -53,8 +53,9 @@ import qualified System.IO.Unsafe                   as IO import qualified UnliftIO.Async                     as IO -{- HLINT ignore "Redundant do"        -}-{- HLINT ignore "Reduce duplication"  -}+{- HLINT ignore "Monoid law, left identity" -}+{- HLINT ignore "Redundant do"              -}+{- HLINT ignore "Reduce duplication"        -}  runSyncToArchive :: Z.SyncToArchiveOptions -> IO () runSyncToArchive opts = do@@ -153,7 +154,7 @@    earlyExit <- STM.readTVarIO tEarlyExit -  when earlyExit $ CIO.hPutStrLn IO.stderr $ "Early exit due to error"+  when earlyExit $ CIO.hPutStrLn IO.stderr "Early exit due to error"  isShareable :: MonadIO m => FilePath -> Z.PackageInfo -> m Bool isShareable storePath pkg =
src/App/Static/Base.hs view
@@ -1,11 +1,11 @@ module App.Static.Base where  import qualified System.Directory as IO+import qualified System.Info      as I import qualified System.IO.Unsafe as IO-import qualified System.Info as I  homeDirectory :: FilePath-homeDirectory = IO.unsafePerformIO $ IO.getHomeDirectory+homeDirectory = IO.unsafePerformIO IO.getHomeDirectory {-# NOINLINE homeDirectory #-}  isPosix :: Bool
src/HaskellWorks/CabalCache/Core.hs view
@@ -41,6 +41,8 @@ import qualified System.Directory               as IO import qualified System.Process                 as IO +{- HLINT ignore "Monoid law, left identity" -}+ type PackageDir = FilePath type ConfPath   = FilePath type Library    = FilePath@@ -104,7 +106,7 @@         packages = planJson ^. the @"installPlan"  loadPlan :: FilePath -> IO (Either AppError Z.PlanJson)-loadPlan buildPath = (first fromString . eitherDecode) <$> LBS.readFile (buildPath </> "cache" </> "plan.json")+loadPlan buildPath = first fromString . eitherDecode <$> LBS.readFile (buildPath </> "cache" </> "plan.json")  ------------------------------------------------------------------------------- mkPackageInfo :: FilePath -> Z.CompilerId -> Z.Package -> IO PackageInfo
test/HaskellWorks/CabalCache/AwsSpec.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE DataKinds         #-} {-# LANGUAGE OverloadedStrings #-}  module HaskellWorks.CabalCache.AwsSpec
test/HaskellWorks/CabalCache/QuerySpec.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE DataKinds             #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE OverloadedStrings     #-} {-# LANGUAGE QuasiQuotes           #-}