git-annex/CmdLine/Option.hs

84 lines
2.8 KiB
Haskell
Raw Normal View History

2013-03-27 17:51:24 +00:00
{- common command-line options
-
- Copyright 2010-2011 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
2014-01-26 20:25:55 +00:00
module CmdLine.Option (
commonOptions,
matcherOptions,
flagOption,
fieldOption,
optionName,
ArgDescr(..),
OptDescr(..),
) where
import System.Console.GetOpt
2011-10-05 20:02:51 +00:00
import Common.Annex
import qualified Annex
import Types.Messages
import Types.DesktopNotify
import Limit
2014-01-26 20:25:55 +00:00
import CmdLine.Usage
2014-01-26 20:25:55 +00:00
commonOptions :: [Option]
commonOptions =
[ Option [] ["force"] (NoArg (setforce True))
"allow actions that may lose annexed data"
, Option ['F'] ["fast"] (NoArg (setfast True))
"avoid slow operations"
, Option ['a'] ["auto"] (NoArg (setauto True))
"automatic mode"
2012-04-30 17:59:05 +00:00
, Option ['q'] ["quiet"] (NoArg (Annex.setOutput QuietOutput))
"avoid verbose output"
2012-04-30 17:59:05 +00:00
, Option ['v'] ["verbose"] (NoArg (Annex.setOutput NormalOutput))
"allow verbose output (default)"
2012-02-16 04:41:30 +00:00
, Option ['d'] ["debug"] (NoArg setdebug)
"show debug messages"
, Option [] ["no-debug"] (NoArg unsetdebug)
"don't show debug messages"
, Option ['b'] ["backend"] (ReqArg setforcebackend paramName)
"specify key-value backend to use"
, Option [] ["notify-finish"] (NoArg (setdesktopnotify mkNotifyFinish))
"show desktop notification after transfer finishes"
, Option [] ["notify-start"] (NoArg (setdesktopnotify mkNotifyStart))
"show desktop notification after transfer completes"
]
where
setforce v = Annex.changeState $ \s -> s { Annex.force = v }
setfast v = Annex.changeState $ \s -> s { Annex.fast = v }
setauto v = Annex.changeState $ \s -> s { Annex.auto = v }
setforcebackend v = Annex.changeState $ \s -> s { Annex.forcebackend = Just v }
setdebug = Annex.changeGitConfig $ \c -> c { annexDebug = True }
unsetdebug = Annex.changeGitConfig $ \c -> c { annexDebug = False }
setdesktopnotify v = Annex.changeState $ \s -> s { Annex.desktopnotify = Annex.desktopnotify s <> v }
2012-01-06 14:14:37 +00:00
2014-01-26 20:25:55 +00:00
matcherOptions :: [Option]
matcherOptions =
[ longopt "not" "negate next option"
, longopt "and" "both previous and next option must match"
, longopt "or" "either previous or next option must match"
, shortopt "(" "open group of options"
, shortopt ")" "close group of options"
]
where
longopt o = Option [] [o] $ NoArg $ addToken o
shortopt o = Option o [] $ NoArg $ addToken o
{- An option that sets a flag. -}
2014-01-26 20:25:55 +00:00
flagOption :: String -> String -> String -> Option
flagOption short opt description =
2012-01-06 14:14:37 +00:00
Option short [opt] (NoArg (Annex.setFlag opt)) description
{- An option that sets a field. -}
2014-01-26 20:25:55 +00:00
fieldOption :: String -> String -> String -> String -> Option
fieldOption short opt paramdesc description =
2012-01-06 14:14:37 +00:00
Option short [opt] (ReqArg (Annex.setField opt) paramdesc) description
{- The flag or field name used for an option. -}
2014-01-26 20:25:55 +00:00
optionName :: Option -> String
optionName (Option _ o _ _) = Prelude.head o