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. * rmurl: Added --batch mode.
* fromkey: Accept multiple pairs of files and keys. * fromkey: Accept multiple pairs of files and keys.
Thanks, Daniel Brooks. Thanks, Daniel Brooks.
* rekey: Added --batch mode.
-- Joey Hess <id@joeyh.name> Mon, 21 Nov 2016 11:27:50 -0400 -- Joey Hess <id@joeyh.name> Mon, 21 Nov 2016 11:27:50 -0400

View file

@ -25,15 +25,39 @@ cmd = notDirect $
command "rekey" SectionPlumbing command "rekey" SectionPlumbing
"change keys used for files" "change keys used for files"
(paramRepeating $ paramPair paramPath paramKey) (paramRepeating $ paramPair paramPath paramKey)
(withParams seek) (seek <$$> optParser)
seek :: CmdParams -> CommandSeek data ReKeyOptions = ReKeyOptions
seek = withPairs start { reKeyThese :: CmdParams
, batchOption :: BatchMode
}
start :: (FilePath, String) -> CommandStart optParser :: CmdParamsDesc -> Parser ReKeyOptions
start (file, keyname) = ifAnnexed file go stop 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 where
newkey = fromMaybe (giveup "bad key") $ file2key keyname
go oldkey go oldkey
| oldkey == newkey = stop | oldkey == newkey = stop
| otherwise = do | otherwise = do

View file

@ -10,7 +10,6 @@ module Command.RmUrl where
import Command import Command
import Logs.Web import Logs.Web
import qualified Remote import qualified Remote
import CmdLine.Batch
cmd :: Command cmd :: Command
cmd = notBareRepo $ 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. Allow rekeying of even files whose content is not currently available.
Use with caution. 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 # SEE ALSO
[[git-annex]](1) [[git-annex]](1)