git-annex/Backend/WORM.hs
Joey Hess 4f657aa14e add getFileSize, which can get the real size of a large file on Windows
Avoid using fileSize which maxes out at just 2 gb on Windows.
Instead, use hFileSize, which doesn't have a bounded size.
Fixes support for files > 2 gb on Windows.

Note that the InodeCache code only needs to compare a file size,
so it doesn't matter it the file size wraps. So it has been
left as-is. This was necessary both to avoid invalidating existing inode
caches, and because the code passed FileStatus around and would have become
more expensive if it called getFileSize.

This commit was sponsored by Christian Dietrich.
2015-01-20 17:09:24 -04:00

44 lines
1.1 KiB
Haskell

{- git-annex "WORM" backend -- Write Once, Read Many
-
- Copyright 2010 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Backend.WORM (backends) where
import Common.Annex
import Types.Backend
import Types.Key
import Types.KeySource
import Backend.Utilities
import Git.FilePath
backends :: [Backend]
backends = [backend]
backend :: Backend
backend = Backend
{ name = "WORM"
, getKey = keyValue
, fsckKey = Nothing
, canUpgradeKey = Nothing
, fastMigrate = Nothing
, isStableKey = const True
}
{- The key includes the file size, modification time, and the
- original filename relative to the top of the git repository.
-}
keyValue :: KeySource -> Annex (Maybe Key)
keyValue source = do
let f = contentLocation source
stat <- liftIO $ getFileStatus f
sz <- liftIO $ getFileSize' f stat
relf <- getTopFilePath <$> inRepo (toTopFilePath $ keyFilename source)
return $ Just $ stubKey
{ keyName = genKeyName relf
, keyBackendName = name backend
, keySize = Just sz
, keyMtime = Just $ modificationTime stat
}