elm2nix-0.1.0: src/Elm2Nix/FixedOutput.hs
{-# LANGUAGE OverloadedStrings #-}
module Elm2Nix.FixedOutput
( FixedDerivation(..)
, prefetch
) where
import System.Exit
import System.Process
import qualified Data.ByteString.Lazy.Char8 as BS
-- fixed output derivation metadata
data FixedDerivation = FixedDerivation
{ drvHash :: String -- ^ Computed sha256 hash
, drvPath :: String -- ^ Nix store path of the derivation
, drvUrl :: String -- ^ URL to the tarball
, drvName :: String
, drvVersion :: String
} deriving (Show, Eq)
-- | Use nix-prefetch-url to obtain resulting path and it's hash
-- | Partially taken from cabal2nix/src/Distribution/Nixpkgs/Fetch.hs
prefetch :: String -> String -> IO FixedDerivation
prefetch name version = do
(Nothing, Just stdoutH, _, processH) <-
createProcess (proc "nix-prefetch-url" args) { env = Nothing
, std_in = Inherit
, std_err = Inherit
, std_out = CreatePipe
}
exitCode <- waitForProcess processH
case exitCode of
ExitFailure _ -> error "nix-prefetch-url exited with non-zero"
ExitSuccess -> do
buf <- BS.hGetContents stdoutH
let ls = BS.lines buf
case length ls of
0 -> error "unknown nix-prefetch-url output"
2 -> return $ FixedDerivation (BS.unpack $ head ls)
(BS.unpack $ head $ tail ls)
url
name
version
_ -> error "unknown nix-prefetch-url output"
where
url :: String
url =
"https://github.com/"
++ name
++ "/archive/"
++ version
++ ".tar.gz"
args :: [String]
args = ["--print-path", url]