use Alternative for parsing KeyOptions

This commit is contained in:
Joey Hess 2015-07-09 12:44:03 -04:00
parent 94e703e8b8
commit 032e6485fa
3 changed files with 38 additions and 51 deletions

View file

@ -55,47 +55,38 @@ gitAnnexOptions = commonOptions ++
>>= Annex.changeGitRepo >>= Annex.changeGitRepo
-- Options for acting on keys, rather than work tree files. -- Options for acting on keys, rather than work tree files.
data KeyOptions = KeyOptions data KeyOptions
{ wantAllKeys :: Bool = WantAllKeys
, wantUnusedKeys :: Bool | WantUnusedKeys
, wantIncompleteKeys :: Bool | WantSpecificKey Key
, wantSpecificKey :: Maybe Key | WantIncompleteKeys
}
parseKeyOptions :: Bool -> Parser KeyOptions parseKeyOptions :: Bool -> Parser KeyOptions
parseKeyOptions allowincomplete = KeyOptions parseKeyOptions allowincomplete = if allowincomplete
<$> parseAllKeysOption then base
<*> parseUnusedKeysOption <|> flag' WantIncompleteKeys
<*> (if allowincomplete then parseIncompleteOption else pure False) ( long "incomplete"
<*> parseSpecificKeyOption <> help "resume previous downloads"
)
parseAllKeysOption :: Parser Bool else base
parseAllKeysOption = switch where
( long "all" <> short 'A' base =
<> help "operate on all versions of all files" flag' WantAllKeys
) ( long "all" <> short 'A'
<> help "operate on all versions of all files"
parseUnusedKeysOption :: Parser Bool )
parseUnusedKeysOption = switch <|> flag' WantUnusedKeys
( long "unused" <> short 'U' ( long "unused" <> short 'U'
<> help "operate on files found by last run of git-annex unused" <> help "operate on files found by last run of git-annex unused"
) )
<|> (WantSpecificKey <$> option (str >>= parseKey)
parseSpecificKeyOption :: Parser (Maybe Key) ( long "key" <> metavar paramKey
parseSpecificKeyOption = optional $ option (str >>= parseKey) <> help "operate on specified key"
( long "key" <> metavar paramKey ))
<> help "operate on specified key"
)
parseKey :: Monad m => String -> m Key parseKey :: Monad m => String -> m Key
parseKey = maybe (fail "invalid key") return . file2key 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. -- Options to match properties of annexed files.
annexedMatchingOptions :: [Option] annexedMatchingOptions :: [Option]
annexedMatchingOptions = concat annexedMatchingOptions = concat

View file

@ -172,7 +172,7 @@ withNothing _ _ = error "This command takes no parameters."
- -
- Otherwise falls back to a regular CommandSeek action on - Otherwise falls back to a regular CommandSeek action on
- whatever params were passed. -} - whatever params were passed. -}
withKeyOptions :: KeyOptions -> Bool -> (Key -> CommandStart) -> (CmdParams -> CommandSeek) -> CmdParams -> CommandSeek withKeyOptions :: Maybe KeyOptions -> Bool -> (Key -> CommandStart) -> (CmdParams -> CommandSeek) -> CmdParams -> CommandSeek
withKeyOptions ko auto keyaction = withKeyOptions' ko auto $ \getkeys -> do withKeyOptions ko auto keyaction = withKeyOptions' ko auto $ \getkeys -> do
matcher <- Limit.getMatcher matcher <- Limit.getMatcher
seekActions $ map (process matcher) <$> getkeys seekActions $ map (process matcher) <$> getkeys
@ -182,25 +182,21 @@ withKeyOptions ko auto keyaction = withKeyOptions' ko auto $ \getkeys -> do
, return Nothing , return Nothing
) )
withKeyOptions' :: KeyOptions -> Bool -> (Annex [Key] -> Annex ()) -> (CmdParams -> CommandSeek) -> CmdParams -> CommandSeek withKeyOptions' :: Maybe KeyOptions -> Bool -> (Annex [Key] -> Annex ()) -> (CmdParams -> CommandSeek) -> CmdParams -> CommandSeek
withKeyOptions' ko auto keyaction fallbackaction params = do withKeyOptions' ko auto keyaction fallbackaction params = do
bare <- fromRepo Git.repoIsLocalBare bare <- fromRepo Git.repoIsLocalBare
let allkeys = wantAllKeys ko
let unused = wantUnusedKeys ko
let incomplete = wantIncompleteKeys ko
let specifickey = wantSpecificKey ko
when (auto && bare) $ when (auto && bare) $
error "Cannot use --auto in a bare repository" error "Cannot use --auto in a bare repository"
case (allkeys, unused, incomplete, null params, specifickey) of case (null params, ko) of
(False , False , False , True , Nothing) (True, Nothing)
| bare -> go auto loggedKeys | bare -> go auto loggedKeys
| otherwise -> fallbackaction params | otherwise -> fallbackaction params
(False , False , False , _ , Nothing) -> fallbackaction params (False, Nothing) -> fallbackaction params
(True , False , False , True , Nothing) -> go auto loggedKeys (True, Just WantAllKeys) -> go auto loggedKeys
(False , True , False , True , Nothing) -> go auto unusedKeys' (True, Just WantUnusedKeys) -> go auto unusedKeys'
(False , False , True , True , Nothing) -> go auto incompletekeys (True, Just (WantSpecificKey k)) -> go auto $ return [k]
(False , False , False , True , Just k) -> go auto $ return [k] (True, Just WantIncompleteKeys) -> go auto incompletekeys
_ -> error "Can only specify one of file names, --all, --unused, --key, or --incomplete" (False, Just _) -> error "Can only specify one of file names, --all, --unused, --key, or --incomplete"
where where
go True _ = error "Cannot use --auto with --all or --unused or --key or --incomplete" go True _ = error "Cannot use --auto with --all or --unused or --key or --incomplete"
go False getkeys = keyaction getkeys go False getkeys = keyaction getkeys

View file

@ -51,7 +51,7 @@ data FsckOptions = FsckOptions
{ fsckFiles :: CmdParams { fsckFiles :: CmdParams
, fsckFromOption :: Maybe RemoteName , fsckFromOption :: Maybe RemoteName
, incrementalOpt :: Maybe IncrementalOpt , incrementalOpt :: Maybe IncrementalOpt
, keyOptions :: KeyOptions , keyOptions :: Maybe KeyOptions
} }
data IncrementalOpt data IncrementalOpt
@ -67,7 +67,7 @@ optParser desc = FsckOptions
<> help "check remote" <> help "check remote"
)) ))
<*> optional parseincremental <*> optional parseincremental
<*> parseKeyOptions False <*> optional (parseKeyOptions False)
where where
parseincremental = parseincremental =
flag' StartIncrementalO flag' StartIncrementalO