2010-10-27 20:53:54 +00:00
|
|
|
{- git-annex monad
|
|
|
|
-
|
|
|
|
- Copyright 2010 Joey Hess <joey@kitenet.net>
|
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
-}
|
2010-10-10 19:04:07 +00:00
|
|
|
|
2010-10-11 21:52:46 +00:00
|
|
|
module Annex (
|
2010-10-14 07:18:11 +00:00
|
|
|
new,
|
|
|
|
run,
|
2010-11-01 03:24:16 +00:00
|
|
|
eval,
|
2010-10-14 07:18:11 +00:00
|
|
|
gitRepo,
|
|
|
|
gitRepoChange,
|
|
|
|
backends,
|
|
|
|
backendsChange,
|
2010-10-17 15:47:36 +00:00
|
|
|
supportedBackends,
|
2010-10-15 01:10:59 +00:00
|
|
|
flagIsSet,
|
2010-10-15 03:52:45 +00:00
|
|
|
flagChange,
|
2010-10-21 20:30:16 +00:00
|
|
|
flagGet,
|
2010-10-26 19:59:50 +00:00
|
|
|
Flag(..),
|
|
|
|
queue,
|
2010-11-08 18:39:12 +00:00
|
|
|
queueGet,
|
2010-11-08 20:40:02 +00:00
|
|
|
queueRun,
|
2010-11-08 18:39:12 +00:00
|
|
|
setConfig
|
2010-10-11 21:52:46 +00:00
|
|
|
) where
|
2010-10-10 19:04:07 +00:00
|
|
|
|
2010-10-14 07:18:11 +00:00
|
|
|
import Control.Monad.State
|
2010-10-21 20:30:16 +00:00
|
|
|
import qualified Data.Map as M
|
2010-10-16 20:20:49 +00:00
|
|
|
|
2010-10-14 06:36:41 +00:00
|
|
|
import qualified GitRepo as Git
|
2010-10-26 19:59:50 +00:00
|
|
|
import qualified GitQueue
|
2010-10-14 07:18:11 +00:00
|
|
|
import Types
|
2010-10-18 06:06:27 +00:00
|
|
|
import qualified TypeInternals as Internals
|
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. -}
|
2010-10-17 15:47:36 +00:00
|
|
|
new :: Git.Repo -> [Backend] -> IO AnnexState
|
|
|
|
new gitrepo allbackends = do
|
2010-10-18 06:06:27 +00:00
|
|
|
let s = Internals.AnnexState {
|
|
|
|
Internals.repo = gitrepo,
|
|
|
|
Internals.backends = [],
|
|
|
|
Internals.supportedBackends = allbackends,
|
2010-10-26 19:59:50 +00:00
|
|
|
Internals.flags = M.empty,
|
|
|
|
Internals.repoqueue = GitQueue.empty
|
2010-10-15 01:10:59 +00:00
|
|
|
}
|
2010-10-31 18:32:18 +00:00
|
|
|
(_,s') <- Annex.run s prep
|
2010-10-14 20:13:43 +00:00
|
|
|
return s'
|
|
|
|
where
|
2010-10-31 18:32:18 +00:00
|
|
|
prep = do
|
2010-10-14 20:13:43 +00:00
|
|
|
-- read git config and update state
|
2010-12-31 19:46:33 +00:00
|
|
|
gitrepo' <- liftIO $ Git.configRead gitrepo
|
2010-10-17 15:47:36 +00:00
|
|
|
Annex.gitRepoChange gitrepo'
|
2010-10-14 07:18:11 +00:00
|
|
|
|
2010-10-26 19:59:50 +00:00
|
|
|
{- performs an action in the Annex monad -}
|
2010-10-31 18:32:18 +00:00
|
|
|
run :: AnnexState -> StateT AnnexState IO a -> IO (a, AnnexState)
|
2010-11-06 21:07:11 +00:00
|
|
|
run state action = runStateT action state
|
2010-11-01 03:24:16 +00:00
|
|
|
eval :: AnnexState -> StateT AnnexState IO a -> IO a
|
2010-11-06 21:07:11 +00:00
|
|
|
eval state action = evalStateT action state
|
2010-10-14 07:18:11 +00:00
|
|
|
|
2010-10-26 19:59:50 +00:00
|
|
|
{- Returns the git repository being acted on -}
|
2010-10-14 07:18:11 +00:00
|
|
|
gitRepo :: Annex Git.Repo
|
|
|
|
gitRepo = do
|
|
|
|
state <- get
|
2010-10-18 06:06:27 +00:00
|
|
|
return (Internals.repo state)
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Changes the git repository being acted on. -}
|
2010-10-14 07:18:11 +00:00
|
|
|
gitRepoChange :: Git.Repo -> Annex ()
|
|
|
|
gitRepoChange r = do
|
|
|
|
state <- get
|
2010-10-18 06:06:27 +00:00
|
|
|
put state { Internals.repo = r }
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Returns the backends being used. -}
|
2010-10-14 07:18:11 +00:00
|
|
|
backends :: Annex [Backend]
|
|
|
|
backends = do
|
|
|
|
state <- get
|
2010-10-18 06:06:27 +00:00
|
|
|
return (Internals.backends state)
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Sets the backends to use. -}
|
2010-10-14 07:18:11 +00:00
|
|
|
backendsChange :: [Backend] -> Annex ()
|
|
|
|
backendsChange b = do
|
|
|
|
state <- get
|
2010-10-18 06:06:27 +00:00
|
|
|
put state { Internals.backends = b }
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Returns the full list of supported backends. -}
|
2010-10-17 15:47:36 +00:00
|
|
|
supportedBackends :: Annex [Backend]
|
|
|
|
supportedBackends = do
|
|
|
|
state <- get
|
2010-10-18 06:06:27 +00:00
|
|
|
return (Internals.supportedBackends state)
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Return True if a Bool flag is set. -}
|
2010-10-21 20:30:16 +00:00
|
|
|
flagIsSet :: FlagName -> Annex Bool
|
|
|
|
flagIsSet name = do
|
2010-10-15 01:10:59 +00:00
|
|
|
state <- get
|
2010-10-21 20:30:16 +00:00
|
|
|
case (M.lookup name $ Internals.flags state) of
|
|
|
|
Just (FlagBool True) -> return True
|
|
|
|
_ -> return False
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Sets the value of a flag. -}
|
2010-10-21 20:30:16 +00:00
|
|
|
flagChange :: FlagName -> Flag -> Annex ()
|
|
|
|
flagChange name val = do
|
2010-10-15 01:10:59 +00:00
|
|
|
state <- get
|
2010-10-21 20:30:16 +00:00
|
|
|
put state { Internals.flags = M.insert name val $ Internals.flags state }
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Gets the value of a String flag (or "" if there is no such String flag) -}
|
2010-10-21 20:30:16 +00:00
|
|
|
flagGet :: FlagName -> Annex String
|
|
|
|
flagGet name = do
|
|
|
|
state <- get
|
|
|
|
case (M.lookup name $ Internals.flags state) of
|
|
|
|
Just (FlagString s) -> return s
|
|
|
|
_ -> return ""
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Adds a git command to the queue. -}
|
|
|
|
queue :: String -> [String] -> FilePath -> Annex ()
|
2010-12-30 18:19:16 +00:00
|
|
|
queue command params file = do
|
2010-10-26 19:59:50 +00:00
|
|
|
state <- get
|
|
|
|
let q = Internals.repoqueue state
|
2010-12-30 18:19:16 +00:00
|
|
|
put state { Internals.repoqueue = GitQueue.add q command params file }
|
2010-10-26 19:59:50 +00:00
|
|
|
|
|
|
|
{- Returns the queue. -}
|
|
|
|
queueGet :: Annex GitQueue.Queue
|
|
|
|
queueGet = do
|
|
|
|
state <- get
|
|
|
|
return (Internals.repoqueue state)
|
2010-11-08 18:39:12 +00:00
|
|
|
|
2010-11-08 20:40:02 +00:00
|
|
|
{- Runs (and empties) the queue. -}
|
|
|
|
queueRun :: Annex ()
|
|
|
|
queueRun = do
|
|
|
|
state <- get
|
|
|
|
let q = Internals.repoqueue state
|
|
|
|
g <- gitRepo
|
|
|
|
liftIO $ GitQueue.run g q
|
|
|
|
put state { Internals.repoqueue = GitQueue.empty }
|
|
|
|
|
2010-11-08 18:39:12 +00:00
|
|
|
{- Changes a git config setting in both internal state and .git/config -}
|
|
|
|
setConfig :: String -> String -> Annex ()
|
|
|
|
setConfig key value = do
|
|
|
|
g <- Annex.gitRepo
|
|
|
|
liftIO $ Git.run g ["config", key, value]
|
|
|
|
-- re-read git config and update the repo's state
|
2010-12-31 19:46:33 +00:00
|
|
|
g' <- liftIO $ Git.configRead g
|
2010-11-08 18:39:12 +00:00
|
|
|
Annex.gitRepoChange g'
|