2010-10-27 20:53:54 +00:00
|
|
|
|
{- git-annex monad
|
|
|
|
|
-
|
2011-11-09 05:15:51 +00:00
|
|
|
|
- Copyright 2010-2011 Joey Hess <joey@kitenet.net>
|
2010-10-27 20:53:54 +00:00
|
|
|
|
-
|
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
|
-}
|
2010-10-10 19:04:07 +00:00
|
|
|
|
|
2011-12-06 15:37:58 +00:00
|
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving, TypeFamilies, MultiParamTypeClasses #-}
|
2011-08-19 18:28:07 +00:00
|
|
|
|
|
2010-10-11 21:52:46 +00:00
|
|
|
|
module Annex (
|
2011-01-26 01:49:04 +00:00
|
|
|
|
Annex,
|
|
|
|
|
AnnexState(..),
|
2011-09-01 17:35:07 +00:00
|
|
|
|
OutputType(..),
|
2010-10-14 07:18:11 +00:00
|
|
|
|
new,
|
2011-10-27 18:38:59 +00:00
|
|
|
|
newState,
|
2010-10-14 07:18:11 +00:00
|
|
|
|
run,
|
2010-11-01 03:24:16 +00:00
|
|
|
|
eval,
|
2011-01-26 04:17:38 +00:00
|
|
|
|
getState,
|
|
|
|
|
changeState,
|
2011-11-08 19:34:10 +00:00
|
|
|
|
gitRepo,
|
|
|
|
|
inRepo,
|
|
|
|
|
fromRepo,
|
2010-10-11 21:52:46 +00:00
|
|
|
|
) where
|
2010-10-10 19:04:07 +00:00
|
|
|
|
|
2011-10-04 02:24:57 +00:00
|
|
|
|
import Control.Monad.State
|
2011-12-06 15:37:58 +00:00
|
|
|
|
import Control.Monad.Trans.Control (StM, MonadBaseControl, liftBaseWith, restoreM)
|
|
|
|
|
import Control.Monad.Base (liftBase, MonadBase)
|
2010-10-16 20:20:49 +00:00
|
|
|
|
|
2011-10-04 02:24:57 +00:00
|
|
|
|
import Common
|
2011-06-30 17:16:57 +00:00
|
|
|
|
import qualified Git
|
2011-12-13 19:05:07 +00:00
|
|
|
|
import qualified Git.Config
|
2011-09-28 19:15:42 +00:00
|
|
|
|
import Git.CatFile
|
2011-12-20 18:37:53 +00:00
|
|
|
|
import qualified Git.Queue
|
2011-06-02 01:56:04 +00:00
|
|
|
|
import Types.Backend
|
2011-09-19 00:11:39 +00:00
|
|
|
|
import qualified Types.Remote
|
2011-06-02 01:56:04 +00:00
|
|
|
|
import Types.Crypto
|
2011-06-22 19:58:30 +00:00
|
|
|
|
import Types.BranchState
|
2011-06-24 01:25:39 +00:00
|
|
|
|
import Types.TrustLevel
|
2011-06-02 01:56:04 +00:00
|
|
|
|
import Types.UUID
|
2011-09-18 21:47:49 +00:00
|
|
|
|
import qualified Utility.Matcher
|
2011-12-22 22:31:44 +00:00
|
|
|
|
import qualified Utility.Format
|
2011-12-08 20:01:46 +00:00
|
|
|
|
import qualified Data.Map as M
|
2011-01-26 01:49:04 +00:00
|
|
|
|
|
|
|
|
|
-- git-annex's monad
|
2011-08-19 18:28:07 +00:00
|
|
|
|
newtype Annex a = Annex { runAnnex :: StateT AnnexState IO a }
|
|
|
|
|
deriving (
|
|
|
|
|
Monad,
|
|
|
|
|
MonadIO,
|
2011-08-25 04:28:55 +00:00
|
|
|
|
MonadState AnnexState,
|
|
|
|
|
Functor,
|
|
|
|
|
Applicative
|
2011-08-19 18:28:07 +00:00
|
|
|
|
)
|
2011-01-26 01:49:04 +00:00
|
|
|
|
|
2011-12-06 15:37:58 +00:00
|
|
|
|
instance MonadBase IO Annex where
|
|
|
|
|
liftBase = Annex . liftBase
|
|
|
|
|
|
|
|
|
|
instance MonadBaseControl IO Annex where
|
|
|
|
|
newtype StM Annex a = StAnnex (StM (StateT AnnexState IO) a)
|
|
|
|
|
liftBaseWith f = Annex $ liftBaseWith $ \runInIO ->
|
|
|
|
|
f $ liftM StAnnex . runInIO . runAnnex
|
|
|
|
|
restoreM = Annex . restoreM . unStAnnex
|
|
|
|
|
where
|
|
|
|
|
unStAnnex (StAnnex st) = st
|
2011-01-26 01:49:04 +00:00
|
|
|
|
|
2011-11-09 05:15:51 +00:00
|
|
|
|
data OutputType = NormalOutput | QuietOutput | JSONOutput
|
|
|
|
|
|
2011-12-31 08:19:10 +00:00
|
|
|
|
type Matcher a = Either [Utility.Matcher.Token a] (Utility.Matcher.Matcher a)
|
|
|
|
|
|
2011-01-26 01:49:04 +00:00
|
|
|
|
-- internal state storage
|
2011-01-26 04:17:38 +00:00
|
|
|
|
data AnnexState = AnnexState
|
|
|
|
|
{ repo :: Git.Repo
|
2011-12-31 08:11:39 +00:00
|
|
|
|
, backends :: [BackendA Annex]
|
|
|
|
|
, remotes :: [Types.Remote.RemoteA Annex]
|
2011-12-20 18:37:53 +00:00
|
|
|
|
, repoqueue :: Git.Queue.Queue
|
2011-09-01 17:35:07 +00:00
|
|
|
|
, output :: OutputType
|
2011-01-26 04:17:38 +00:00
|
|
|
|
, force :: Bool
|
2011-03-22 21:41:06 +00:00
|
|
|
|
, fast :: Bool
|
2011-09-15 17:30:04 +00:00
|
|
|
|
, auto :: Bool
|
2011-12-22 22:31:44 +00:00
|
|
|
|
, format :: Maybe Utility.Format.Format
|
2011-06-22 19:58:30 +00:00
|
|
|
|
, branchstate :: BranchState
|
2011-09-28 19:15:42 +00:00
|
|
|
|
, catfilehandle :: Maybe CatFileHandle
|
2011-05-18 23:34:46 +00:00
|
|
|
|
, forcebackend :: Maybe String
|
2011-06-01 20:49:17 +00:00
|
|
|
|
, forcenumcopies :: Maybe Int
|
2011-01-26 04:17:38 +00:00
|
|
|
|
, toremote :: Maybe String
|
|
|
|
|
, fromremote :: Maybe String
|
2011-12-31 08:19:10 +00:00
|
|
|
|
, limit :: Matcher (FilePath -> Annex Bool)
|
2011-06-01 23:10:38 +00:00
|
|
|
|
, forcetrust :: [(UUID, TrustLevel)]
|
2011-06-24 01:25:39 +00:00
|
|
|
|
, trustmap :: Maybe TrustMap
|
2011-12-08 20:01:46 +00:00
|
|
|
|
, ciphers :: M.Map EncryptedCipher Cipher
|
2011-04-16 20:41:46 +00:00
|
|
|
|
}
|
2011-01-26 04:17:38 +00:00
|
|
|
|
|
2011-07-05 22:31:46 +00:00
|
|
|
|
newState :: Git.Repo -> AnnexState
|
|
|
|
|
newState gitrepo = AnnexState
|
2011-01-26 04:17:38 +00:00
|
|
|
|
{ repo = gitrepo
|
|
|
|
|
, backends = []
|
2011-03-27 20:17:56 +00:00
|
|
|
|
, remotes = []
|
2011-12-20 18:37:53 +00:00
|
|
|
|
, repoqueue = Git.Queue.new
|
2011-09-01 17:35:07 +00:00
|
|
|
|
, output = NormalOutput
|
2011-01-26 04:17:38 +00:00
|
|
|
|
, force = False
|
2011-03-22 21:41:06 +00:00
|
|
|
|
, fast = False
|
2011-09-15 17:30:04 +00:00
|
|
|
|
, auto = False
|
2011-12-22 22:31:44 +00:00
|
|
|
|
, format = Nothing
|
2011-06-22 19:58:30 +00:00
|
|
|
|
, branchstate = startBranchState
|
2011-09-28 19:15:42 +00:00
|
|
|
|
, catfilehandle = Nothing
|
2011-05-18 23:34:46 +00:00
|
|
|
|
, forcebackend = Nothing
|
2011-06-01 20:49:17 +00:00
|
|
|
|
, forcenumcopies = Nothing
|
2011-01-26 04:17:38 +00:00
|
|
|
|
, toremote = Nothing
|
|
|
|
|
, fromremote = Nothing
|
2011-09-18 21:47:49 +00:00
|
|
|
|
, limit = Left []
|
2011-06-01 21:49:37 +00:00
|
|
|
|
, forcetrust = []
|
2011-06-24 01:25:39 +00:00
|
|
|
|
, trustmap = Nothing
|
2011-12-08 20:01:46 +00:00
|
|
|
|
, ciphers = M.empty
|
2011-01-26 04:17:38 +00:00
|
|
|
|
}
|
2010-10-14 07:18:11 +00:00
|
|
|
|
|
2010-10-26 19:59:50 +00:00
|
|
|
|
{- Create and returns an Annex state object for the specified git repo. -}
|
2011-07-05 22:31:46 +00:00
|
|
|
|
new :: Git.Repo -> IO AnnexState
|
2011-12-13 19:05:07 +00:00
|
|
|
|
new gitrepo = newState <$> Git.Config.read gitrepo
|
2010-10-14 07:18:11 +00:00
|
|
|
|
|
2010-10-26 19:59:50 +00:00
|
|
|
|
{- performs an action in the Annex monad -}
|
2011-01-11 22:13:26 +00:00
|
|
|
|
run :: AnnexState -> Annex a -> IO (a, AnnexState)
|
2011-08-19 18:28:07 +00:00
|
|
|
|
run s a = runStateT (runAnnex a) s
|
2011-01-11 22:13:26 +00:00
|
|
|
|
eval :: AnnexState -> Annex a -> IO a
|
2011-08-19 18:28:07 +00:00
|
|
|
|
eval s a = evalStateT (runAnnex a) s
|
2010-10-14 07:18:11 +00:00
|
|
|
|
|
2011-01-26 04:17:38 +00:00
|
|
|
|
{- Gets a value from the internal state, selected by the passed value
|
|
|
|
|
- constructor. -}
|
2011-01-26 01:49:04 +00:00
|
|
|
|
getState :: (AnnexState -> a) -> Annex a
|
2011-06-16 22:27:01 +00:00
|
|
|
|
getState = gets
|
2011-01-26 04:17:38 +00:00
|
|
|
|
|
|
|
|
|
{- Applies a state mutation function to change the internal state.
|
|
|
|
|
-
|
2011-12-20 20:03:09 +00:00
|
|
|
|
- Example: changeState $ \s -> s { output = QuietOutput }
|
2011-01-26 04:17:38 +00:00
|
|
|
|
-}
|
|
|
|
|
changeState :: (AnnexState -> AnnexState) -> Annex ()
|
2011-06-16 22:27:01 +00:00
|
|
|
|
changeState = modify
|
2011-01-26 01:49:04 +00:00
|
|
|
|
|
2011-11-08 19:34:10 +00:00
|
|
|
|
{- Returns the annex's git repository. -}
|
2010-10-14 07:18:11 +00:00
|
|
|
|
gitRepo :: Annex Git.Repo
|
2011-01-26 01:49:04 +00:00
|
|
|
|
gitRepo = getState repo
|
2011-11-08 19:34:10 +00:00
|
|
|
|
|
|
|
|
|
{- Runs an IO action in the annex's git repository. -}
|
|
|
|
|
inRepo :: (Git.Repo -> IO a) -> Annex a
|
2011-11-12 18:24:07 +00:00
|
|
|
|
inRepo a = liftIO . a =<< gitRepo
|
2011-11-08 19:34:10 +00:00
|
|
|
|
|
|
|
|
|
{- Extracts a value from the annex's git repisitory. -}
|
|
|
|
|
fromRepo :: (Git.Repo -> a) -> Annex a
|
|
|
|
|
fromRepo a = a <$> gitRepo
|