2010-10-27 16:53:54 -04:00
|
|
|
|
{- git-annex monad
|
|
|
|
|
-
|
|
|
|
|
- Copyright 2010 Joey Hess <joey@kitenet.net>
|
|
|
|
|
-
|
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
|
-}
|
2010-10-10 15:04:07 -04:00
|
|
|
|
|
2010-10-11 17:52:46 -04:00
|
|
|
|
module Annex (
|
2011-01-25 21:49:04 -04:00
|
|
|
|
Annex,
|
|
|
|
|
AnnexState(..),
|
2010-10-14 03:18:11 -04:00
|
|
|
|
new,
|
|
|
|
|
run,
|
2010-10-31 23:24:16 -04:00
|
|
|
|
eval,
|
2011-01-26 00:17:38 -04:00
|
|
|
|
getState,
|
|
|
|
|
changeState,
|
2011-04-07 13:59:31 -04:00
|
|
|
|
gitRepo
|
2010-10-11 17:52:46 -04:00
|
|
|
|
) where
|
2010-10-10 15:04:07 -04:00
|
|
|
|
|
2011-04-26 19:42:40 -04:00
|
|
|
|
import Control.Monad.State
|
|
|
|
|
(liftIO, StateT, runStateT, evalStateT, liftM, get, put)
|
2010-10-16 16:20:49 -04:00
|
|
|
|
|
2010-10-14 02:36:41 -04:00
|
|
|
|
import qualified GitRepo as Git
|
2010-10-26 15:59:50 -04:00
|
|
|
|
import qualified GitQueue
|
2011-03-15 22:04:50 -04:00
|
|
|
|
import qualified BackendClass
|
2011-03-27 16:17:56 -04:00
|
|
|
|
import qualified RemoteClass
|
2011-04-16 16:41:46 -04:00
|
|
|
|
import qualified CryptoTypes
|
2011-01-25 21:49:04 -04:00
|
|
|
|
|
|
|
|
|
-- git-annex's monad
|
|
|
|
|
type Annex = StateT AnnexState IO
|
|
|
|
|
|
|
|
|
|
-- internal state storage
|
2011-01-26 00:17:38 -04:00
|
|
|
|
data AnnexState = AnnexState
|
|
|
|
|
{ repo :: Git.Repo
|
2011-03-15 22:04:50 -04:00
|
|
|
|
, backends :: [BackendClass.Backend Annex]
|
|
|
|
|
, supportedBackends :: [BackendClass.Backend Annex]
|
2011-03-27 16:17:56 -04:00
|
|
|
|
, remotes :: [RemoteClass.Remote Annex]
|
2011-01-26 00:17:38 -04:00
|
|
|
|
, repoqueue :: GitQueue.Queue
|
|
|
|
|
, quiet :: Bool
|
|
|
|
|
, force :: Bool
|
2011-03-22 17:41:06 -04:00
|
|
|
|
, fast :: Bool
|
2011-05-18 19:34:46 -04:00
|
|
|
|
, forcebackend :: Maybe String
|
2011-01-26 00:17:38 -04:00
|
|
|
|
, defaultkey :: Maybe String
|
|
|
|
|
, toremote :: Maybe String
|
|
|
|
|
, fromremote :: Maybe String
|
|
|
|
|
, exclude :: [String]
|
2011-04-16 16:41:46 -04:00
|
|
|
|
, cipher :: Maybe CryptoTypes.Cipher
|
|
|
|
|
}
|
2011-01-26 00:17:38 -04:00
|
|
|
|
|
2011-03-15 22:04:50 -04:00
|
|
|
|
newState :: Git.Repo -> [BackendClass.Backend Annex] -> AnnexState
|
2011-01-26 00:17:38 -04:00
|
|
|
|
newState gitrepo allbackends = AnnexState
|
|
|
|
|
{ repo = gitrepo
|
|
|
|
|
, backends = []
|
2011-03-27 16:17:56 -04:00
|
|
|
|
, remotes = []
|
2011-01-26 00:17:38 -04:00
|
|
|
|
, supportedBackends = allbackends
|
|
|
|
|
, repoqueue = GitQueue.empty
|
|
|
|
|
, quiet = False
|
|
|
|
|
, force = False
|
2011-03-22 17:41:06 -04:00
|
|
|
|
, fast = False
|
2011-05-18 19:34:46 -04:00
|
|
|
|
, forcebackend = Nothing
|
2011-01-26 00:17:38 -04:00
|
|
|
|
, defaultkey = Nothing
|
|
|
|
|
, toremote = Nothing
|
|
|
|
|
, fromremote = Nothing
|
|
|
|
|
, exclude = []
|
2011-04-16 16:41:46 -04:00
|
|
|
|
, cipher = Nothing
|
2011-01-26 00:17:38 -04:00
|
|
|
|
}
|
2010-10-14 03:18:11 -04:00
|
|
|
|
|
2010-10-26 15:59:50 -04:00
|
|
|
|
{- Create and returns an Annex state object for the specified git repo. -}
|
2011-03-15 22:04:50 -04:00
|
|
|
|
new :: Git.Repo -> [BackendClass.Backend Annex] -> IO AnnexState
|
2010-10-17 11:47:36 -04:00
|
|
|
|
new gitrepo allbackends = do
|
2011-01-26 00:17:38 -04:00
|
|
|
|
gitrepo' <- liftIO $ Git.configRead gitrepo
|
|
|
|
|
return $ newState gitrepo' allbackends
|
2010-10-14 03:18:11 -04:00
|
|
|
|
|
2010-10-26 15:59:50 -04:00
|
|
|
|
{- performs an action in the Annex monad -}
|
2011-01-11 18:13:26 -04:00
|
|
|
|
run :: AnnexState -> Annex a -> IO (a, AnnexState)
|
2010-11-06 17:07:11 -04:00
|
|
|
|
run state action = runStateT action state
|
2011-01-11 18:13:26 -04:00
|
|
|
|
eval :: AnnexState -> Annex a -> IO a
|
2010-11-06 17:07:11 -04:00
|
|
|
|
eval state action = evalStateT action state
|
2010-10-14 03:18:11 -04:00
|
|
|
|
|
2011-01-26 00:17:38 -04:00
|
|
|
|
{- Gets a value from the internal state, selected by the passed value
|
|
|
|
|
- constructor. -}
|
2011-01-25 21:49:04 -04:00
|
|
|
|
getState :: (AnnexState -> a) -> Annex a
|
2011-02-19 17:00:40 -04:00
|
|
|
|
getState c = liftM c get
|
2011-01-26 00:17:38 -04:00
|
|
|
|
|
|
|
|
|
{- Applies a state mutation function to change the internal state.
|
|
|
|
|
-
|
|
|
|
|
- Example: changeState (\s -> s { quiet = True })
|
|
|
|
|
-}
|
|
|
|
|
changeState :: (AnnexState -> AnnexState) -> Annex ()
|
2011-05-15 15:27:49 -04:00
|
|
|
|
changeState a = put . a =<< get
|
2011-01-25 21:49:04 -04:00
|
|
|
|
|
2010-10-26 15:59:50 -04:00
|
|
|
|
{- Returns the git repository being acted on -}
|
2010-10-14 03:18:11 -04:00
|
|
|
|
gitRepo :: Annex Git.Repo
|
2011-01-25 21:49:04 -04:00
|
|
|
|
gitRepo = getState repo
|