module Scion.PersistentBrowser.FileUtil where
import Control.Applicative
import qualified Codec.Archive.Tar as Tar
import qualified Codec.Compression.GZip as GZip
import Control.Exception (bracket)
import qualified Data.ByteString as SBS
import qualified Data.ByteString.Lazy as LBS
import System.Directory
import System.FilePath
import Scion.PersistentBrowser.TempFile
import Network.HTTP.Conduit
filterDots :: [FilePath] -> [FilePath]
filterDots = filter (\d -> d /= "." && d /= "..")
downloadFileLazy :: String -> IO LBS.ByteString
downloadFileLazy = simpleHttp
downloadFileStrict :: String -> IO SBS.ByteString
downloadFileStrict = (LBS.toStrict <$>) . downloadFileLazy
downloadHoogleFile :: Manager -> String -> IO (Maybe SBS.ByteString)
downloadHoogleFile mgr url = do
req <- parseUrl url
getHoogleFile <$> LBS.toStrict <$> responseBody <$> httpLbs req mgr
getHoogleFile :: SBS.ByteString -> Maybe SBS.ByteString
getHoogleFile response=if "-- Hoogle documentation" `SBS.isPrefixOf` response
then Just response
else Nothing
unTarGzip :: LBS.ByteString -> FilePath -> IO ()
unTarGzip cnts folder = let ungzip = GZip.decompress cnts
entries = Tar.read ungzip
in do createDirectories entries
Tar.unpack folder entries
where createDirectories Tar.Done = return ()
createDirectories (Tar.Fail _) = return ()
createDirectories (Tar.Next e es) =
case Tar.entryContent e of
Tar.NormalFile _ _ -> do let dir = folder </> takeDirectory (Tar.entryPath e)
createDirectoryIfMissing True dir
createDirectories es
Tar.Directory -> do let dir = folder </> Tar.entryPath e
createDirectoryIfMissing True dir
createDirectories es
_ -> createDirectories es
withWorkingDirectory :: FilePath -> IO a -> IO a
withWorkingDirectory dir action =
bracket getCurrentDirectory setCurrentDirectory (\ _ -> setCurrentDirectory dir >> action)
withTemporaryDirectory :: (FilePath -> IO a) -> IO a
withTemporaryDirectory f =
do home <- getTemporaryDirectory
bracket (createTempDirectory home ".scion")
removeDirectoryRecursive
f