2011-09-15 20:57:02 +00:00
|
|
|
{- git-annex command infrastructure
|
2010-11-02 23:04:24 +00:00
|
|
|
-
|
2016-08-03 16:37:12 +00:00
|
|
|
- Copyright 2010-2016 Joey Hess <id@joeyh.name>
|
2010-11-02 23:04:24 +00:00
|
|
|
-
|
2019-03-13 19:48:14 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2010-11-02 23:04:24 +00:00
|
|
|
-}
|
|
|
|
|
2011-10-30 03:48:46 +00:00
|
|
|
module Command (
|
2016-01-21 17:14:38 +00:00
|
|
|
module Command,
|
2011-11-11 05:52:58 +00:00
|
|
|
module ReExported
|
2011-10-30 03:48:46 +00:00
|
|
|
) where
|
2010-11-02 23:04:24 +00:00
|
|
|
|
2016-01-20 20:36:33 +00:00
|
|
|
import Annex.Common as ReExported
|
2016-01-21 17:14:38 +00:00
|
|
|
import Annex.WorkTree as ReExported (whenAnnexed, ifAnnexed)
|
2011-11-11 05:52:58 +00:00
|
|
|
import Types.Command as ReExported
|
2015-07-09 20:20:30 +00:00
|
|
|
import Types.DeferredParse as ReExported
|
2016-01-20 20:36:33 +00:00
|
|
|
import CmdLine.Seek as ReExported
|
2014-01-26 20:25:55 +00:00
|
|
|
import CmdLine.Usage as ReExported
|
2014-01-29 17:44:53 +00:00
|
|
|
import CmdLine.Action as ReExported
|
2014-01-26 20:25:55 +00:00
|
|
|
import CmdLine.Option as ReExported
|
2015-07-10 16:47:35 +00:00
|
|
|
import CmdLine.GlobalSetter as ReExported
|
2014-01-26 20:25:55 +00:00
|
|
|
import CmdLine.GitAnnex.Options as ReExported
|
2016-01-20 20:36:33 +00:00
|
|
|
import CmdLine.Batch as ReExported
|
2015-07-09 19:23:14 +00:00
|
|
|
import Options.Applicative as ReExported hiding (command)
|
2017-02-16 17:24:16 +00:00
|
|
|
import qualified Annex
|
2016-01-21 17:14:38 +00:00
|
|
|
import qualified Git
|
|
|
|
import Annex.Init
|
|
|
|
import Config
|
|
|
|
import Utility.Daemon
|
2016-08-03 16:37:12 +00:00
|
|
|
import Types.Transfer
|
|
|
|
import Types.ActionItem
|
2017-02-16 17:24:16 +00:00
|
|
|
import Types.Messages
|
2015-07-08 19:39:05 +00:00
|
|
|
|
2015-07-08 16:33:27 +00:00
|
|
|
{- Generates a normal Command -}
|
2015-07-08 20:58:54 +00:00
|
|
|
command :: String -> CommandSection -> String -> CmdParamsDesc -> (CmdParamsDesc -> CommandParser) -> Command
|
2015-07-08 19:08:02 +00:00
|
|
|
command name section desc paramdesc mkparser =
|
2015-07-10 17:49:46 +00:00
|
|
|
Command commonChecks False False name paramdesc
|
2016-09-05 19:32:59 +00:00
|
|
|
section desc (mkparser paramdesc) [] Nothing
|
2015-07-08 19:39:05 +00:00
|
|
|
|
2015-07-08 20:58:54 +00:00
|
|
|
{- Simple option parser that takes all non-option params as-is. -}
|
2016-01-21 17:14:38 +00:00
|
|
|
withParams :: (CmdParams -> v) -> CmdParamsDesc -> Parser v
|
2015-07-08 20:58:54 +00:00
|
|
|
withParams mkseek paramdesc = mkseek <$> cmdParams paramdesc
|
|
|
|
|
2015-07-09 20:05:45 +00:00
|
|
|
{- Uses the supplied option parser, which yields a deferred parse,
|
|
|
|
- and calls finishParse on the result before passing it to the
|
|
|
|
- CommandSeek constructor. -}
|
|
|
|
(<--<) :: DeferredParseClass a
|
|
|
|
=> (a -> CommandSeek)
|
|
|
|
-> (CmdParamsDesc -> Parser a)
|
|
|
|
-> CmdParamsDesc
|
|
|
|
-> Parser CommandSeek
|
|
|
|
(<--<) mkseek optparser paramsdesc =
|
|
|
|
(mkseek <=< finishParse) <$> optparser paramsdesc
|
|
|
|
|
2012-09-16 00:46:38 +00:00
|
|
|
{- Indicates that a command doesn't need to commit any changes to
|
|
|
|
- the git-annex branch. -}
|
|
|
|
noCommit :: Command -> Command
|
|
|
|
noCommit c = c { cmdnocommit = True }
|
2011-11-16 04:49:09 +00:00
|
|
|
|
2016-01-20 18:07:13 +00:00
|
|
|
{- Indicates that a command should not output the usual messages when
|
|
|
|
- starting or stopping processing a file or other item. Unless --json mode
|
|
|
|
- is enabled, this also enables quiet output mode, so only things
|
|
|
|
- explicitly output by the command are shown and not progress messages
|
|
|
|
- etc. -}
|
2013-07-31 00:24:27 +00:00
|
|
|
noMessages :: Command -> Command
|
|
|
|
noMessages c = c { cmdnomessages = True }
|
|
|
|
|
2017-02-16 17:24:16 +00:00
|
|
|
{- Undoes noMessages -}
|
|
|
|
allowMessages :: Annex ()
|
|
|
|
allowMessages = do
|
2017-12-05 19:00:50 +00:00
|
|
|
outputType <$> Annex.getState Annex.output >>= \case
|
2017-02-16 17:24:16 +00:00
|
|
|
QuietOutput -> Annex.setOutput NormalOutput
|
|
|
|
_ -> noop
|
|
|
|
Annex.changeState $ \s -> s
|
|
|
|
{ Annex.output = (Annex.output s) { implicitMessages = True } }
|
|
|
|
|
2011-11-16 04:49:09 +00:00
|
|
|
{- Adds a fallback action to a command, that will be run if it's used
|
|
|
|
- outside a git repository. -}
|
2016-01-21 17:14:38 +00:00
|
|
|
noRepo :: (String -> Parser (IO ())) -> Command -> Command
|
2015-07-08 19:39:05 +00:00
|
|
|
noRepo a c = c { cmdnorepo = Just (a (cmdparamdesc c)) }
|
2010-11-04 17:28:49 +00:00
|
|
|
|
2018-02-19 18:28:17 +00:00
|
|
|
{- Adds global options to a command. -}
|
|
|
|
withGlobalOptions :: [[GlobalOption]] -> Command -> Command
|
|
|
|
withGlobalOptions os c = c { cmdglobaloptions = cmdglobaloptions c ++ concat os }
|
2015-07-10 16:47:35 +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-12-09 16:23:45 +00:00
|
|
|
{- Stops unless a condition is met. -}
|
|
|
|
stopUnless :: Annex Bool -> Annex (Maybe a) -> Annex (Maybe a)
|
2012-03-14 21:43:34 +00:00
|
|
|
stopUnless c a = ifM c ( a , stop )
|
2011-12-09 16:23:45 +00:00
|
|
|
|
2016-08-03 16:37:12 +00:00
|
|
|
{- When acting on a failed transfer, stops unless it was in the specified
|
|
|
|
- direction. -}
|
|
|
|
checkFailedTransferDirection :: ActionItem -> Direction -> Annex (Maybe a) -> Annex (Maybe a)
|
|
|
|
checkFailedTransferDirection ai d = stopUnless (pure check)
|
|
|
|
where
|
|
|
|
check = case actionItemTransferDirection ai of
|
|
|
|
Nothing -> True
|
|
|
|
Just d' -> d' == d
|
|
|
|
|
2016-01-21 17:14:38 +00:00
|
|
|
commonChecks :: [CommandCheck]
|
|
|
|
commonChecks = [repoExists]
|
|
|
|
|
|
|
|
repoExists :: CommandCheck
|
|
|
|
repoExists = CommandCheck 0 ensureInitialized
|
|
|
|
|
|
|
|
notDirect :: Command -> Command
|
|
|
|
notDirect = addCheck $ whenM isDirect $
|
2016-11-16 01:29:54 +00:00
|
|
|
giveup "You cannot run this command in a direct mode repository."
|
2016-01-21 17:14:38 +00:00
|
|
|
|
|
|
|
notBareRepo :: Command -> Command
|
|
|
|
notBareRepo = addCheck $ whenM (fromRepo Git.repoIsLocalBare) $
|
2016-11-16 01:29:54 +00:00
|
|
|
giveup "You cannot run this command in a bare repository."
|
2016-01-21 17:14:38 +00:00
|
|
|
|
|
|
|
noDaemonRunning :: Command -> Command
|
|
|
|
noDaemonRunning = addCheck $ whenM (isJust <$> daemonpid) $
|
2016-11-16 01:29:54 +00:00
|
|
|
giveup "You cannot run this command while git-annex watch or git-annex assistant is running."
|
2016-01-21 17:14:38 +00:00
|
|
|
where
|
|
|
|
daemonpid = liftIO . checkDaemon =<< fromRepo gitAnnexPidFile
|
|
|
|
|
|
|
|
dontCheck :: CommandCheck -> Command -> Command
|
|
|
|
dontCheck check cmd = mutateCheck cmd $ \c -> filter (/= check) c
|
|
|
|
|
|
|
|
addCheck :: Annex () -> Command -> Command
|
|
|
|
addCheck check cmd = mutateCheck cmd $ \c ->
|
|
|
|
CommandCheck (length c + 100) check : c
|
|
|
|
|
|
|
|
mutateCheck :: Command -> ([CommandCheck] -> [CommandCheck]) -> Command
|
|
|
|
mutateCheck cmd@(Command { cmdcheck = c }) a = cmd { cmdcheck = a c }
|