rekey: New plumbing level command, can be used to change the keys used for files en masse.
This commit is contained in:
parent
aeaaa0ff87
commit
db6b4cdfcf
6 changed files with 87 additions and 17 deletions
|
@ -58,22 +58,27 @@ perform file oldkey newbackend = do
|
||||||
cleantmp tmpfile
|
cleantmp tmpfile
|
||||||
case k of
|
case k of
|
||||||
Nothing -> stop
|
Nothing -> stop
|
||||||
Just (newkey, _) -> stopUnless (link src newkey) $ do
|
Just (newkey, _) -> stopUnless (linkKey src newkey) $
|
||||||
-- Update symlink to use the new key.
|
next $ cleanup file oldkey newkey
|
||||||
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
|
|
||||||
where
|
where
|
||||||
cleantmp t = liftIO $ whenM (doesFileExist t) $ removeFile t
|
cleantmp t = liftIO $ whenM (doesFileExist t) $ removeFile t
|
||||||
link src newkey = getViaTmpUnchecked newkey $ \t -> do
|
|
||||||
-- Make a hard link to the old backend's
|
linkKey :: FilePath -> Key -> Annex Bool
|
||||||
-- cached key, to avoid wasting disk space.
|
linkKey src newkey = getViaTmpUnchecked newkey $ \t -> do
|
||||||
liftIO $ unlessM (doesFileExist t) $ createLink src t
|
-- Make a hard link to the old backend's
|
||||||
return True
|
-- 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
|
||||||
|
|
46
Command/ReKey.hs
Normal file
46
Command/ReKey.hs
Normal file
|
@ -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
|
|
@ -28,6 +28,7 @@ import qualified Command.Copy
|
||||||
import qualified Command.Get
|
import qualified Command.Get
|
||||||
import qualified Command.FromKey
|
import qualified Command.FromKey
|
||||||
import qualified Command.DropKey
|
import qualified Command.DropKey
|
||||||
|
import qualified Command.ReKey
|
||||||
import qualified Command.Reinject
|
import qualified Command.Reinject
|
||||||
import qualified Command.Fix
|
import qualified Command.Fix
|
||||||
import qualified Command.Init
|
import qualified Command.Init
|
||||||
|
@ -80,6 +81,7 @@ cmds = concat
|
||||||
, Command.Dead.def
|
, Command.Dead.def
|
||||||
, Command.FromKey.def
|
, Command.FromKey.def
|
||||||
, Command.DropKey.def
|
, Command.DropKey.def
|
||||||
|
, Command.ReKey.def
|
||||||
, Command.Fix.def
|
, Command.Fix.def
|
||||||
, Command.Fsck.def
|
, Command.Fsck.def
|
||||||
, Command.Unused.def
|
, Command.Unused.def
|
||||||
|
|
7
Seek.hs
7
Seek.hs
|
@ -45,6 +45,13 @@ withWords a params = return [a params]
|
||||||
withStrings :: (String -> CommandStart) -> CommandSeek
|
withStrings :: (String -> CommandStart) -> CommandSeek
|
||||||
withStrings a params = return $ map a params
|
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 :: (String -> CommandStart) -> CommandSeek
|
||||||
withFilesToBeCommitted a params = prepFiltered a $
|
withFilesToBeCommitted a params = prepFiltered a $
|
||||||
seekHelper LsFiles.stagedNotDeleted params
|
seekHelper LsFiles.stagedNotDeleted params
|
||||||
|
|
2
debian/changelog
vendored
2
debian/changelog
vendored
|
@ -30,6 +30,8 @@ git-annex (3.20120124) UNRELEASED; urgency=low
|
||||||
location of the file.
|
location of the file.
|
||||||
* addurl: Normalize badly encoded urls.
|
* addurl: Normalize badly encoded urls.
|
||||||
* addurl: Add --pathdepth option.
|
* 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
|
-- Joey Hess <joeyh@debian.org> Tue, 24 Jan 2012 16:21:55 -0400
|
||||||
|
|
||||||
|
|
|
@ -399,6 +399,14 @@ subdirectories).
|
||||||
|
|
||||||
git annex dropkey SHA1-s10-7da006579dd64330eb2456001fd01948430572f2
|
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
|
# OPTIONS
|
||||||
|
|
||||||
* --force
|
* --force
|
||||||
|
|
Loading…
Reference in a new issue