packages feed

cabalg-0.2.2: src/Main.hs

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

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
  currentDir <- getCurrentDirectory
  cabalDir <- (currentDir </>) . addName <$> genstr
  createDirectory cabalDir
  case maybeRevision of
    Just revision -> cloneRevision url revision cabalDir
    Nothing -> clone url cabalDir
  listToMaybe <$> find always (extension ==? ".cabal" &&? depth ==? 1) cabalDir
    where
      maybeRevision = listToMaybe . tail . splitOn "@" $ urlAndMaybeRevision
      url = head $ splitOn "@" urlAndMaybeRevision
      genstr = liftM (take 10 . randomRs ('a','z')) newStdGen
      addName = (("cabalg_" ++ last (splitOn "/" url)) ++) . ('_' :)

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