Display progress meter in -J mode when downloading from the web.
authorJoey Hess <joeyh@joeyh.name>
Tue, 17 Nov 2015 01:00:54 +0000 (21:00 -0400)
committerJoey Hess <joeyh@joeyh.name>
Tue, 17 Nov 2015 01:00:54 +0000 (21:00 -0400)
Including in addurl, and get --from web, but also in S3 and External
special remotes when a web url is known for content in those remotes.

Annex/Content.hs
Command/AddUrl.hs
Messages/Progress.hs
Remote/External.hs
Remote/Git.hs
Remote/Helper/Special.hs
Remote/S3.hs
Remote/Web.hs
debian/changelog

index 5990d194a9b8e7a62087c84ceccae80b72bf3f34..90486f91287edd46633bde0206ed273d93e11010 100644 (file)
@@ -56,6 +56,7 @@ import qualified Annex.Url as Url
 import Types.Key
 import Utility.DataUnits
 import Utility.CopyFile
+import Utility.Metered
 import Config
 import Git.SharedRepository
 import Annex.Perms
@@ -658,8 +659,11 @@ saveState nocommit = doSideAction $ do
                        Annex.Branch.commit "update"
 
 {- Downloads content from any of a list of urls. -}
-downloadUrl :: [Url.URLString] -> FilePath -> Annex Bool
-downloadUrl urls file = go =<< annexWebDownloadCommand <$> Annex.getGitConfig
+downloadUrl :: Key -> MeterUpdate -> [Url.URLString] -> FilePath -> Annex Bool
+downloadUrl k p urls file = 
+       concurrentMetered (Just p) k $ \p' ->
+               watchFileSize file p' $
+                       go =<< annexWebDownloadCommand <$> Annex.getGitConfig
   where
        go Nothing = do
                a <- ifM commandProgressDisabled
index 6ed4fb2e2d5fd36ec0ff0ecf9f654fc2e3312b3e..78313f538fcfb54a4ed4264c89cb092a36e59f48 100644 (file)
@@ -252,9 +252,9 @@ addUrlFileQuvi relaxed quviurl videourl file = do
                                tmp <- fromRepo $ gitAnnexTmpObjectLocation key
                                showOutput
                                ok <- Transfer.notifyTransfer Transfer.Download (Just file) $
-                                       Transfer.download webUUID key (Just file) Transfer.forwardRetry Transfer.noObserver $ const $ do
+                                       Transfer.download webUUID key (Just file) Transfer.forwardRetry Transfer.noObserver $ \p -> do
                                                liftIO $ createDirectoryIfMissing True (parentDir tmp)
-                                               downloadUrl [videourl] tmp
+                                               downloadUrl key p [videourl] tmp
                                if ok
                                        then do
                                                cleanup webUUID quviurl file key (Just tmp)
@@ -294,9 +294,9 @@ addUrlFile relaxed url urlinfo file = do
 downloadWeb :: URLString -> Url.UrlInfo -> FilePath -> Annex (Maybe Key)
 downloadWeb url urlinfo file = do
        let dummykey = addSizeUrlKey urlinfo $ Backend.URL.fromUrl url Nothing
-       let downloader f _ = do
+       let downloader f p = do
                showOutput
-               downloadUrl [url] f
+               downloadUrl dummykey p [url] f
        showAction $ "downloading " ++ url ++ " "
        downloadWith downloader dummykey webUUID url file
 
index 24a68c922af636fe1c8f176810399fa885862a66..c14e7e6b132ff0680ff5e0dd40316f2b7c3f2b66 100644 (file)
@@ -29,8 +29,8 @@ import Data.Quantity
 
 {- Shows a progress meter while performing a transfer of a key.
  - The action is passed a callback to use to update the meter. -}
-metered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a
-metered combinemeterupdate key _af a = case keySize key of
+metered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a
+metered combinemeterupdate key a = case keySize key of
        Nothing -> nometer
        Just size -> withOutputType (go $ fromInteger size)
   where
@@ -66,10 +66,10 @@ metered combinemeterupdate key _af a = case keySize key of
 
 {- Use when the progress meter is only desired for concurrent
  - output; as when a command's own progress output is preferred. -}
-concurrentMetered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a
-concurrentMetered combinemeterupdate key af a = withOutputType go
+concurrentMetered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a
+concurrentMetered combinemeterupdate key a = withOutputType go
   where
-       go (ConcurrentOutput _) = metered combinemeterupdate key af a
+       go (ConcurrentOutput _) = metered combinemeterupdate key a
        go _ = a (fromMaybe (const noop) combinemeterupdate)
 
 {- Progress dots. -}
index 68237b939daa3ccf0902a0433d4681640e559052..897a6a72b35ddeb2408cead910a2e57d140a87c5 100644 (file)
@@ -503,9 +503,9 @@ checkurl external url =
        mkmulti (u, s, f) = (u, s, mkSafeFilePath f)
 
 retrieveUrl :: Retriever
-retrieveUrl = fileRetriever $ \f k _p -> do
+retrieveUrl = fileRetriever $ \f k p -> do
        us <- getWebUrls k
-       unlessM (downloadUrl us f) $
+       unlessM (downloadUrl k p us f) $
                error "failed to download content"
 
 checkKeyUrl :: Git.Repo -> CheckPresent
index d410db02fd2807c054c1338c1ae835e4bfac9c2f..890e40b5141ff25539617f9c72f2111c0597bdcd 100644 (file)
@@ -421,7 +421,7 @@ lockKey r key callback
 
 {- Tries to copy a key's content from a remote's annex to a file. -}
 copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)
-copyFromRemote r key file dest p = concurrentMetered (Just p) key file $
+copyFromRemote r key file dest p = concurrentMetered (Just p) key $
        copyFromRemote' r key file dest
 
 copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)
@@ -445,7 +445,8 @@ copyFromRemote' r key file dest meterupdate
                direct <- isDirect
                Ssh.rsyncHelper (Just (combineMeterUpdate meterupdate p))
                        =<< Ssh.rsyncParamsRemote direct r Download key dest file
-       | Git.repoIsHttp (repo r) = unVerified $ Annex.Content.downloadUrl (keyUrls r key) dest
+       | Git.repoIsHttp (repo r) = unVerified $
+               Annex.Content.downloadUrl key meterupdate (keyUrls r key) dest
        | otherwise = error "copying from non-ssh, non-http remote not supported"
   where
        {- Feed local rsync's progress info back to the remote,
@@ -522,7 +523,7 @@ copyFromRemoteCheap r key af file
                        )
        | Git.repoIsSsh (repo r) =
                ifM (Annex.Content.preseedTmp key file)
-                       ( fst <$> concurrentMetered Nothing key af
+                       ( fst <$> concurrentMetered Nothing key
                                (copyFromRemote' r key af file)
                        , return False
                        )
@@ -534,7 +535,7 @@ copyFromRemoteCheap _ _ _ _ = return False
 {- Tries to copy a key's content to a remote's annex. -}
 copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
 copyToRemote r key file meterupdate = 
-       concurrentMetered (Just meterupdate) key file $
+       concurrentMetered (Just meterupdate) key $
                copyToRemote' r key file
 
 copyToRemote' :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
index 7faf7a8a1d13afb96103806f660d87c07a18fbe3..d586d8c0a4bcb2e231fddd98655c6b289aa1e707 100644 (file)
@@ -155,8 +155,8 @@ specialRemote' :: SpecialRemoteCfg -> RemoteModifier
 specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckpresent baser = encr
   where
        encr = baser
-               { storeKey = \k f p -> cip >>= storeKeyGen k f p
-               , retrieveKeyFile = \k f d p -> cip >>= unVerified . retrieveKeyFileGen k f d p
+               { storeKey = \k _f p -> cip >>= storeKeyGen k p
+               , retrieveKeyFile = \k _f d p -> cip >>= unVerified . retrieveKeyFileGen k d p
                , retrieveKeyFileCheap = \k f d -> cip >>= maybe
                        (retrieveKeyFileCheap baser k f d)
                        -- retrieval of encrypted keys is never cheap
@@ -183,12 +183,12 @@ specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckp
        safely a = catchNonAsync a (\e -> warning (show e) >> return False)
 
        -- chunk, then encrypt, then feed to the storer
-       storeKeyGen k p enc = safely $ preparestorer k $ safely . go
+       storeKeyGen k p enc = safely $ preparestorer k $ safely . go
          where
                go (Just storer) = preparecheckpresent k $ safely . go' storer
                go Nothing = return False
                go' storer (Just checker) = sendAnnex k rollback $ \src ->
-                       displayprogress p k $ \p' ->
+                       displayprogress p k $ \p' ->
                                storeChunks (uuid baser) chunkconfig k src p'
                                        (storechunk enc storer)
                                        checker
@@ -204,10 +204,10 @@ specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckp
                                        storer (enck k) (ByteContent encb) p
 
        -- call retriever to get chunks; decrypt them; stream to dest file
-       retrieveKeyFileGen k dest p enc =
+       retrieveKeyFileGen k dest p enc =
                safely $ prepareretriever k $ safely . go
          where
-               go (Just retriever) = displayprogress p k $ \p' ->
+               go (Just retriever) = displayprogress p k $ \p' ->
                        retrieveChunks retriever (uuid baser) chunkconfig
                                enck k dest p' (sink dest enc)
                go Nothing = return False
@@ -227,8 +227,8 @@ specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckp
 
        chunkconfig = chunkConfig cfg
 
-       displayprogress p k a
-               | displayProgress cfg = metered (Just p) k a
+       displayprogress p k a
+               | displayProgress cfg = metered (Just p) k a
                | otherwise = a p
 
 {- Sink callback for retrieveChunks. Stores the file content into the
index fb772825c5699bcef3a817285f124a648bc1dc79..ba30bffebd3c7b6d67a546dd4399349990fba853 100644 (file)
@@ -249,8 +249,8 @@ retrieve r info Nothing = case getpublicurl info of
        Nothing -> \_ _ _ -> do
                warnMissingCredPairFor "S3" (AWS.creds $ uuid r)
                return False
-       Just geturl -> fileRetriever $ \f k _p ->
-               unlessM (downloadUrl [geturl k] f) $
+       Just geturl -> fileRetriever $ \f k p ->
+               unlessM (downloadUrl k p [geturl k] f) $
                        error "failed to download content"
 
 retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
index 257eba2e1c8ab6fd6f65ca8cb0d38315f8bda88c..143bdb9978f1ce0680d1e017376240fbd221f481 100644 (file)
@@ -72,7 +72,7 @@ gen r _ c gc =
                }
 
 downloadKey :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)
-downloadKey key _file dest _p = unVerified $ get =<< getWebUrls key
+downloadKey key _af dest p = unVerified $ get =<< getWebUrls key
   where
        get [] = do
                warning "no known url"
@@ -84,13 +84,13 @@ downloadKey key _file dest _p = unVerified $ get =<< getWebUrls key
                        case downloader of
                                QuviDownloader -> do
 #ifdef WITH_QUVI
-                                       flip downloadUrl dest
+                                       flip (downloadUrl key p) dest
                                                =<< withQuviOptions Quvi.queryLinks [Quvi.httponly, Quvi.quiet] u'
 #else
                                        warning "quvi support needed for this url"
                                        return False
 #endif
-                               _ -> downloadUrl [u'] dest
+                               _ -> downloadUrl key p [u'] dest
 
 downloadKeyCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
 downloadKeyCheap _ _ _ = return False
index 53a20717ca54b87bae3289b0af714c9ec84a5d4f..4231f998914d2352429ac2c6a8ae55f5f1f2f404 100644 (file)
@@ -3,6 +3,7 @@ git-annex (5.20151117) UNRELEASED; urgency=medium
   * Build with -j1 again to get reproducible build.
   * Display progress meter in -J mode when copying from a local git repo,
     to a local git repo, and from a remote git repo.
+  * Display progress meter in -J mode when downloading from the web.
 
  -- Joey Hess <id@joeyh.name>  Mon, 16 Nov 2015 16:49:34 -0400