summaryrefslogtreecommitdiff
path: root/Backend/WORM.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Backend/WORM.hs')
-rw-r--r--Backend/WORM.hs35
1 files changed, 35 insertions, 0 deletions
diff --git a/Backend/WORM.hs b/Backend/WORM.hs
new file mode 100644
index 000000000..0588ddaf8
--- /dev/null
+++ b/Backend/WORM.hs
@@ -0,0 +1,35 @@
+{- git-annex "WORM" backend -- Write Once, Read Many
+ - -}
+
+module Backend.WORM (backend) where
+
+import Control.Monad.State
+import System.FilePath
+import System.Posix.Files
+import qualified Data.ByteString.Lazy.Char8 as B
+
+import qualified Backend.File
+import TypeInternals
+import Utility
+
+backend = Backend.File.backend {
+ name = "WORM",
+ getKey = keyValue
+}
+
+-- The key is formed from the file size, modification time, and the
+-- basename of the filename.
+--
+-- 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.
+keyValue :: FilePath -> Annex (Maybe Key)
+keyValue file = do
+ stat <- liftIO $ getFileStatus file
+ return $ Just $ Key ((name backend), key stat)
+ where
+ key stat = uniqueid stat ++ sep ++ base
+ uniqueid stat = (show $ modificationTime stat) ++ sep ++
+ (show $ fileSize stat)
+ base = takeFileName file
+ sep = ":"