Removed the setkey command, and added a setcontent command with a more useful interface.

This commit is contained in:
Joey Hess 2011-10-31 12:33:41 -04:00
parent e09dd6f306
commit cc1ea8f844
6 changed files with 80 additions and 65 deletions

View file

@ -38,7 +38,7 @@ perform key file backend numcopies = check
[ verifyLocationLog key file [ verifyLocationLog key file
, checkKeySize key , checkKeySize key
, checkKeyNumCopies key file numcopies , checkKeyNumCopies key file numcopies
, (Types.Backend.fsckKey backend) key , checkBackend backend key
] ]
{- To fsck a bare repository, fsck each key in the location log. -} {- To fsck a bare repository, fsck each key in the location log. -}
@ -65,7 +65,7 @@ performBare :: Key -> Backend Annex -> CommandPerform
performBare key backend = check performBare key backend = check
[ verifyLocationLog key (show key) [ verifyLocationLog key (show key)
, checkKeySize key , checkKeySize key
, (Types.Backend.fsckKey backend) key , checkBackend backend key
] ]
check :: [Annex Bool] -> CommandPerform check :: [Annex Bool] -> CommandPerform
@ -134,6 +134,9 @@ checkKeySize key = do
return False return False
checkBackend :: Backend Annex -> Key -> Annex Bool
checkBackend backend key = (Types.Backend.fsckKey backend) key
checkKeyNumCopies :: Key -> FilePath -> Maybe Int -> Annex Bool checkKeyNumCopies :: Key -> FilePath -> Maybe Int -> Annex Bool
checkKeyNumCopies key file numcopies = do checkKeyNumCopies key file numcopies = do
needed <- getNumCopies numcopies needed <- getNumCopies numcopies

56
Command/SetContent.hs Normal file
View file

@ -0,0 +1,56 @@
{- git-annex command
-
- Copyright 2011 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Command.SetContent where
import Common.Annex
import Command
import Logs.Location
import Annex.Content
import qualified Backend
import qualified Command.Fsck
def :: [Command]
def = [command "setcontent" (paramPair paramPath paramPath) seek
"sets content of annexed file"]
seek :: [CommandSeek]
seek = [withWords start]
start :: [FilePath] -> CommandStart
start (src:dest:[]) = do
showStart "setkey" dest
next $ perform src dest
start _ = error "specify a src file and a dest file"
perform :: FilePath -> FilePath -> CommandPerform
perform src dest = go =<< Backend.lookupFile dest
where
go Nothing = error "dest file is not in annex"
go (Just (key, backend)) = do
-- the file might be on a different filesystem,
-- so mv is used rather than simply calling
-- moveToObjectDir; disk space is also
-- checked this way.
ok <- getViaTmp key $ \tmp ->
if dest /= src
then liftIO $
boolSystem "mv" [File src, File tmp]
else return True
if ok
then next $ cleanup key backend
else error "mv failed!"
cleanup :: Key -> Backend Annex -> CommandCleanup
cleanup key backend = do
logStatus key InfoPresent
-- fsck the new content
size_ok <- Command.Fsck.checkKeySize key
backend_ok <- Command.Fsck.checkBackend backend key
return $ size_ok && backend_ok

View file

@ -1,48 +0,0 @@
{- git-annex command
-
- Copyright 2010 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Command.SetKey where
import Common.Annex
import Command
import Logs.Location
import Annex.Content
import Config
def :: [Command]
def = [command "setkey" paramPath seek
"sets annexed content for a key using a temp file"]
seek :: [CommandSeek]
seek = [withStrings start]
{- Sets cached content for a key. -}
start :: FilePath -> CommandStart
start file = do
showStart "setkey" file
next $ perform file
perform :: FilePath -> CommandPerform
perform file = do
key <- cmdlineKey
-- the file might be on a different filesystem, so mv is used
-- rather than simply calling moveToObjectDir; disk space is also
-- checked this way.
ok <- getViaTmp key $ \dest ->
if dest /= file
then liftIO $
boolSystem "mv" [File file, File dest]
else return True
if ok
then next cleanup
else error "mv failed!"
cleanup :: CommandCleanup
cleanup = do
key <- cmdlineKey
logStatus key InfoPresent
return True

View file

@ -26,7 +26,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.SetKey import qualified Command.SetContent
import qualified Command.Fix import qualified Command.Fix
import qualified Command.Init import qualified Command.Init
import qualified Command.Describe import qualified Command.Describe
@ -63,6 +63,7 @@ cmds = concat
, Command.Init.def , Command.Init.def
, Command.Describe.def , Command.Describe.def
, Command.InitRemote.def , Command.InitRemote.def
, Command.SetContent.def
, Command.Unannex.def , Command.Unannex.def
, Command.Uninit.def , Command.Uninit.def
, Command.PreCommit.def , Command.PreCommit.def
@ -72,7 +73,6 @@ cmds = concat
, Command.AddUrl.def , Command.AddUrl.def
, Command.FromKey.def , Command.FromKey.def
, Command.DropKey.def , Command.DropKey.def
, Command.SetKey.def
, Command.Fix.def , Command.Fix.def
, Command.Fsck.def , Command.Fsck.def
, Command.Unused.def , Command.Unused.def
@ -89,9 +89,7 @@ cmds = concat
options :: [Option] options :: [Option]
options = commonOptions ++ options = commonOptions ++
[ Option ['k'] ["key"] (ReqArg setkey paramKey) [ Option ['t'] ["to"] (ReqArg setto paramRemote)
"specify a key to use"
, Option ['t'] ["to"] (ReqArg setto paramRemote)
"specify to where to transfer content" "specify to where to transfer content"
, Option ['f'] ["from"] (ReqArg setfrom paramRemote) , Option ['f'] ["from"] (ReqArg setfrom paramRemote)
"specify from where to transfer content" "specify from where to transfer content"
@ -116,7 +114,6 @@ options = commonOptions ++
setto v = Annex.changeState $ \s -> s { Annex.toremote = Just v } setto v = Annex.changeState $ \s -> s { Annex.toremote = Just v }
setfrom v = Annex.changeState $ \s -> s { Annex.fromremote = Just v } setfrom v = Annex.changeState $ \s -> s { Annex.fromremote = Just v }
setnumcopies v = Annex.changeState $ \s -> s {Annex.forcenumcopies = readMaybe v } setnumcopies v = Annex.changeState $ \s -> s {Annex.forcenumcopies = readMaybe v }
setkey v = Annex.changeState $ \s -> s { Annex.defaultkey = Just v }
setgitconfig :: String -> Annex () setgitconfig :: String -> Annex ()
setgitconfig v = do setgitconfig v = do
g <- gitRepo g <- gitRepo

2
debian/changelog vendored
View file

@ -13,6 +13,8 @@ git-annex (3.20111026) UNRELEASED; urgency=low
.gitattributes information about numcopies is not available in a bare .gitattributes information about numcopies is not available in a bare
repository. repository.
* unused, dropunused: Now work in bare repositories. * unused, dropunused: Now work in bare repositories.
* Removed the setkey command, and added a setcontent command with a more
useful interface.
-- Joey Hess <joeyh@debian.org> Thu, 27 Oct 2011 13:58:53 -0400 -- Joey Hess <joeyh@debian.org> Thu, 27 Oct 2011 13:58:53 -0400

View file

@ -274,6 +274,20 @@ subdirectories).
However, if a backend changes the information it uses to construct a key, However, if a backend changes the information it uses to construct a key,
this can also be used to migrate files to use the new key format. this can also be used to migrate files to use the new key format.
* setcontent src dest
Makes the dest file, which must already be tracked by git-annex have the
content of the src file. The src file is removed. This can be useful if you
have obtained the content of a file from elsewhere and want to put it in
the local annex.
Automatically runs fsck on dest to check that the expected content was
provided.
Example:
git annex setcontent /tmp/foo.iso foo.iso
* unannex [path ...] * unannex [path ...]
Use this to undo an accidental `git annex add` command. You can use Use this to undo an accidental `git annex add` command. You can use
@ -321,15 +335,6 @@ subdirectories).
git annex dropkey SHA1-s10-7da006579dd64330eb2456001fd01948430572f2 git annex dropkey SHA1-s10-7da006579dd64330eb2456001fd01948430572f2
* setkey file
This plumbing-level command sets the annexed data for a key to the
content of the specified file, and then removes the file.
Example:
git annex setkey --key=WORM-s3-m1287765018--file /tmp/file
# OPTIONS # OPTIONS
* --force * --force