module Stack2nix.External.Cabal2nix (
cabal2nix
) where
import Data.List (stripPrefix, takeWhile)
import Data.Maybe (fromMaybe)
import Data.Monoid ((<>))
import Data.Text (Text, unpack)
import Stack2nix.External.Util (runCmd)
import System.FilePath ((</>))
cabal2nix :: FilePath -> Maybe Text -> Maybe FilePath -> Maybe FilePath -> IO ()
cabal2nix uri commit subpath odir = do
result <- runCmd exe (args $ fromMaybe "." subpath)
case result of
Right stdout ->
let basename = pname stdout <> ".nix"
fname = maybe basename (</> basename) odir
in
writeFile fname stdout
Left stderr -> error stderr
where
exe = "cabal2nix"
args :: FilePath -> [String]
args dir = concat
[ maybe [] (\c -> ["--revision", unpack c]) commit
, ["--subpath", dir]
, ["--no-check", "--no-haddock"]
, [uri]
]
pname :: String -> String
pname = pname' . lines
pname' :: [String] -> String
pname' [] = error "nix expression generated by cabal2nix is missing the 'pname' attr"
pname' (x:xs) =
case stripPrefix " pname = \"" x of
Just x' -> takeWhile (/= '"') x'
Nothing -> pname' xs