summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex/Content.hs23
-rw-r--r--Command/AddUrl.hs49
-rw-r--r--debian/changelog2
3 files changed, 42 insertions, 32 deletions
diff --git a/Annex/Content.hs b/Annex/Content.hs
index 62f1b1ccb..99a2f6c28 100644
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -15,6 +15,7 @@ module Annex.Content (
getViaTmp,
getViaTmpChecked,
getViaTmpUnchecked,
+ prepGetViaTmpChecked,
withTmp,
checkDiskSpace,
moveAnnex,
@@ -158,20 +159,31 @@ getViaTmpUnchecked :: Key -> (FilePath -> Annex Bool) -> Annex Bool
getViaTmpUnchecked = finishGetViaTmp (return True)
getViaTmpChecked :: Annex Bool -> Key -> (FilePath -> Annex Bool) -> Annex Bool
-getViaTmpChecked check key action = do
+getViaTmpChecked check key action =
+ prepGetViaTmpChecked key $
+ finishGetViaTmp check key action
+
+{- Prepares to download a key via a tmp file, and checks that there is
+ - enough free disk space.
+ -
+ - When the temp file already exists, count the space it is using as
+ - free, since the download will overwrite it or resume.
+ -
+ - Wen there's enough free space, runs the download action.
+ -}
+prepGetViaTmpChecked :: Key -> Annex Bool -> Annex Bool
+prepGetViaTmpChecked key getkey = do
tmp <- fromRepo $ gitAnnexTmpLocation key
- -- Check that there is enough free disk space.
- -- When the temp file already exists, count the space
- -- it is using as free.
e <- liftIO $ doesFileExist tmp
alreadythere <- if e
then fromIntegral . fileSize <$> liftIO (getFileStatus tmp)
else return 0
ifM (checkDiskSpace Nothing key alreadythere)
( do
+ -- The tmp file may not have been left writable
when e $ thawContent tmp
- finishGetViaTmp check key action
+ getkey
, return False
)
@@ -210,6 +222,7 @@ checkDiskSpace destination key alreadythere = do
reserve <- annexDiskReserve <$> Annex.getGitConfig
free <- liftIO . getDiskFree =<< dir
force <- Annex.getState Annex.force
+ liftIO $ print (free, keySize key)
case (free, keySize key) of
(Just have, Just need) -> do
let ok = (need + reserve <= have + alreadythere) || force
diff --git a/Command/AddUrl.hs b/Command/AddUrl.hs
index 28f6ff741..043bda3fd 100644
--- a/Command/AddUrl.hs
+++ b/Command/AddUrl.hs
@@ -28,7 +28,6 @@ import Config
import Annex.Content.Direct
import Logs.Location
import qualified Logs.Transfer as Transfer
-import Utility.Daemon (checkDaemon)
#ifdef WITH_QUVI
import Annex.Quvi
import qualified Utility.Quvi as Quvi
@@ -153,44 +152,40 @@ addUrlFile relaxed url file = do
download :: URLString -> FilePath -> Annex Bool
download url file = do
dummykey <- genkey
- tmp <- fromRepo $ gitAnnexTmpLocation dummykey
- showOutput
- ifM (runtransfer dummykey tmp)
- ( do
- backend <- chooseBackend file
- let source = KeySource
- { keyFilename = file
- , contentLocation = tmp
- , inodeCache = Nothing
- }
- k <- genKey source backend
- case k of
- Nothing -> return False
- Just (key, _) -> cleanup url file key (Just tmp)
- , return False
- )
+ prepGetViaTmpChecked dummykey $ do
+ tmp <- fromRepo $ gitAnnexTmpLocation dummykey
+ showOutput
+ ifM (runtransfer dummykey tmp)
+ ( do
+ backend <- chooseBackend file
+ let source = KeySource
+ { keyFilename = file
+ , contentLocation = tmp
+ , inodeCache = Nothing
+ }
+ k <- genKey source backend
+ case k of
+ Nothing -> return False
+ Just (key, _) -> cleanup url file key (Just tmp)
+ , return False
+ )
where
{- Generate a dummy key to use for this download, before we can
- examine the file and find its real key. This allows resuming
- downloads, as the dummy key for a given url is stable.
-
- - If the assistant is running, actually hits the url here,
- - to get the size, so it can display a pretty progress bar.
+ - Actually hits the url here, to get the size. This is needed to
+ - avoid exceeding the diskreserve, and so the assistant can
+ - display a pretty progress bar.
-}
genkey = do
- pidfile <- fromRepo gitAnnexPidFile
- size <- ifM (liftIO $ isJust <$> checkDaemon pidfile)
- ( do
- headers <- getHttpHeaders
- snd <$> Url.withUserAgent (Url.exists url headers)
- , return Nothing
- )
+ headers <- getHttpHeaders
+ size <- snd <$> Url.withUserAgent (Url.exists url headers)
Backend.URL.fromUrl url size
runtransfer dummykey tmp =
Transfer.download webUUID dummykey (Just file) Transfer.forwardRetry $ const $ do
liftIO $ createDirectoryIfMissing True (parentDir tmp)
downloadUrl [url] tmp
-
cleanup :: URLString -> FilePath -> Key -> Maybe FilePath -> Annex Bool
cleanup url file key mtmp = do
diff --git a/debian/changelog b/debian/changelog
index bd5b459bc..28a11900b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -15,6 +15,8 @@ git-annex (5.20131231) UNRELEASED; urgency=medium
* assistant: Ensure that .ssh/config and .ssh/authorized_keys are not
group or world writable when writing to those files, as that can make
ssh refuse to use them, if it allows another user to write to them.
+ * addurl, importfeed: Honor annex.diskreserve as long as the size of the
+ url can be checked.
-- Joey Hess <joeyh@debian.org> Tue, 31 Dec 2013 13:41:18 -0400