diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-07-10 12:47:35 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-07-10 12:47:35 -0400 |
commit | 9886c302ef538e538ec7d48b94374b9d2400004f (patch) | |
tree | 4c6b55c2ab31a977f1fbd89f131aac9ae3722119 | |
parent | bc9b0307cf427ab8ca6532c2ae4e0086e7ad4a4a (diff) |
implement withGlobalOptions, and convert Find
-rw-r--r-- | CmdLine.hs | 1 | ||||
-rw-r--r-- | CmdLine/GitAnnex.hs | 4 | ||||
-rw-r--r-- | CmdLine/GitAnnex/Options.hs | 8 | ||||
-rw-r--r-- | Command.hs | 15 | ||||
-rw-r--r-- | Command/ExamineKey.hs | 2 | ||||
-rw-r--r-- | Command/Find.hs | 38 |
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 |