diff options
author | Joey Hess <joey@kitenet.net> | 2012-02-16 16:36:35 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-02-16 16:36:35 -0400 |
commit | db6b4cdfcf67cfc3fce5e5f4323aa96a6ebd3e59 (patch) | |
tree | a65a129d7289b400e1b558e7b6d3c19eefd54f76 /Command/ReKey.hs | |
parent | aeaaa0ff87e22c3a5b4c9657544224c9db006cde (diff) |
rekey: New plumbing level command, can be used to change the keys used for files en masse.
Diffstat (limited to 'Command/ReKey.hs')
-rw-r--r-- | Command/ReKey.hs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/Command/ReKey.hs b/Command/ReKey.hs new file mode 100644 index 000000000..9c3625aef --- /dev/null +++ b/Command/ReKey.hs @@ -0,0 +1,46 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ReKey where + +import Common.Annex +import Command +import qualified Annex +import Types.Key +import Annex.Content +import qualified Command.Migrate + +def :: [Command] +def = [command "rekey" + (paramOptional $ paramRepeating $ paramPair paramPath paramKey) + seek "change keys used for files"] + +seek :: [CommandSeek] +seek = [withPairs start] + +start :: (FilePath, String) -> CommandStart +start (file, keyname) = ifAnnexed file go stop + where + newkey = fromMaybe (error "bad key") $ readKey keyname + go (oldkey, _) + | oldkey == newkey = stop + | otherwise = do + showStart "rekey" file + next $ perform file oldkey newkey + +perform :: FilePath -> Key -> Key -> CommandPerform +perform file oldkey newkey = do + present <- inAnnex oldkey + _ <- if present + then do + src <- inRepo $ gitAnnexLocation oldkey + Command.Migrate.linkKey src newkey + else do + unlessM (Annex.getState Annex.force) $ + error $ file ++ " is not available (use --force to override)" + return True + next $ Command.Migrate.cleanup file oldkey newkey |