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
Reference in a new issue