summaryrefslogtreecommitdiff
path: root/Backend/SHA1.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Backend/SHA1.hs')
-rw-r--r--Backend/SHA1.hs37
1 files changed, 32 insertions, 5 deletions
diff --git a/Backend/SHA1.hs b/Backend/SHA1.hs
index 5a232ec1d..8852e72e9 100644
--- a/Backend/SHA1.hs
+++ b/Backend/SHA1.hs
@@ -11,24 +11,51 @@ import Control.Monad.State
import Data.String.Utils
import System.Cmd.Utils
import System.IO
+import System.Directory
import qualified Backend.File
import TypeInternals
import Messages
+import qualified Annex
+import Locations
+import Core
backend :: Backend
backend = Backend.File.backend {
name = "SHA1",
- getKey = keyValue
+ getKey = keyValue,
+ fsckKey = Backend.File.checkKey checkKeySHA1
}
--- checksum the file to get its key
-keyValue :: FilePath -> Annex (Maybe Key)
-keyValue file = do
+sha1 :: FilePath -> Annex String
+sha1 file = do
showNote "checksum..."
liftIO $ pOpen ReadFromPipe "sha1sum" [file] $ \h -> do
line <- hGetLine h
let bits = split " " line
if (null bits)
then error "sha1sum parse error"
- else return $ Just $ Key ((name backend), bits !! 0)
+ else return $ bits !! 0
+
+-- A key is a sha1 of its contents.
+keyValue :: FilePath -> Annex (Maybe Key)
+keyValue file = do
+ s <- sha1 file
+ return $ Just $ Key ((name backend), s)
+
+-- A key's sha1 is checked during fsck.
+checkKeySHA1 :: Key -> Annex Bool
+checkKeySHA1 key = do
+ g <- Annex.gitRepo
+ let file = annexLocation g key
+ present <- liftIO $ doesFileExist file
+ if (not present)
+ then return True
+ else do
+ s <- sha1 file
+ if (s == keyName key)
+ then return True
+ else do
+ dest <- moveBad key
+ showNote $ "bad file content (moved to "++dest++")"
+ return False