packages feed

darcs-benchmark-0.1.1: Download.hs

module Download where

import Network.URI
import Network.HTTP
import Network.HTTP.Base
import qualified Codec.Archive.Tar as Tar ( read, unpack )
import System.FilePath
import System.Directory
import Codec.Compression.GZip( decompress )
import Control.Monad

baseurl :: String
baseurl = "http://repos.mornfall.net/darcs/benchmark-repos/"

download :: String -> IO ()
download repo = do
  let Just url = parseURI $ baseurl  ++ repo ++ ".tgz"
  putStrLn $ "downloading and extracting: " ++ show url
  exist_dir <- doesDirectoryExist $ "repo" <.> repo
  exist_file <- doesFileExist $ "repo" <.> repo
  let go = do rsp' <- simpleHTTP (mkRequest GET url)
              rsp <- case rsp' of
                       Left e -> fail (show e)
                       Right x -> return x
              when (rspCode rsp /= (2, 0, 0)) $
                   fail ("download failed: " ++ rspReason rsp)
              createDirectory $ "repo" <.> repo
              bits <- getResponseBody rsp'
              let entries = Tar.read $ decompress bits
              Tar.unpack ("repo" <.> repo) entries

  if (exist_dir || exist_file)
       then putStrLn $ "repo" <.> repo ++ " already exists, skipping!"
       else go