aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-07-10 12:47:35 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-07-10 12:47:35 -0400
commit9886c302ef538e538ec7d48b94374b9d2400004f (patch)
tree4c6b55c2ab31a977f1fbd89f131aac9ae3722119
parentbc9b0307cf427ab8ca6532c2ae4e0086e7ad4a4a (diff)
implement withGlobalOptions, and convert Find
-rw-r--r--CmdLine.hs1
-rw-r--r--CmdLine/GitAnnex.hs4
-rw-r--r--CmdLine/GitAnnex/Options.hs8
-rw-r--r--Command.hs15
-rw-r--r--Command/ExamineKey.hs2
-rw-r--r--Command/Find.hs38
6 files changed, 44 insertions, 24 deletions
diff --git a/CmdLine.hs b/CmdLine.hs
index de1b3e7da..722881893 100644
--- a/CmdLine.hs
+++ b/CmdLine.hs
@@ -31,7 +31,6 @@ import Annex.Content
import Annex.Environment
import Command
import Types.Messages
-import CmdLine.GlobalSetter
{- Runs the passed command line. -}
dispatch :: Bool -> CmdParams -> [Command] -> [Parser GlobalSetter] -> [(String, String)] -> IO Git.Repo -> String -> String -> IO ()
diff --git a/CmdLine/GitAnnex.hs b/CmdLine/GitAnnex.hs
index 32a4b8b10..d2411ffb4 100644
--- a/CmdLine/GitAnnex.hs
+++ b/CmdLine/GitAnnex.hs
@@ -56,7 +56,7 @@ import qualified Command.AddUnused
import qualified Command.Unlock
import qualified Command.Lock
import qualified Command.PreCommit
---import qualified Command.Find
+import qualified Command.Find
--import qualified Command.FindRef
--import qualified Command.Whereis
--import qualified Command.List
@@ -183,7 +183,7 @@ cmds =
-- , Command.Unused.cmd
-- , Command.DropUnused.cmd
, Command.AddUnused.cmd
--- , Command.Find.cmd
+ , Command.Find.cmd
-- , Command.FindRef.cmd
-- , Command.Whereis.cmd
-- , Command.List.cmd
diff --git a/CmdLine/GitAnnex/Options.hs b/CmdLine/GitAnnex/Options.hs
index 6965e8e51..9f033aa4d 100644
--- a/CmdLine/GitAnnex/Options.hs
+++ b/CmdLine/GitAnnex/Options.hs
@@ -200,8 +200,8 @@ fileMatchingOptions' =
"match files smaller than a size"
]
-parseCombiningOptions :: Parser [GlobalSetter]
-parseCombiningOptions =
+combiningOptions :: Parser [GlobalSetter]
+combiningOptions =
many $ longopt "not" "negate next option"
<|> longopt "and" "both previous and next option must match"
<|> longopt "or" "either previous or next option must match"
@@ -211,8 +211,8 @@ parseCombiningOptions =
longopt o h = globalFlag (Limit.addToken o) ( long o <> help h )
shortopt o h = globalFlag (Limit.addToken [o]) ( short o <> help h)
-parseJsonOption :: Parser GlobalSetter
-parseJsonOption = globalFlag (Annex.setOutput JSONOutput)
+jsonOption :: Parser GlobalSetter
+jsonOption = globalFlag (Annex.setOutput JSONOutput)
( long "json" <> short 'j'
<> help "enable JSON output"
)
diff --git a/Command.hs b/Command.hs
index 019a657aa..102173f88 100644
--- a/Command.hs
+++ b/Command.hs
@@ -13,6 +13,7 @@ module Command (
noCommit,
noMessages,
withOptions,
+ withGlobalOptions,
next,
stop,
stopUnless,
@@ -33,6 +34,7 @@ import Checks as ReExported
import CmdLine.Usage as ReExported
import CmdLine.Action as ReExported
import CmdLine.Option as ReExported
+import CmdLine.GlobalSetter as ReExported
import CmdLine.GitAnnex.Options as ReExported
import Options.Applicative as ReExported hiding (command)
@@ -78,6 +80,19 @@ noRepo a c = c { cmdnorepo = Just (a (cmdparamdesc c)) }
withOptions :: [Option] -> Command -> Command
withOptions o c = c { cmdoptions = cmdoptions c ++ o }
+{- Adds global options to a command's option parser, and modifies its seek
+ - option to first run actions for them.
+ -}
+withGlobalOptions :: [Parser GlobalSetter] -> Command -> Command
+withGlobalOptions os c = c { cmdparser = apply <$> mixin (cmdparser c) }
+ where
+ mixin p = (,)
+ <$> p
+ <*> combineGlobalSetters os
+ apply (seek, globalsetters) = do
+ void $ getParsed globalsetters
+ seek
+
{- For start and perform stages to indicate what step to run next. -}
next :: a -> Annex (Maybe a)
next a = return $ Just a
diff --git a/Command/ExamineKey.hs b/Command/ExamineKey.hs
index 65f4978a6..e0a1d9747 100644
--- a/Command/ExamineKey.hs
+++ b/Command/ExamineKey.hs
@@ -11,7 +11,7 @@ import Common.Annex
import Command
import CmdLine.Batch
import qualified Utility.Format
-import Command.Find (formatOption, getFormat, showFormatted, keyVars)
+import Command.Find (FindOptions(..), showFormatted, keyVars)
import Types.Key
cmd :: Command
diff --git a/Command/Find.hs b/Command/Find.hs
index 5a0a08973..eb681d219 100644
--- a/Command/Find.hs
+++ b/Command/Find.hs
@@ -14,7 +14,6 @@ import Common.Annex
import Command
import Annex.Content
import Limit
-import qualified Annex
import qualified Utility.Format
import Utility.DataUnits
import Types.Key
@@ -22,27 +21,34 @@ import Types.Key
cmd :: Command
cmd = withOptions annexedMatchingOptions $ mkCommand $
command "find" SectionQuery "lists available files"
- paramPaths (withParams seek)
+ paramPaths (seek <$$> optParser)
mkCommand :: Command -> Command
-mkCommand = noCommit . noMessages . withOptions [formatOption, print0Option, jsonOption]
+mkCommand = noCommit . noMessages . withGlobalOptions [jsonOption]
-formatOption :: Option
-formatOption = fieldOption [] "format" paramFormat "control format of output"
+data FindOptions = FindOptions
+ { findThese :: CmdParams
+ , formatOption :: Maybe Utility.Format.Format
+ }
-getFormat :: Annex (Maybe Utility.Format.Format)
-getFormat = getOptionField formatOption $ return . fmap Utility.Format.gen
+optParser :: CmdParamsDesc -> Parser FindOptions
+optParser desc = FindOptions
+ <$> cmdParams desc
+ <*> optional parseFormatOption
-print0Option :: Option
-print0Option = Option [] ["print0"] (NoArg set)
- "terminate output with null"
- where
- set = Annex.setField (optionName formatOption) "${file}\0"
+parseFormatOption :: Parser Utility.Format.Format
+parseFormatOption =
+ option (Utility.Format.gen <$> str)
+ ( long "format" <> metavar paramFormat
+ <> help "control format of output"
+ )
+ <|> flag' (Utility.Format.gen "${file}\0")
+ ( long "print0"
+ <> help "output filenames terminated with nulls"
+ )
-seek :: CmdParams -> CommandSeek
-seek ps = do
- format <- getFormat
- withFilesInGit (whenAnnexed $ start format) ps
+seek :: FindOptions -> CommandSeek
+seek o = withFilesInGit (whenAnnexed $ start (formatOption o)) (findThese o)
start :: Maybe Utility.Format.Format -> FilePath -> Key -> CommandStart
start format file key = do