summaryrefslogtreecommitdiff
path: root/Backend
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-10-15 18:57:05 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-10-15 18:57:05 -0400
commit44b8f7c95de84018044ce3669e62d40eac1b91a7 (patch)
treef3abcedf07eb3e4fcc2d71048f3b62cdea7b427d /Backend
parent8e742bd89e6bd3d83c44847c0455043809c64c89 (diff)
better worm keys
Diffstat (limited to 'Backend')
-rw-r--r--Backend/Worm.hs24
1 files changed, 22 insertions, 2 deletions
diff --git a/Backend/Worm.hs b/Backend/Worm.hs
index ba79428ef..89fe4bf57 100644
--- a/Backend/Worm.hs
+++ b/Backend/Worm.hs
@@ -3,16 +3,36 @@
module Backend.Worm (backend) where
+import Control.Monad.State
import qualified Backend.File
import BackendTypes
import Utility
import System.FilePath
+import System.Posix.Files
+import Data.Digest.Pure.SHA -- slow, but we only checksum filenames
+import qualified Data.ByteString.Lazy.Char8 as B
backend = Backend.File.backend {
name = "WORM",
getKey = keyValue
}
--- direct mapping from basename of filename to key
+-- A SHA1 of the basename of the filename, plus the file size and
+-- modification time, is used as the unique part of the key. That
+-- allows multiple files with the same names to have different keys,
+-- while also allowing a file to be moved around while retaining the
+-- same key.
+--
+-- The basename of the filename is also included in the key, so it's clear
+-- what the original filename was when a user sees the value.
keyValue :: FilePath -> Annex (Maybe Key)
-keyValue file = return $ Just $ Key ((name backend), (takeFileName file))
+keyValue file = do
+ stat <- liftIO $ getFileStatus file
+ return $ Just $ Key ((name backend), key stat)
+ where
+ key stat = (checksum $ uniqueid stat) ++ sep ++ base
+ checksum s = show $ sha1 $ B.pack s
+ uniqueid stat = (show $ fileSize stat) ++ sep ++
+ (show $ modificationTime stat)
+ base = takeFileName file
+ sep = ":"