summaryrefslogtreecommitdiff
path: root/Usage.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-01-05 22:48:59 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-01-05 23:11:07 -0400
commitad43f0362688a601ba43f462e80f5a91bf398c02 (patch)
tree550788062a775eb6b2c2c087052993aa10435875 /Usage.hs
parent47be4383b714320c9e3f49cc23315101fad5735b (diff)
per-command options
Finally commands can define their own options. Moved --format and --print0 to be options only of find.
Diffstat (limited to 'Usage.hs')
-rw-r--r--Usage.hs84
1 files changed, 84 insertions, 0 deletions
diff --git a/Usage.hs b/Usage.hs
new file mode 100644
index 000000000..428a53fde
--- /dev/null
+++ b/Usage.hs
@@ -0,0 +1,84 @@
+{- git-annex usage messages
+ -
+ - Copyright 2010-2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Usage where
+
+import System.Console.GetOpt
+
+import Types.Command
+import Types.Option
+
+{- Usage message with lists of commands and options. -}
+usage :: String -> [Command] -> [Option] -> String
+usage header cmds commonoptions = unlines $
+ [ header
+ , ""
+ , "Options:"
+ ] ++ optlines ++
+ [ ""
+ , "Commands:"
+ , ""
+ ] ++ cmdlines
+ where
+ -- To get consistent indentation of options, generate the
+ -- usage for all options at once. A command's options will
+ -- be displayed after the command.
+ alloptlines = filter (not . null) $
+ lines $ usageInfo "" $
+ concatMap cmdoptions cmds ++ commonoptions
+ (cmdlines, optlines) = go cmds alloptlines []
+ go [] os ls = (ls, os)
+ go (c:cs) os ls = go cs os' (ls++(l:o))
+ where
+ (o, os') = splitAt (length $ cmdoptions c) os
+ l = concat
+ [ cmdname c
+ , namepad (cmdname c)
+ , cmdparamdesc c
+ , descpad (cmdparamdesc c)
+ , cmddesc c
+ ]
+ pad n s = replicate (n - length s) ' '
+ namepad = pad $ longest cmdname + 1
+ descpad = pad $ longest cmdparamdesc + 2
+ longest f = foldl max 0 $ map (length . f) cmds
+
+{- Descriptions of params used in usage messages. -}
+paramPaths :: String
+paramPaths = paramOptional $ paramRepeating paramPath -- most often used
+paramPath :: String
+paramPath = "PATH"
+paramKey :: String
+paramKey = "KEY"
+paramDesc :: String
+paramDesc = "DESC"
+paramUrl :: String
+paramUrl = "URL"
+paramNumber :: String
+paramNumber = "NUMBER"
+paramRemote :: String
+paramRemote = "REMOTE"
+paramGlob :: String
+paramGlob = "GLOB"
+paramName :: String
+paramName = "NAME"
+paramUUID :: String
+paramUUID = "UUID"
+paramType :: String
+paramType = "TYPE"
+paramFormat :: String
+paramFormat = "FORMAT"
+paramKeyValue :: String
+paramKeyValue = "K=V"
+paramNothing :: String
+paramNothing = ""
+paramRepeating :: String -> String
+paramRepeating s = s ++ " ..."
+paramOptional :: String -> String
+paramOptional s = "[" ++ s ++ "]"
+paramPair :: String -> String -> String
+paramPair a b = a ++ " " ++ b