cachix-0.1.1: src/Cachix/Client/NixVersion.hs
module Cachix.Client.NixVersion
( getNixVersion
, parseNixVersion
, NixVersion(..)
) where
import Protolude
import System.Process (readProcessWithExitCode)
import Data.Versions
import Data.Text as T
data NixVersion
= Nix20
| Nix201
| Nix1XX
deriving (Show, Eq)
getNixVersion :: IO (Either Text NixVersion)
getNixVersion = do
(exitcode, out, err) <- readProcessWithExitCode "nix-env" ["--version"] mempty
unless (err == "") $ putStrLn $ "nix-env stderr: " <> err
return $ case exitcode of
ExitFailure i -> Left $ "'nix-env --version' exited with " <> show i
ExitSuccess -> parseNixVersion $ toS out
parseNixVersion :: Text -> Either Text NixVersion
parseNixVersion output =
let
verStr = T.drop 14 $ T.strip output
err = "Couldn't parse 'nix-env --version' output: " <> output
in case versioning verStr of
Left _ -> Left err
Right ver | verStr == "" -> Left err
| ver < Ideal (SemVer 1 99 0 [] []) -> Right Nix1XX
| ver < Ideal (SemVer 2 0 1 [] []) -> Right Nix20
| otherwise -> Right Nix201