packages feed

cabalg-0.2.0: src/Main.hs

{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
import           Control.Applicative
import           Control.Arrow        (second)
import           Data.List.Split      (splitOn)
import           Data.Maybe           (catMaybes, fromMaybe, listToMaybe)
import           System.Directory     (getCurrentDirectory)
import           System.Environment
import           System.FilePath.Find
import           System.IO.Temp       (createTempDirectory)
import           System.Process       (callProcess)

import           Git


main :: IO ()
main = do
  (repos, args) <- reposAndArgs <$> getArgs
  cabalFiles :: [Maybe FilePath] <- mapM fetch repos
  cabalInstall (catMaybes cabalFiles) args


reposAndArgs :: [String] -> ([String], Maybe String)
reposAndArgs = second flags . span (/= "--")
 where
  flags [] = Nothing
  flags ["--"] = Nothing
  flags (_:xs) = Just $ unwords xs

fetch :: String -> IO (Maybe FilePath)
fetch urlAndMaybeRevision = do
  current_dir <- getCurrentDirectory
  let maybeRevision = listToMaybe . tail . splitOn "@" $ urlAndMaybeRevision
      url = head $ splitOn "@" urlAndMaybeRevision
  cabal_dir <- createTempDirectory current_dir ("cabalg_" ++ last (splitOn "/" url) ++ "X")
  case maybeRevision of
    Just revision -> cloneRevision url revision cabal_dir
    Nothing -> clone url cabal_dir
  listToMaybe <$> find always (extension ==? ".cabal") cabal_dir

cabalInstall :: [String] -> Maybe String -> IO ()
cabalInstall cabalFiles args = callProcess "cabal" $ "install" : cabalFiles ++ words (fromMaybe "" args)