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 | |
parent | aeaaa0ff87e22c3a5b4c9657544224c9db006cde (diff) |
rekey: New plumbing level command, can be used to change the keys used for files en masse.
-rw-r--r-- | Command/Migrate.hs | 39 | ||||
-rw-r--r-- | Command/ReKey.hs | 46 | ||||
-rw-r--r-- | GitAnnex.hs | 2 | ||||
-rw-r--r-- | Seek.hs | 7 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | doc/git-annex.mdwn | 8 |
6 files changed, 87 insertions, 17 deletions
diff --git a/Command/Migrate.hs b/Command/Migrate.hs index c6b0f086c..795ecc265 100644 --- a/Command/Migrate.hs +++ b/Command/Migrate.hs @@ -58,22 +58,27 @@ perform file oldkey newbackend = do cleantmp tmpfile case k of Nothing -> stop - Just (newkey, _) -> stopUnless (link src newkey) $ do - -- Update symlink to use the new key. - liftIO $ removeFile file - - -- If the old key had some - -- associated urls, record them for - -- the new key as well. - urls <- getUrls oldkey - unless (null urls) $ - mapM_ (setUrlPresent newkey) urls - - next $ Command.Add.cleanup file newkey True + Just (newkey, _) -> stopUnless (linkKey src newkey) $ + next $ cleanup file oldkey newkey where cleantmp t = liftIO $ whenM (doesFileExist t) $ removeFile t - link src newkey = getViaTmpUnchecked newkey $ \t -> do - -- Make a hard link to the old backend's - -- cached key, to avoid wasting disk space. - liftIO $ unlessM (doesFileExist t) $ createLink src t - return True + +linkKey :: FilePath -> Key -> Annex Bool +linkKey src newkey = getViaTmpUnchecked newkey $ \t -> do + -- Make a hard link to the old backend's + -- cached key, to avoid wasting disk space. + liftIO $ unlessM (doesFileExist t) $ createLink src t + return True + +cleanup :: FilePath -> Key -> Key -> CommandCleanup +cleanup file oldkey newkey = do + -- Update symlink to use the new key. + liftIO $ removeFile file + + -- If the old key had some associated urls, record them for + -- the new key as well. + urls <- getUrls oldkey + unless (null urls) $ + mapM_ (setUrlPresent newkey) urls + + Command.Add.cleanup file newkey True 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 diff --git a/GitAnnex.hs b/GitAnnex.hs index 4af10a9ce..4a0888b53 100644 --- a/GitAnnex.hs +++ b/GitAnnex.hs @@ -28,6 +28,7 @@ import qualified Command.Copy import qualified Command.Get import qualified Command.FromKey import qualified Command.DropKey +import qualified Command.ReKey import qualified Command.Reinject import qualified Command.Fix import qualified Command.Init @@ -80,6 +81,7 @@ cmds = concat , Command.Dead.def , Command.FromKey.def , Command.DropKey.def + , Command.ReKey.def , Command.Fix.def , Command.Fsck.def , Command.Unused.def @@ -45,6 +45,13 @@ withWords a params = return [a params] withStrings :: (String -> CommandStart) -> CommandSeek withStrings a params = return $ map a params +withPairs :: ((String, String) -> CommandStart) -> CommandSeek +withPairs a params = return $ map a $ pairs [] params + where + pairs c [] = reverse c + pairs c (x:y:xs) = pairs ((x,y):c) xs + pairs _ _ = error "expected pairs" + withFilesToBeCommitted :: (String -> CommandStart) -> CommandSeek withFilesToBeCommitted a params = prepFiltered a $ seekHelper LsFiles.stagedNotDeleted params diff --git a/debian/changelog b/debian/changelog index 24f40fddc..3315f8513 100644 --- a/debian/changelog +++ b/debian/changelog @@ -30,6 +30,8 @@ git-annex (3.20120124) UNRELEASED; urgency=low location of the file. * addurl: Normalize badly encoded urls. * addurl: Add --pathdepth option. + * rekey: New plumbing level command, can be used to change the keys used + for files en masse. -- Joey Hess <joeyh@debian.org> Tue, 24 Jan 2012 16:21:55 -0400 diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index f13baf79c..992e31c85 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -399,6 +399,14 @@ subdirectories). git annex dropkey SHA1-s10-7da006579dd64330eb2456001fd01948430572f2 +* rekey [file key ...] + + This plumbing-level command is similar to migrate, but you specify + both the file, and the new key to use for it. + + With --force, even files whose content is not currently available will + be rekeyed. Use with caution. + # OPTIONS * --force |