packages feed

kit-0.7.10: Kit/Repository.hs

module Kit.Repository (
    --
    KitRepository,
    makeRepository,
    --
    readKitSpec,
    unpackKit,
    packagesDirectory,
    publishLocally
  ) where

  import Kit.Spec
  import Kit.Util
  import Data.Yaml (decodeFile)
  import Control.Error

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

  localCacheDir :: KitRepository -> FilePath
  localCacheDir kr = dotKitDir kr </> "cache" </> "local"

  makeRepository :: FilePath -> IO KitRepository
  makeRepository fp = let repo = KitRepository fp in do 
    mkdirP $ localCacheDir repo
    return repo

  readKitSpec :: MonadIO m => KitRepository -> Kit -> EitherT String m KitSpec
  readKitSpec repo kit = do
    mbLoaded <- liftIO $ decodeFile (localCacheDir repo </> kitSpecPath kit)
    tryJust ("Invalid KitSpec file for " ++ packageFileName kit) mbLoaded

  baseKitPath :: Packageable a => a -> String
  baseKitPath k = packageName k </> packageVersion k

  kitPackagePath :: Packageable a => a -> String
  kitPackagePath k = baseKitPath k </> packageFileName k ++ ".tar.gz"

  kitSpecPath :: Packageable a => a -> String
  kitSpecPath k = baseKitPath k </> "KitSpec"

  packagesDirectory :: KitRepository -> FilePath
  packagesDirectory kr = dotKitDir kr </> "packages"

  unpackKit :: (Packageable a) => KitRepository -> a -> IO ()
  unpackKit kr kit = do
      let source = localCacheDir kr </> kitPackagePath kit
      let dest = packagesDirectory kr
      d <- doesDirectoryExist $ dest </> packageFileName kit
      if not d 
        then do
          putStrLn $ "Unpacking: " ++ packageFileName kit
          mkdirP dest 
          inDirectory dest $ shell ("tar zxf " ++ source)
          return ()
        else putStrLn $ "Using: " ++ packageFileName kit
      return ()

  publishLocally :: KitRepository -> KitSpec -> FilePath -> FilePath -> IO ()
  publishLocally kr ks specFile packageFile = do
                              let cacheDir = localCacheDir kr
                              let thisKitDir = cacheDir </> baseKitPath ks
                              mkdirP thisKitDir
                              let fname = takeFileName packageFile
                              copyFile packageFile (thisKitDir </> fname)
                              copyFile specFile (thisKitDir </> "KitSpec")
                              let pkg = packagesDirectory kr </> packageFileName ks
                              d <- doesDirectoryExist pkg
                              when d $ removeDirectoryRecursive pkg