summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1
-rw-r--r--Command/ReKey.hs36
-rw-r--r--Command/RmUrl.hs1
-rw-r--r--doc/git-annex-rekey.mdwn6
4 files changed, 37 insertions, 7 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 215349f4b..c30447f4e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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
diff --git a/Command/ReKey.hs b/Command/ReKey.hs
index 33734ebe7..4ddbd68b6 100644
--- a/Command/ReKey.hs
+++ b/Command/ReKey.hs
@@ -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
diff --git a/Command/RmUrl.hs b/Command/RmUrl.hs
index 0f33d66b2..1a547a71e 100644
--- a/Command/RmUrl.hs
+++ b/Command/RmUrl.hs
@@ -10,7 +10,6 @@ module Command.RmUrl where
import Command
import Logs.Web
import qualified Remote
-import CmdLine.Batch
cmd :: Command
cmd = notBareRepo $
diff --git a/doc/git-annex-rekey.mdwn b/doc/git-annex-rekey.mdwn
index 4ec0b49e8..ce5e43d41 100644
--- a/doc/git-annex-rekey.mdwn
+++ b/doc/git-annex-rekey.mdwn
@@ -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)