summaryrefslogtreecommitdiff
path: root/Option.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-01-06 10:14:37 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-01-06 10:57:57 -0400
commit1f8a1058c96bd4ee11fcb353f0ede1842d79ab6a (patch)
tree0754233445da5c75737aa2b7866881d30939ec56 /Option.hs
parentdf21cbfdd2b7342c206ebd4aea32d989328374dc (diff)
tweak
Diffstat (limited to 'Option.hs')
-rw-r--r--Option.hs79
1 files changed, 79 insertions, 0 deletions
diff --git a/Option.hs b/Option.hs
new file mode 100644
index 000000000..d6d8b44a3
--- /dev/null
+++ b/Option.hs
@@ -0,0 +1,79 @@
+{- git-annex command-line options
+ -
+ - Copyright 2010-2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Option (
+ common,
+ matcher,
+ flag,
+ field,
+ name,
+ ArgDescr(..),
+ OptDescr(..),
+) where
+
+import System.Console.GetOpt
+import System.Log.Logger
+
+import Common.Annex
+import qualified Annex
+import Limit
+import Usage
+
+common :: [Option]
+common =
+ [ 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"
+ , Option ['q'] ["quiet"] (NoArg (setoutput Annex.QuietOutput))
+ "avoid verbose output"
+ , Option ['v'] ["verbose"] (NoArg (setoutput Annex.NormalOutput))
+ "allow verbose output (default)"
+ , Option ['j'] ["json"] (NoArg (setoutput Annex.JSONOutput))
+ "enable JSON output"
+ , Option ['d'] ["debug"] (NoArg (setdebug))
+ "show debug messages"
+ , Option ['b'] ["backend"] (ReqArg setforcebackend paramName)
+ "specify key-value backend to use"
+ ]
+ 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 }
+ setoutput v = Annex.changeState $ \s -> s { Annex.output = v }
+ setforcebackend v = Annex.changeState $ \s -> s { Annex.forcebackend = Just v }
+ setdebug = liftIO $ updateGlobalLogger rootLoggerName $
+ setLevel DEBUG
+
+matcher :: [Option]
+matcher =
+ [ 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. -}
+flag :: String -> String -> String -> Option
+flag short opt description =
+ Option short [opt] (NoArg (Annex.setFlag opt)) description
+
+{- An option that sets a field. -}
+field :: String -> String -> String -> String -> Option
+field short opt paramdesc description =
+ Option short [opt] (ReqArg (Annex.setField opt) paramdesc) description
+
+{- The flag or field name used for an option. -}
+name :: Option -> String
+name (Option _ o _ _) = Prelude.head o
+