madlang-4.0.2.15: app/Text/Madlibs/Packaging/Fetch.hs
{-# LANGUAGE OverloadedStrings #-}
module Text.Madlibs.Packaging.Fetch ( fetchGithub
, fetchPackages
, cleanPackages
, installVimPlugin
) where
import qualified Codec.Archive.Tar as Tar
import Codec.Archive.Zip (ZipOption (..), extractFilesFromArchive, toArchive)
import Codec.Compression.GZip (decompress)
import Control.Monad (unless)
import Data.Foldable (traverse_)
import Network.HTTP.Client hiding (decompress)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import System.Directory (getAppUserDataDirectory, removeFile, renameDirectory, withCurrentDirectory)
import System.Environment (getEnv)
import System.FilePath (pathSeparator, (</>))
import System.Info (os)
invalid :: String -> Bool
invalid = not . (pathSeparator `elem`)
-- | As an example, `vmchale/some-library` would be valid input.
fetchGithub :: String -> IO ()
fetchGithub s = unless (invalid s) $ do
putStrLn $ "fetching library at " ++ s
manager <- newManager tlsManagerSettings
initialRequest <- parseRequest $ "https://github.com/" ++ s ++ "/archive/master.zip"
response <- responseBody <$> httpLbs (initialRequest { method = "GET" }) manager
putStrLn "unpacking libraries..."
packageDir <- getAppUserDataDirectory "madlang"
let options = OptDestination packageDir
extractFilesFromArchive [options] (toArchive response)
let repoName = filter (/='/') . dropWhile (/='/') $ s
renameDirectory (packageDir ++ "/" ++ repoName ++ "-master") (packageDir ++ "/" ++ repoName)
installVimPlugin :: IO ()
installVimPlugin = do
putStrLn "fetching latest vim plugin..."
manager <- newManager defaultManagerSettings
initialRequest <- parseRequest "http://vmchale.com/static/vim.zip"
response <- responseBody <$> httpLbs (initialRequest { method = "GET" }) manager
putStrLn "installing locally..."
home <- getEnv "HOME"
let packageDir = if os /= "mingw32" then home ++ "/.vim" else home ++ "\\vimfiles"
let options = OptDestination packageDir
withCurrentDirectory packageDir $
extractFilesFromArchive [options] (toArchive response)
putStrLn "cleaning junk..."
traverse_ removeFile [ packageDir </> "TODO.md", packageDir </> "vim-screenshot.png", packageDir </> "README.md", packageDir </> "LICENSE" ]
-- TODO set remote package url flexibly
fetchPackages :: IO ()
fetchPackages = do
putStrLn "fetching libraries..."
manager <- newManager defaultManagerSettings
initialRequest <- parseRequest "http://vmchale.com/static/packages.tar.gz"
response <- responseBody <$> httpLbs (initialRequest { method = "GET" }) manager
putStrLn "unpacking libraries..."
packageDir <- getAppUserDataDirectory "madlang"
Tar.unpack packageDir . Tar.read . decompress $ response
cleanPackages :: IO ()
cleanPackages =
putStrLn "done."