fsck: Fix up any broken links and misplaced content caused by the directory hash calculation bug fixed in the last release.

This commit is contained in:
Joey Hess 2012-03-10 14:46:21 -04:00
parent 468fecc315
commit 5ab82230f7
2 changed files with 36 additions and 1 deletions

View file

@ -10,6 +10,7 @@ module Command.Fsck where
import Common.Annex import Common.Annex
import Command import Command
import qualified Annex import qualified Annex
import qualified Annex.Queue
import qualified Remote import qualified Remote
import qualified Types.Backend import qualified Types.Backend
import qualified Types.Key import qualified Types.Key
@ -51,7 +52,8 @@ start from file (key, backend) = do
perform :: Key -> FilePath -> Backend -> Maybe Int -> CommandPerform perform :: Key -> FilePath -> Backend -> Maybe Int -> CommandPerform
perform key file backend numcopies = check perform key file backend numcopies = check
-- order matters -- order matters
[ verifyLocationLog key file [ fixLink key file
, verifyLocationLog key file
, checkKeySize key , checkKeySize key
, checkBackend backend key , checkBackend backend key
, checkKeyNumCopies key file numcopies , checkKeyNumCopies key file numcopies
@ -129,6 +131,32 @@ check = sequence >=> dispatch
| all (== True) vs = next $ return True | all (== True) vs = next $ return True
| otherwise = stop | otherwise = stop
{- Checks that the file's symlink points correctly to the content. -}
fixLink :: Key -> FilePath -> Annex Bool
fixLink key file = do
want <- calcGitLink file key
have <- liftIO $ readSymbolicLink file
when (want /= have) $ do
{- Version 3.20120227 had a bug that could cause content
- to be stored in the wrong hash directory. Clean up
- after the bug by moving the content.
-}
whenM (liftIO $ doesFileExist file) $
unlessM (inAnnex key) $ do
showNote $ "fixing content location"
dir <- liftIO $ parentDir <$> absPath file
let content = absPathFrom dir have
liftIO $ allowWrite (parentDir content)
moveAnnex key content
showNote $ "fixing link"
liftIO $ createDirectoryIfMissing True (parentDir file)
liftIO $ removeFile file
liftIO $ createSymbolicLink want file
Annex.Queue.add "add" [Param "--force", Param "--"] [file]
return True
{- Checks that the location log reflects the current status of the key, {- Checks that the location log reflects the current status of the key,
in this repository only. -} in this repository only. -}
verifyLocationLog :: Key -> String -> Annex Bool verifyLocationLog :: Key -> String -> Annex Bool

7
debian/changelog vendored
View file

@ -1,3 +1,10 @@
git-annex (3.20120310) UNRELEASED; urgency=low
* fsck: Fix up any broken links and misplaced content caused by the
directory hash calculation bug fixed in the last release.
-- Joey Hess <joeyh@debian.org> Sat, 10 Mar 2012 14:03:22 -0400
git-annex (3.20120309) unstable; urgency=low git-annex (3.20120309) unstable; urgency=low
* Fix key directory hash calculation code to behave as it did before * Fix key directory hash calculation code to behave as it did before