packages feed

kit-0.6.4: Kit/Repository.hs

{-# LANGUAGE PackageImports #-}
module Kit.Repository (
    --
    KitRepository(KitRepository),
    --
    copyKitPackage,
    explodePackage,
    readKitSpec
  ) where

  import Kit.Spec
  import Kit.Util

  import System.Process (system)

  import "mtl" Control.Monad.Error
  import qualified Data.Traversable as T
  import qualified Data.ByteString as BS

  data KitRepository = KitRepository { repositoryBase :: FilePath } deriving (Eq, Show)

  explodePackage :: KitRepository -> Kit -> IO ()
  explodePackage kr kit = do
    let packagesDir = repositoryBase kr </> "kits"
    let packagePath = repositoryBase kr </> kitPackagePath kit
    mkdirP packagesDir
    inDirectory packagesDir $ system ("tar zxvf " ++ packagePath)
    return ()

  copyKitPackage :: KitRepository -> Kit -> FilePath -> IO ()
  copyKitPackage repo kit destPath = copyFile (repositoryBase repo </> kitPackagePath kit) destPath

  readKitSpec :: KitRepository -> Kit -> KitIO KitSpec
  readKitSpec repo kit = do
    mbKitStuff <- liftIO $ doRead repo (kitSpecPath kit)
    maybe (throwError $ "Missing " ++ packageFileName kit) f mbKitStuff
    where f contents = maybeToKitIO ("Invalid KitSpec file for " ++ packageFileName kit) $ decodeSpec contents

  doRead :: KitRepository -> String -> IO (Maybe BS.ByteString) 
  doRead (KitRepository baseDir) fp = let file = (baseDir </> fp) in do
    exists <- doesFileExist file
    T.sequenceA $ ifTrue exists $ BS.readFile file

  baseKitPath :: Kit -> String
  baseKitPath k = stringJoin "/" ["kits", kitName k, kitVersion k] 

  kitPackagePath, kitSpecPath :: Kit -> String
  kitPackagePath k = baseKitPath k ++ "/" ++ packageFileName k ++ ".tar.gz"
  kitSpecPath k = baseKitPath k ++ "/" ++ "KitSpec"