summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-01-26 17:44:40 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-01-26 17:44:40 -0400
commitba748a11989f6ba7ea1f306be99b8b3f259ede68 (patch)
treed42d3884c8702f35897e9ff2481217247ee5b814
parentb7903eb2d149ceb164d7422fb56573735d83ebde (diff)
fsck: handle untrusted repos
-rw-r--r--Backend/File.hs36
-rw-r--r--debian/changelog2
-rw-r--r--doc/trust.mdwn3
-rw-r--r--doc/walkthrough.mdwn27
4 files changed, 56 insertions, 12 deletions
diff --git a/Backend/File.hs b/Backend/File.hs
index 358bc4b7c..dea69ef9b 100644
--- a/Backend/File.hs
+++ b/Backend/File.hs
@@ -16,6 +16,7 @@ module Backend.File (backend, checkKey) where
import Control.Monad.State
import System.Directory
+import Data.List
import BackendTypes
import LocationLog
@@ -27,6 +28,7 @@ import qualified Annex
import Types
import UUID
import Messages
+import Trust
backend :: Backend Annex
backend = Backend {
@@ -150,8 +152,8 @@ getNumCopies Nothing = do
config = "annex.numcopies"
{- This is used to check that numcopies is satisfied for the key on fsck.
- - This trusts the location log, and so checks all keys, even those with
- - data not present in the current annex.
+ - This trusts data in the the location log, and so can check all keys, even
+ - those with data not present in the current annex.
-
- The passed action is first run to allow backends deriving this one
- to do their own checks.
@@ -167,15 +169,31 @@ checkKeyNumCopies key numcopies = do
needed <- getNumCopies numcopies
g <- Annex.gitRepo
locations <- liftIO $ keyLocations g key
- let present = length locations
+ untrusted <- trustGet UnTrusted
+ let untrustedlocations = intersect untrusted locations
+ let safelocations = filter (\l -> not $ l `elem` untrusted) locations
+ let present = length safelocations
if present < needed
then do
- warning $ note present needed
+ ppuuids <- prettyPrintUUIDs untrustedlocations
+ missingNote present needed ppuuids
return False
else return True
where
- note 0 _ = "** No known copies of "++show key++" exist!"
- note present needed =
- "Only " ++ show present ++ " of " ++ show needed ++
- " copies of "++show key++" exist. " ++
- "Back it up with git-annex copy."
+
+missingNote :: Int -> Int -> String -> Annex ()
+missingNote 0 _ [] = showLongNote $ "** No known copies of this file exist!"
+missingNote 0 _ untrusted = do
+ showLongNote $
+ "Only these untrusted locations may have copies of this file!" ++
+ "\n" ++ untrusted ++
+ "Back it up to trusted locations with git-annex copy."
+missingNote present needed untrusted = do
+ showLongNote $
+ "Only " ++ show present ++ " of " ++ show needed ++
+ " trustworthy copies of this file exist." ++
+ "\nBack it up with git-annex copy."
+ when (not $ null untrusted) $ do
+ showLongNote $
+ "\nThe following untrusted copies may also exist: " ++
+ "\n" ++ untrusted
diff --git a/debian/changelog b/debian/changelog
index 01e99ae2b..fcd986e1b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -5,7 +5,7 @@ git-annex (0.19) UNRELEASED; urgency=low
* There are now three levels of repository trust.
* untrust: Now marks the current repository as untrusted.
* semitrust: Now restores the default trust level. (What untrust used to do.)
- * fsck: Warn if content is only in untrusted repositories.
+ * fsck: Take untrusted repositories into account.
* bugfix: Files were copied from trusted remotes first even if their
annex.cost was higher than other remotes.
diff --git a/doc/trust.mdwn b/doc/trust.mdwn
index edec6568e..dbddfe426 100644
--- a/doc/trust.mdwn
+++ b/doc/trust.mdwn
@@ -25,8 +25,7 @@ restores a repository to this default, when it has been overridden.)
## untrusted
An untrusted repository is not trusted to retain data at all. Git-annex
-will not count data in such a repository as a of the data, and will
-retain sufficient [[copies]] elsewhere.
+will retain sufficient [[copies]] of data elsewhere.
This is a good choice for eg, portable drives that could get lost. Or,
if a disk is known to be dying, you can set it to untrusted and let
diff --git a/doc/walkthrough.mdwn b/doc/walkthrough.mdwn
index d2231c81e..f375d4e44 100644
--- a/doc/walkthrough.mdwn
+++ b/doc/walkthrough.mdwn
@@ -391,3 +391,30 @@ it so anything put in there is backed up more thoroughly:
# echo "* annex.numcopies=3" > important_stuff/.gitattributes
For more details about the numcopies setting, see [[copies]].
+
+## untrusted repositories
+
+Suppose you have a portable USB drive and are using it as a git annex
+repository. You don't trust the drive, because you could lose it, or
+just because portable USB drives don't tend to last very long. You can
+let git-annex know about this, and it will adjust its behavior to avoid
+relying on that drive's continued availability.
+
+ # cd /media/usb
+ # git annex untrust .
+ untrust . ok
+
+Now when you do a fsck, you'll be warned appropriately:
+
+ # git annex fsck .
+ fsck my_big_file
+ Only these untrusted locations may have copies of this file!
+ 05e296c4-2989-11e0-bf40-bad1535567fe -- portable USB drive
+ Back it up to trusted locations with git-annex copy.
+ failed
+
+Also, git-annex will refuse to drop a file from elsewhere just because
+it can see a copy on the untrusted drive.
+
+It's also possible to tell git-annex that you have an unusually high
+level of trust for a repository. See [[trust]] for details.