use Alternative for parsing KeyOptions
This commit is contained in:
		
					parent
					
						
							
								94e703e8b8
							
						
					
				
			
			
				commit
				
					
						032e6485fa
					
				
			
		
					 3 changed files with 38 additions and 51 deletions
				
			
		|  | @ -55,46 +55,37 @@ gitAnnexOptions = commonOptions ++ | |||
| 		>>= Annex.changeGitRepo | ||||
| 
 | ||||
| -- Options for acting on keys, rather than work tree files. | ||||
| data KeyOptions = KeyOptions | ||||
| 	{ wantAllKeys :: Bool | ||||
| 	, wantUnusedKeys :: Bool | ||||
| 	, wantIncompleteKeys :: Bool | ||||
| 	, wantSpecificKey :: Maybe Key | ||||
| 	} | ||||
| data KeyOptions | ||||
| 	= WantAllKeys | ||||
| 	| WantUnusedKeys | ||||
| 	| WantSpecificKey Key | ||||
| 	| WantIncompleteKeys | ||||
| 
 | ||||
| parseKeyOptions :: Bool -> Parser KeyOptions | ||||
| parseKeyOptions allowincomplete = KeyOptions | ||||
| 	<$> parseAllKeysOption | ||||
| 	<*> parseUnusedKeysOption | ||||
| 	<*> (if allowincomplete then parseIncompleteOption else pure False) | ||||
| 	<*> parseSpecificKeyOption | ||||
| 
 | ||||
| parseAllKeysOption :: Parser Bool | ||||
| parseAllKeysOption = switch | ||||
| 	( long "all" <> short 'A' | ||||
| 	<> help "operate on all versions of all files" | ||||
| 	) | ||||
| 
 | ||||
| parseUnusedKeysOption :: Parser Bool | ||||
| parseUnusedKeysOption = switch | ||||
| 	( long "unused" <> short 'U' | ||||
| 	<> help "operate on files found by last run of git-annex unused" | ||||
| 	) | ||||
| 
 | ||||
| parseSpecificKeyOption :: Parser (Maybe Key) | ||||
| parseSpecificKeyOption = optional $ option (str >>= parseKey) | ||||
| 	( long "key" <> metavar paramKey | ||||
| 	<> help "operate on specified key" | ||||
| 	) | ||||
| 
 | ||||
| parseKey :: Monad m => String -> m Key | ||||
| parseKey = maybe (fail "invalid key") return . file2key | ||||
| 
 | ||||
| parseIncompleteOption :: Parser Bool | ||||
| parseIncompleteOption = switch | ||||
| parseKeyOptions allowincomplete = if allowincomplete | ||||
| 	then base | ||||
| 		<|> flag' WantIncompleteKeys | ||||
| 			( long "incomplete" | ||||
| 			<> help "resume previous downloads" | ||||
| 			) | ||||
| 	else base | ||||
|   where | ||||
| 	base = | ||||
| 		flag' WantAllKeys | ||||
| 			( long "all" <> short 'A' | ||||
| 			<> help "operate on all versions of all files" | ||||
| 			) | ||||
| 		<|> flag' WantUnusedKeys | ||||
| 			( long "unused" <> short 'U' | ||||
| 			<> help "operate on files found by last run of git-annex unused" | ||||
| 			) | ||||
| 		<|> (WantSpecificKey <$> option (str >>= parseKey) | ||||
| 			( long "key" <> metavar paramKey | ||||
| 			<> help "operate on specified key" | ||||
| 			)) | ||||
| 
 | ||||
| parseKey :: Monad m => String -> m Key | ||||
| parseKey = maybe (fail "invalid key") return . file2key | ||||
| 
 | ||||
| -- Options to match properties of annexed files. | ||||
| annexedMatchingOptions :: [Option] | ||||
|  |  | |||
|  | @ -172,7 +172,7 @@ withNothing _ _ = error "This command takes no parameters." | |||
|  - | ||||
|  - Otherwise falls back to a regular CommandSeek action on | ||||
|  - 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 | ||||
| 	matcher <- Limit.getMatcher | ||||
| 	seekActions $ map (process matcher) <$> getkeys | ||||
|  | @ -182,25 +182,21 @@ withKeyOptions ko auto keyaction = withKeyOptions' ko auto $ \getkeys -> do | |||
| 		, 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 | ||||
| 	bare <- fromRepo Git.repoIsLocalBare | ||||
| 	let allkeys = wantAllKeys ko | ||||
| 	let unused = wantUnusedKeys ko | ||||
| 	let incomplete = wantIncompleteKeys ko | ||||
| 	let specifickey = wantSpecificKey ko | ||||
| 	when (auto && bare) $ | ||||
| 		error "Cannot use --auto in a bare repository" | ||||
| 	case	(allkeys, unused, incomplete, null params, specifickey) of | ||||
| 		(False  , False , False     , True       , Nothing) | ||||
| 	case (null params, ko) of | ||||
| 		(True, Nothing) | ||||
| 			| bare -> go auto loggedKeys | ||||
| 			| otherwise -> fallbackaction params | ||||
| 		(False  , False , False     , _          , Nothing) -> fallbackaction params | ||||
| 		(True   , False , False     , True       , Nothing) -> go auto loggedKeys | ||||
| 		(False  , True  , False     , True       , Nothing) -> go auto unusedKeys' | ||||
| 		(False  , False , True      , True       , Nothing) -> go auto incompletekeys | ||||
| 		(False  , False , False     , True       , Just k) -> go auto $ return [k] | ||||
| 		_ -> error "Can only specify one of file names, --all, --unused, --key, or --incomplete" | ||||
| 		(False, Nothing) -> fallbackaction params | ||||
| 		(True, Just WantAllKeys) -> go auto loggedKeys | ||||
| 		(True, Just WantUnusedKeys) -> go auto unusedKeys' | ||||
| 		(True, Just (WantSpecificKey k)) -> go auto $ return [k] | ||||
| 		(True, Just WantIncompleteKeys) -> go auto incompletekeys | ||||
| 		(False, Just _) -> error "Can only specify one of file names, --all, --unused, --key, or --incomplete" | ||||
|   where | ||||
| 	go True _ = error "Cannot use --auto with --all or --unused or --key or --incomplete" | ||||
| 	go False getkeys = keyaction getkeys | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ data FsckOptions = FsckOptions | |||
| 	{ fsckFiles :: CmdParams | ||||
| 	, fsckFromOption :: Maybe RemoteName | ||||
| 	, incrementalOpt :: Maybe IncrementalOpt | ||||
| 	, keyOptions :: KeyOptions | ||||
| 	, keyOptions :: Maybe KeyOptions | ||||
| 	} | ||||
| 
 | ||||
| data IncrementalOpt | ||||
|  | @ -67,7 +67,7 @@ optParser desc = FsckOptions | |||
| 		<> help "check remote" | ||||
| 		)) | ||||
| 	<*> optional parseincremental | ||||
| 	<*> parseKeyOptions False | ||||
| 	<*> optional (parseKeyOptions False) | ||||
|   where | ||||
| 	parseincremental = | ||||
| 		flag' StartIncrementalO | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Joey Hess
				Joey Hess