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:
Joey Hess 2016-12-05 12:55:50 -04:00
parent e65c31e56b
commit 82d01f5619
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
4 changed files with 37 additions and 7 deletions

View file

@ -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

View file

@ -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

View file

@ -10,7 +10,6 @@ module Command.RmUrl where
import Command
import Logs.Web
import qualified Remote
import CmdLine.Batch
cmd :: Command
cmd = notBareRepo $

View file

@ -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)