rekey: Added --batch mode.
Would have liked to make the Parser parse the file and key pairs, but it seems that optparse-applicative is unable to handle eg: many ((,) <$> argument <*> argument) This commit was sponsored by Thomas Hochstein on Patreon.
This commit is contained in:
		
					parent
					
						
							
								e65c31e56b
							
						
					
				
			
			
				commit
				
					
						82d01f5619
					
				
			
		
					 4 changed files with 37 additions and 7 deletions
				
			
		|  | @ -13,6 +13,7 @@ git-annex (6.20161119) UNRELEASED; urgency=medium | |||
|   * rmurl: Added --batch mode. | ||||
|   * fromkey: Accept multiple pairs of files and keys. | ||||
|     Thanks, Daniel Brooks. | ||||
|   * rekey: Added --batch mode. | ||||
| 
 | ||||
|  -- Joey Hess <id@joeyh.name>  Mon, 21 Nov 2016 11:27:50 -0400 | ||||
| 
 | ||||
|  |  | |||
|  | @ -25,15 +25,39 @@ cmd = notDirect $ | |||
| 	command "rekey" SectionPlumbing | ||||
| 		"change keys used for files" | ||||
| 		(paramRepeating $ paramPair paramPath paramKey) | ||||
| 		(withParams seek) | ||||
| 		(seek <$$> optParser) | ||||
| 
 | ||||
| seek :: CmdParams -> CommandSeek | ||||
| seek = withPairs start | ||||
| data ReKeyOptions = ReKeyOptions | ||||
| 	{ reKeyThese :: CmdParams | ||||
| 	, batchOption :: BatchMode | ||||
| 	} | ||||
| 
 | ||||
| start :: (FilePath, String) -> CommandStart | ||||
| start (file, keyname) = ifAnnexed file go stop | ||||
| optParser :: CmdParamsDesc -> Parser ReKeyOptions | ||||
| optParser desc = ReKeyOptions | ||||
| 	<$> cmdParams desc | ||||
| 	<*> parseBatchOption | ||||
| 
 | ||||
| -- Split on the last space, since a FilePath can contain whitespace, | ||||
| -- but a Key very rarely does. | ||||
| batchParser :: String -> Either String (FilePath, Key) | ||||
| batchParser s = case separate (== ' ') (reverse s) of | ||||
| 	(rk, rf) | ||||
| 		| null rk || null rf -> Left "Expected: \"file key\"" | ||||
| 		| otherwise -> case file2key (reverse rk) of | ||||
| 			Nothing -> Left "bad key" | ||||
| 			Just k -> Right (reverse rf, k) | ||||
| 
 | ||||
| seek :: ReKeyOptions -> CommandSeek | ||||
| seek o = case batchOption o of | ||||
| 	Batch -> batchInput batchParser (batchCommandAction . start) | ||||
| 	NoBatch -> withPairs (start . parsekey) (reKeyThese o) | ||||
|   where | ||||
| 	parsekey (file, skey) = | ||||
| 		(file, fromMaybe (giveup "bad key") (file2key skey)) | ||||
| 
 | ||||
| start :: (FilePath, Key) -> CommandStart | ||||
| start (file, newkey) = ifAnnexed file go stop | ||||
|   where | ||||
| 	newkey = fromMaybe (giveup "bad key") $ file2key keyname | ||||
| 	go oldkey | ||||
| 		| oldkey == newkey = stop | ||||
| 		| otherwise = do | ||||
|  |  | |||
|  | @ -10,7 +10,6 @@ module Command.RmUrl where | |||
| import Command | ||||
| import Logs.Web | ||||
| import qualified Remote | ||||
| import CmdLine.Batch | ||||
| 
 | ||||
| cmd :: Command | ||||
| cmd = notBareRepo $ | ||||
|  |  | |||
|  | @ -20,6 +20,12 @@ Multiple pairs of file and key can be given in a single command line. | |||
|   Allow rekeying of even files whose content is not currently available. | ||||
|   Use with caution. | ||||
| 
 | ||||
| * `--batch` | ||||
| 
 | ||||
|   Enables batch mode, in which lines are read from stdin. | ||||
|   Each line should contain the file, and the new key to use for that file, | ||||
|   separated by a single space. | ||||
| 
 | ||||
| # SEE ALSO | ||||
| 
 | ||||
| [[git-annex]](1) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Joey Hess
				Joey Hess