diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-06-09 14:08:57 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-06-09 14:08:57 -0400 |
commit | f80592f1603fdfdde4b092e9880646ded505163a (patch) | |
tree | 680902863f0f8805345e89f25f3a29eac4ec198b | |
parent | 951992f3535a33eaa867410e5985835c59f6b22a (diff) |
fsck: Ignore keys that are known to be dead when running in --all mode or a in a bare repo. Otherwise, still reports files with lost contents, even if the content is dead.
-rw-r--r-- | Command/Fsck.hs | 24 | ||||
-rw-r--r-- | Logs/Location.hs | 19 | ||||
-rw-r--r-- | debian/changelog | 3 |
3 files changed, 32 insertions, 14 deletions
diff --git a/Command/Fsck.hs b/Command/Fsck.hs index 26c788d56..6dccb285b 100644 --- a/Command/Fsck.hs +++ b/Command/Fsck.hs @@ -99,7 +99,7 @@ perform key file backend numcopies = check , verifyDirectMode key file , checkKeySize key , checkBackend backend key (Just file) - , checkKeyNumCopies key file numcopies + , checkKeyNumCopies key (Just file) numcopies ] {- To fsck a remote, the content is retrieved to a tmp file, @@ -125,7 +125,7 @@ performRemote key file backend numcopies remote = [ verifyLocationLogRemote key file remote present , checkKeySizeRemote key remote localcopy , checkBackendRemote backend key remote localcopy - , checkKeyNumCopies key file numcopies + , checkKeyNumCopies key (Just file) numcopies ] withtmp a = do pid <- liftIO getPID @@ -160,7 +160,7 @@ performKey key backend numcopies = check [ verifyLocationLog key (key2file key) , checkKeySize key , checkBackend backend key Nothing - , checkKeyNumCopies key (key2file key) numcopies + , checkKeyNumCopies key Nothing numcopies ] check :: [Annex Bool] -> Annex Bool @@ -343,15 +343,21 @@ checkBackendOr' bad backend key file postcheck = , return True ) -checkKeyNumCopies :: Key -> String -> NumCopies -> Annex Bool -checkKeyNumCopies key file numcopies = do +checkKeyNumCopies :: Key -> AssociatedFile -> NumCopies -> Annex Bool +checkKeyNumCopies key afile numcopies = do + let file = fromMaybe (key2file key) afile (untrustedlocations, safelocations) <- trustPartition UnTrusted =<< Remote.keyLocations key let present = NumCopies (length safelocations) if present < numcopies - then do - ppuuids <- Remote.prettyPrintUUIDs "untrusted" untrustedlocations - warning $ missingNote file present numcopies ppuuids - return False + then ifM (pure (isNothing afile) <&&> checkDead key) + ( do + showLongNote $ "This key is dead, skipping." + return True + , do + ppuuids <- Remote.prettyPrintUUIDs "untrusted" untrustedlocations + warning $ missingNote file present numcopies ppuuids + return False + ) else return True missingNote :: String -> NumCopies -> NumCopies -> String -> String diff --git a/Logs/Location.hs b/Logs/Location.hs index 391edb680..5ad0ae4d0 100644 --- a/Logs/Location.hs +++ b/Logs/Location.hs @@ -8,7 +8,7 @@ - Repositories record their UUID and the date when they --get or --drop - a value. - - - Copyright 2010-2014 Joey Hess <id@joeyh.name> + - Copyright 2010-2015 Joey Hess <id@joeyh.name> - - Licensed under the GNU GPL version 3 or higher. -} @@ -19,7 +19,8 @@ module Logs.Location ( logChange, loggedLocations, loggedLocationsHistorical, - locationLog, + checkDead, + setDead, loggedKeys, loggedKeysFor, ) where @@ -62,10 +63,18 @@ getLoggedLocations getter key = do config <- Annex.getGitConfig map toUUID <$> getter (locationLogFile config key) -locationLog :: Key -> Annex [LogLine] -locationLog key = do +{- For a key to be dead, all locations that have location status for the key + - must have InfoDead set. -} +checkDead :: Key -> Annex Bool +checkDead key = do config <- Annex.getGitConfig - currentLog (locationLogFile config key) + ls <- compactLog <$> readLog (locationLogFile config key) + return $ all (\l -> status l == InfoDead) ls + +{- Updates the log to say that a key is dead. This changes all logged lines + - for the key, in any location, to be InfoDead. -} +setDead :: Key -> Annex () +setDead key = undefined {- Finds all keys that have location log information. - (There may be duplicate keys in the list.) -} diff --git a/debian/changelog b/debian/changelog index 579ff8990..a1faa0d88 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,6 +16,9 @@ git-annex (5.20150529) UNRELEASED; urgency=medium the public to access the bucket's content. * S3: Publically accessible buckets can be used without creds. * Re-remove dependency on obsolete hamlet package. Closes: #786659 + * fsck: Ignore keys that are known to be dead when running in --all mode + or a in a bare repo. Otherwise, still reports files with lost contents, + even if the content is dead. -- Joey Hess <id@joeyh.name> Sat, 30 May 2015 02:07:18 -0400 |