#include "gadts.h"
module Darcs.Repository.LowLevel ( readPending, readPendingfile, pendingName, readPrims ) where
import Darcs.Repository.InternalTypes ( RepoType(..), Repository(..) )
import Darcs.Patch ( readPatch, Prim, Patch, RepoPatch, effect )
import Darcs.Global ( darcsdir )
import Darcs.Witnesses.Sealed ( Sealed(Sealed) )
import Darcs.Witnesses.Ordered ( FL(..) )
import Darcs.Utils ( catchall, withCurrentDirectory )
import ByteStringUtils ( gzReadFilePS )
import qualified Data.ByteString as BS ( ByteString, empty )
pendingName :: RepoType p -> String
pendingName (DarcsRepository _ _) = darcsdir++"/patches/pending"
readPending :: RepoPatch p => Repository p C(r u t) -> IO (Sealed (FL Prim C(t)))
readPending (Repo r _ _ tp) =
withCurrentDirectory r (readPendingfile (pendingName tp))
readPendingfile :: String -> IO (Sealed (FL Prim C(x)))
readPendingfile name = do
pend <- gzReadFilePS name `catchall` return BS.empty
return $ readPrims pend
readPrims :: BS.ByteString -> Sealed (FL Prim C(x))
readPrims s = case readPatch s :: Maybe (Sealed (Patch C(x )), BS.ByteString) of
Nothing -> Sealed NilFL
Just (Sealed p,_) -> Sealed (effect p)