This commit is contained in:
Joey Hess 2015-07-08 17:59:06 -04:00
parent 6a88c7c101
commit 60806dd191
5 changed files with 137 additions and 82 deletions

View file

@ -1,4 +1,4 @@
{- git-annex options
{- git-annex command-line option parsing
-
- Copyright 2010-2015 Joey Hess <id@joeyh.name>
-
@ -8,6 +8,7 @@
module CmdLine.GitAnnex.Options where
import System.Console.GetOpt
import Options.Applicative
import Common.Annex
import qualified Git.Config
@ -15,6 +16,8 @@ import Git.Types
import Types.TrustLevel
import Types.NumCopies
import Types.Messages
import Types.Key
import Types.Command
import qualified Annex
import qualified Remote
import qualified Limit
@ -51,24 +54,50 @@ gitAnnexOptions = commonOptions ++
>>= pure . (\r -> r { gitGlobalOpts = gitGlobalOpts r ++ [Param "-c", Param v] })
>>= Annex.changeGitRepo
-- Options for matching on annexed keys, rather than work tree files.
keyOptions :: [Option]
keyOptions = [ allOption, unusedOption, keyOption]
-- Options for acting on keys, rather than work tree files.
data KeyOptions = KeyOptions
{ wantAllKeys :: Bool
, wantUnusedKeys :: Bool
, wantIncompleteKeys :: Bool
, wantSpecificKey :: Maybe Key
}
allOption :: Option
allOption = Option ['A'] ["all"] (NoArg (Annex.setFlag "all"))
"operate on all versions of all files"
parseKeyOptions :: Bool -> Parser KeyOptions
parseKeyOptions allowincomplete = KeyOptions
<$> parseAllKeysOption
<*> parseUnusedKeysOption
<*> (if allowincomplete then parseIncompleteOption else pure False)
<*> parseSpecificKeyOption
unusedOption :: Option
unusedOption = Option ['U'] ["unused"] (NoArg (Annex.setFlag "unused"))
"operate on files found by last run of git-annex unused"
parseAllKeysOption :: Parser Bool
parseAllKeysOption = switch
( long "all"
<> short 'A'
<> help "operate on all versions of all files"
)
keyOption :: Option
keyOption = Option [] ["key"] (ReqArg (Annex.setField "key") paramKey)
"operate on specified key"
parseUnusedKeysOption :: Parser Bool
parseUnusedKeysOption = switch
( long "unused"
<> short 'U'
<> help "operate on files found by last run of git-annex unused"
)
incompleteOption :: Option
incompleteOption = flagOption [] "incomplete" "resume previous downloads"
parseSpecificKeyOption :: Parser (Maybe Key)
parseSpecificKeyOption = finalOpt $ option (str >>= parseKey)
( long "key"
<> help "operate on specified key"
<> metavar paramKey
)
parseKey :: Monad m => String -> m Key
parseKey = maybe (fail "invalid key") return . file2key
parseIncompleteOption :: Parser Bool
parseIncompleteOption = switch
( long "incomplete"
<> help "resume previous downloads"
)
-- Options to match properties of annexed files.
annexedMatchingOptions :: [Option]
@ -161,3 +190,20 @@ timeLimitOption = Option ['T'] ["time-limit"]
autoOption :: Option
autoOption = flagOption ['a'] "auto" "automatic mode"
parseAutoOption :: Parser Bool
parseAutoOption = switch
( long "auto"
<> short 'a'
<> help "automatic mode"
)
{- Parser that accepts all non-option params. -}
cmdParams :: CmdParamsDesc -> Parser CmdParams
cmdParams paramdesc = many (argument str (metavar paramdesc))
{- Makes an option parser that is normally required be optional;
- - its switch can be given zero or more times, and the last one
- - given will be used. -}
finalOpt :: Parser a -> Parser (Maybe a)
finalOpt = lastMaybe <$$> many