From cc1ea8f84463c7e333bfa17a815f250d8d088841 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 31 Oct 2011 12:33:41 -0400 Subject: Removed the setkey command, and added a setcontent command with a more useful interface. --- Command/Fsck.hs | 7 +++++-- Command/SetContent.hs | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ Command/SetKey.hs | 48 ------------------------------------------- GitAnnex.hs | 9 +++------ debian/changelog | 2 ++ doc/git-annex.mdwn | 23 ++++++++++++--------- 6 files changed, 80 insertions(+), 65 deletions(-) create mode 100644 Command/SetContent.hs delete mode 100644 Command/SetKey.hs diff --git a/Command/Fsck.hs b/Command/Fsck.hs index 073652d2c..8d6f03d76 100644 --- a/Command/Fsck.hs +++ b/Command/Fsck.hs @@ -38,7 +38,7 @@ perform key file backend numcopies = check [ verifyLocationLog key file , checkKeySize key , checkKeyNumCopies key file numcopies - , (Types.Backend.fsckKey backend) key + , checkBackend backend key ] {- 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 [ verifyLocationLog key (show key) , checkKeySize key - , (Types.Backend.fsckKey backend) key + , checkBackend backend key ] check :: [Annex Bool] -> CommandPerform @@ -134,6 +134,9 @@ checkKeySize key = do 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 file numcopies = do needed <- getNumCopies numcopies diff --git a/Command/SetContent.hs b/Command/SetContent.hs new file mode 100644 index 000000000..d62faa445 --- /dev/null +++ b/Command/SetContent.hs @@ -0,0 +1,56 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - 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 diff --git a/Command/SetKey.hs b/Command/SetKey.hs deleted file mode 100644 index 0c70d12b0..000000000 --- a/Command/SetKey.hs +++ /dev/null @@ -1,48 +0,0 @@ -{- git-annex command - - - - Copyright 2010 Joey Hess - - - - 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 diff --git a/GitAnnex.hs b/GitAnnex.hs index 89fb4e591..09f0a118c 100644 --- a/GitAnnex.hs +++ b/GitAnnex.hs @@ -26,7 +26,7 @@ import qualified Command.Copy import qualified Command.Get import qualified Command.FromKey import qualified Command.DropKey -import qualified Command.SetKey +import qualified Command.SetContent import qualified Command.Fix import qualified Command.Init import qualified Command.Describe @@ -63,6 +63,7 @@ cmds = concat , Command.Init.def , Command.Describe.def , Command.InitRemote.def + , Command.SetContent.def , Command.Unannex.def , Command.Uninit.def , Command.PreCommit.def @@ -72,7 +73,6 @@ cmds = concat , Command.AddUrl.def , Command.FromKey.def , Command.DropKey.def - , Command.SetKey.def , Command.Fix.def , Command.Fsck.def , Command.Unused.def @@ -89,9 +89,7 @@ cmds = concat options :: [Option] options = commonOptions ++ - [ Option ['k'] ["key"] (ReqArg setkey paramKey) - "specify a key to use" - , Option ['t'] ["to"] (ReqArg setto paramRemote) + [ Option ['t'] ["to"] (ReqArg setto paramRemote) "specify to where to transfer content" , Option ['f'] ["from"] (ReqArg setfrom paramRemote) "specify from where to transfer content" @@ -116,7 +114,6 @@ options = commonOptions ++ setto v = Annex.changeState $ \s -> s { Annex.toremote = Just v } setfrom v = Annex.changeState $ \s -> s { Annex.fromremote = Just 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 v = do g <- gitRepo diff --git a/debian/changelog b/debian/changelog index e553877de..91e4a18af 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,6 +13,8 @@ git-annex (3.20111026) UNRELEASED; urgency=low .gitattributes information about numcopies is not available in a bare repository. * unused, dropunused: Now work in bare repositories. + * Removed the setkey command, and added a setcontent command with a more + useful interface. -- Joey Hess Thu, 27 Oct 2011 13:58:53 -0400 diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index dc0b49ab2..abddaa0de 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -274,6 +274,20 @@ subdirectories). 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. +* 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 ...] Use this to undo an accidental `git annex add` command. You can use @@ -321,15 +335,6 @@ subdirectories). 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 * --force -- cgit v1.2.3