diff options
author | Joey Hess <joey@kitenet.net> | 2012-09-16 01:17:48 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-09-16 01:17:48 -0400 |
commit | 48fd1e629c1192d244fd776c4fc7bd447912df37 (patch) | |
tree | eb3a1cf443d033f5195d8b8d22a79fcbdf35db7d | |
parent | 719d229d9d0bd87365dd5992d6433da37ae2aca8 (diff) |
reinject: When the provided file doesn't match, leave it where it is, rather than moving to .git/annex/bad/
-rw-r--r-- | Command/Fsck.hs | 37 | ||||
-rw-r--r-- | Command/Reinject.hs | 22 | ||||
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn | 2 |
4 files changed, 35 insertions, 28 deletions
diff --git a/Command/Fsck.hs b/Command/Fsck.hs index 89ba0eef8..1e49fd4d3 100644 --- a/Command/Fsck.hs +++ b/Command/Fsck.hs @@ -209,17 +209,17 @@ checkKeySize :: Key -> Annex Bool checkKeySize key = do file <- inRepo $ gitAnnexLocation key ifM (liftIO $ doesFileExist file) - ( checkKeySize' key file badContent + ( checkKeySizeOr badContent key file , return True ) checkKeySizeRemote :: Key -> Remote -> Maybe FilePath -> Annex Bool checkKeySizeRemote _ _ Nothing = return True -checkKeySizeRemote key remote (Just file) = checkKeySize' key file - (badContentRemote remote) +checkKeySizeRemote key remote (Just file) = + checkKeySizeOr (badContentRemote remote) key file -checkKeySize' :: Key -> FilePath -> (Key -> Annex String) -> Annex Bool -checkKeySize' key file bad = case Types.Key.keySize key of +checkKeySizeOr :: (Key -> Annex String) -> Key -> FilePath -> Annex Bool +checkKeySizeOr bad key file = case Types.Key.keySize key of Nothing -> return True Just size -> do size' <- fromIntegral . fileSize @@ -242,22 +242,23 @@ checkKeySize' key file bad = case Types.Key.keySize key of checkBackend :: Backend -> Key -> Annex Bool checkBackend backend key = do file <- inRepo (gitAnnexLocation key) - checkBackend' backend key (Just file) badContent + checkBackendOr badContent backend key file checkBackendRemote :: Backend -> Key -> Remote -> Maybe FilePath -> Annex Bool -checkBackendRemote backend key remote localcopy = - checkBackend' backend key localcopy (badContentRemote remote) +checkBackendRemote backend key remote = maybe (return True) go + where + go = checkBackendOr (badContentRemote remote) backend key -checkBackend' :: Backend -> Key -> Maybe FilePath -> (Key -> Annex String) -> Annex Bool -checkBackend' _ _ Nothing _ = return True -checkBackend' backend key (Just file) bad = case Types.Backend.fsckKey backend of - Nothing -> return True - Just a -> do - ok <- a key file - unless ok $ do - msg <- bad key - warning $ "Bad file content; " ++ msg - return ok +checkBackendOr :: (Key -> Annex String) -> Backend -> Key -> FilePath -> Annex Bool +checkBackendOr bad backend key file = + case Types.Backend.fsckKey backend of + Nothing -> return True + Just a -> do + ok <- a key file + unless ok $ do + msg <- bad key + warning $ "Bad file content; " ++ msg + return ok checkKeyNumCopies :: Key -> FilePath -> Maybe Int -> Annex Bool checkKeyNumCopies key file numcopies = do diff --git a/Command/Reinject.hs b/Command/Reinject.hs index bb277af2c..112b7fadf 100644 --- a/Command/Reinject.hs +++ b/Command/Reinject.hs @@ -35,8 +35,14 @@ start _ = error "specify a src file and a dest file" perform :: FilePath -> FilePath -> (Key, Backend) -> CommandPerform perform src _dest (key, backend) = do - unlessM move $ error "mv failed!" - next $ cleanup key backend + {- Check the content before accepting it. -} + ifM (Command.Fsck.checkKeySizeOr reject key src + <&&> Command.Fsck.checkBackendOr reject backend key src) + ( do + unlessM move $ error "mv failed!" + next $ cleanup key + , error "not reinjecting" + ) where -- the file might be on a different filesystem, -- so mv is used rather than simply calling @@ -44,13 +50,9 @@ perform src _dest (key, backend) = do -- checked this way. move = getViaTmp key $ \tmp -> liftIO $ boolSystem "mv" [File src, File tmp] + reject = const $ return "wrong file?" -cleanup :: Key -> Backend -> CommandCleanup -cleanup key backend = do +cleanup :: Key -> CommandCleanup +cleanup key = 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 + return True diff --git a/debian/changelog b/debian/changelog index 4e005e2f5..b949534e9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,6 +18,8 @@ git-annex (3.20120826) UNRELEASED; urgency=low * migrate: Check content before generating the new key, to avoid generating a key for corrupt data. * Support repositories created with --separate-git-dir. Closes: #684405 + * reinject: When the provided file doesn't match, leave it where it is, + rather than moving to .git/annex/bad/ -- Joey Hess <joeyh@debian.org> Mon, 27 Aug 2012 13:27:39 -0400 diff --git a/doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn b/doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn index d7eaa7d1b..a487b2d3d 100644 --- a/doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn +++ b/doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn @@ -11,3 +11,5 @@ What version of git-annex are you using? On what operating system? git-annex version: 3.20120807 Ubuntu 12.04 updated on Aug 20th annex was installed via cabal on Aug 20th, all other packages are from ubuntu. + +> [[done]] --[[Joey]] |