summaryrefslogtreecommitdiff
path: root/Remote
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-01-20 16:58:48 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-01-20 17:09:24 -0400
commitc7e67aa29183c7fe7bb14b909cf953a89c531b08 (patch)
treee63f341fb51375faf9a0928af00703bcef584306 /Remote
parent68c8b9b7592a7c407bdd6a0fe8b5f49241118926 (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 'Remote')
-rw-r--r--Remote/Git.hs4
-rw-r--r--Remote/Helper/Chunked.hs3
-rw-r--r--Remote/Helper/Http.hs2
-rw-r--r--Remote/S3.hs2
4 files changed, 4 insertions, 7 deletions
diff --git a/Remote/Git.hs b/Remote/Git.hs
index f015e295e..583e9c728 100644
--- a/Remote/Git.hs
+++ b/Remote/Git.hs
@@ -563,9 +563,7 @@ rsyncOrCopyFile rsyncparams src dest p =
(const $ copyFileExternal CopyTimeStamps src dest)
watchfilesize oldsz = do
threadDelay 500000 -- 0.5 seconds
- v <- catchMaybeIO $
- toBytesProcessed . fileSize
- <$> getFileStatus dest
+ v <- catchMaybeIO $ toBytesProcessed <$> getFileSize dest
case v of
Just sz
| sz /= oldsz -> do
diff --git a/Remote/Helper/Chunked.hs b/Remote/Helper/Chunked.hs
index 806fab542..8516268ce 100644
--- a/Remote/Helper/Chunked.hs
+++ b/Remote/Helper/Chunked.hs
@@ -244,8 +244,7 @@ retrieveChunks retriever u chunkconfig encryptor basek dest basep sink
| otherwise = go =<< chunkKeys u chunkconfig basek
where
go ls = do
- currsize <- liftIO $ catchMaybeIO $
- toInteger . fileSize <$> getFileStatus dest
+ currsize <- liftIO $ catchMaybeIO $ getFileSize dest
let ls' = maybe ls (setupResume ls) currsize
if any null ls'
then return True -- dest is already complete
diff --git a/Remote/Helper/Http.hs b/Remote/Helper/Http.hs
index 6ce5bacb8..3d08066ba 100644
--- a/Remote/Helper/Http.hs
+++ b/Remote/Helper/Http.hs
@@ -32,7 +32,7 @@ httpStorer a = fileStorer $ \k f m -> a k =<< liftIO (httpBodyStorer f m)
-- the meter as it's sent.
httpBodyStorer :: FilePath -> MeterUpdate -> IO RequestBody
httpBodyStorer src m = do
- size <- fromIntegral . fileSize <$> getFileStatus src :: IO Integer
+ size <- getFileSize src
let streamer sink = withMeteredFile src m $ \b -> byteStringPopper b sink
return $ RequestBodyStream (fromInteger size) streamer
diff --git a/Remote/S3.hs b/Remote/S3.hs
index 1a6e41094..104fdddca 100644
--- a/Remote/S3.hs
+++ b/Remote/S3.hs
@@ -159,7 +159,7 @@ store :: Remote -> S3Handle -> Storer
store r h = fileStorer $ \k f p -> do
case partSize (hinfo h) of
Just partsz | partsz > 0 -> do
- fsz <- fromIntegral . fileSize <$> liftIO (getFileStatus f)
+ fsz <- liftIO $ getFileSize f
if fsz > partsz
then multipartupload fsz partsz k f p
else singlepartupload k f p