diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-01-20 16:58:48 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-01-20 17:09:24 -0400 |
commit | c7e67aa29183c7fe7bb14b909cf953a89c531b08 (patch) | |
tree | e63f341fb51375faf9a0928af00703bcef584306 /Backend | |
parent | 68c8b9b7592a7c407bdd6a0fe8b5f49241118926 (diff) |
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.
Diffstat (limited to 'Backend')
-rw-r--r-- | Backend/Hash.hs | 5 | ||||
-rw-r--r-- | Backend/WORM.hs | 6 |
2 files changed, 6 insertions, 5 deletions
diff --git a/Backend/Hash.hs b/Backend/Hash.hs index e50eca516..8ddccd229 100644 --- a/Backend/Hash.hs +++ b/Backend/Hash.hs @@ -68,8 +68,7 @@ hashNameE hash = hashName hash ++ "E" keyValue :: Hash -> KeySource -> Annex (Maybe Key) keyValue hash source = do let file = contentLocation source - stat <- liftIO $ getFileStatus file - let filesize = fromIntegral $ fileSize stat + filesize <- liftIO $ getFileSize file s <- hashFile hash file filesize return $ Just $ stubKey { keyName = s @@ -103,7 +102,7 @@ checkKeyChecksum hash key file = do mstat <- liftIO $ catchMaybeIO $ getFileStatus file case (mstat, fast) of (Just stat, False) -> do - let filesize = fromIntegral $ fileSize stat + filesize <- liftIO $ getFileSize' file stat showSideAction "checksum" check <$> hashFile hash file filesize _ -> return True diff --git a/Backend/WORM.hs b/Backend/WORM.hs index bd5e374e1..24dba5795 100644 --- a/Backend/WORM.hs +++ b/Backend/WORM.hs @@ -32,11 +32,13 @@ backend = Backend -} keyValue :: KeySource -> Annex (Maybe Key) keyValue source = do - stat <- liftIO $ getFileStatus $ contentLocation source + 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 $ fromIntegral $ fileSize stat + , keySize = Just sz , keyMtime = Just $ modificationTime stat } |