module Storage.Archive.Immutable.Utils ( expandItem, darcsUpdateHashesItem , getRootHash, getRootTree ) where import Prelude hiding ( readFile, writeFile ) import Control.Applicative ( (<$>) ) import Control.Monad ( liftM ) import Control.Monad.Trans ( MonadIO(..), lift ) import qualified Data.ByteString as B import Storage.Hashed.Darcs ( readDarcsHashed, darcsUpdateHashes ) import Storage.Hashed.Hash ( Hash, decodeBase16, sha256 ) import Storage.Hashed.Tree ( Tree, TreeItem(..), Blob(..), expand ) import System.FilePath ( () ) import Storage.Archive.Immutable.Monad expandItem :: Monad m => TreeItem m -> m (TreeItem m) expandItem t@(File {}) = return t expandItem (SubTree t) = liftM SubTree (expand t) expandItem (Stub contents _hash) = liftM SubTree (contents >>= expand) darcsUpdateHashesItem :: (Monad m, Functor m) => TreeItem m -> m (TreeItem m) darcsUpdateHashesItem (File (Blob contentsIO _)) = do hash <- sha256 <$> contentsIO return (File (Blob contentsIO hash)) darcsUpdateHashesItem (SubTree t) = SubTree <$> darcsUpdateHashes t darcsUpdateHashesItem (Stub _ _) = fail "darcsUpdateHashesItem: stubs not supported" getRootHash :: (MonadIO m, MonadImmArch m) => m Hash getRootHash = do archive <- getCurrentArchive liftIO $ decodeBase16 <$> B.readFile (archive "root") getRootTree :: (MonadIO m, MonadImmArch m) => m (Tree IO) getRootTree = do archive <- getCurrentArchive rootHash <- getRootHash liftIO $ readDarcsHashed (archive "data") (Nothing, rootHash)