git-annex/Command.hs

97 lines
2.8 KiB
Haskell
Raw Normal View History

2011-09-15 20:57:02 +00:00
{- git-annex command infrastructure
-
2011-09-19 05:37:04 +00:00
- Copyright 2010-2011 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Command (
command,
next,
stop,
prepCommand,
doCommand,
whenAnnexed,
notAnnexed,
notBareRepo,
isBareRepo,
2011-11-11 05:52:58 +00:00
autoCopies,
module ReExported
) where
2011-10-05 20:02:51 +00:00
import Common.Annex
2010-11-04 17:28:49 +00:00
import qualified Backend
import qualified Annex
import qualified Git
2011-11-11 05:52:58 +00:00
import Types.Command as ReExported
import Seek as ReExported
import Checks as ReExported
import Options as ReExported
2011-10-15 20:21:08 +00:00
import Logs.Trust
import Logs.Location
import Config
{- Generates a command with the common checks. -}
command :: String -> String -> [CommandSeek] -> String -> Command
command = Command commonChecks
2010-11-04 17:28:49 +00:00
2011-05-15 06:02:46 +00:00
{- For start and perform stages to indicate what step to run next. -}
next :: a -> Annex (Maybe a)
next a = return $ Just a
{- Or to indicate nothing needs to be done. -}
stop :: Annex (Maybe a)
stop = return Nothing
2011-10-31 00:04:15 +00:00
{- Prepares to run a command via the check and seek stages, returning a
- list of actions to perform to run the command. -}
prepCommand :: Command -> [String] -> Annex [CommandCleanup]
prepCommand Command { cmdseek = seek, cmdcheck = c } params = do
2011-11-11 05:52:58 +00:00
mapM_ runCheck c
2011-10-31 00:04:15 +00:00
map doCommand . concat <$> mapM (\s -> s params) seek
2010-11-04 17:28:49 +00:00
{- Runs a command through the start, perform and cleanup stages -}
doCommand :: CommandStart -> CommandCleanup
2011-05-15 16:25:58 +00:00
doCommand = start
where
2011-10-31 00:04:15 +00:00
start = stage $ maybe skip perform
2011-07-05 18:58:33 +00:00
perform = stage $ maybe failure cleanup
2011-10-31 00:04:15 +00:00
cleanup = stage $ status
2011-09-19 05:37:04 +00:00
stage = (=<<)
2011-10-31 00:04:15 +00:00
skip = return True
2011-09-19 05:37:04 +00:00
failure = showEndFail >> return False
2011-10-31 00:04:15 +00:00
status r = showEndResult r >> return r
2010-11-04 17:28:49 +00:00
{- Modifies an action to only act on files that are already annexed,
- and passes the key and backend on to it. -}
whenAnnexed :: (FilePath -> (Key, Backend Annex) -> Annex (Maybe a)) -> FilePath -> Annex (Maybe a)
whenAnnexed a file = maybe (return Nothing) (a file) =<< Backend.lookupFile file
notAnnexed :: FilePath -> Annex (Maybe a) -> Annex (Maybe a)
notAnnexed file a = maybe a (const $ return Nothing) =<< Backend.lookupFile file
notBareRepo :: Annex a -> Annex a
notBareRepo a = do
2011-10-29 22:47:53 +00:00
whenM isBareRepo $
error "You cannot run this subcommand in a bare repository."
a
isBareRepo :: Annex Bool
isBareRepo = fromRepo Git.repoIsLocalBare
{- Used for commands that have an auto mode that checks the number of known
- copies of a key.
-
- In auto mode, first checks that the number of known
- copies of the key is > or < than the numcopies setting, before running
- the action. -}
autoCopies :: Key -> (Int -> Int -> Bool) -> Maybe Int -> CommandStart -> CommandStart
autoCopies key vs numcopiesattr a = do
auto <- Annex.getState Annex.auto
if auto
then do
needed <- getNumCopies numcopiesattr
(_, have) <- trustPartition UnTrusted =<< keyLocations key
if length have `vs` needed then a else stop
else a