aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-06-09 14:08:57 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-06-09 14:08:57 -0400
commitf80592f1603fdfdde4b092e9880646ded505163a (patch)
tree680902863f0f8805345e89f25f3a29eac4ec198b
parent951992f3535a33eaa867410e5985835c59f6b22a (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.hs24
-rw-r--r--Logs/Location.hs19
-rw-r--r--debian/changelog3
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