{-# LANGUAGE CPP #-}
#ifdef GIT_REV
{-# LANGUAGE TemplateHaskell #-}
#endif

-- | Provides the version number of @cabal-install@.
module Distribution.Client.Version
  ( cabalInstallVersion
  , cabalInstallGitInfo
  ) where

import Data.List (intercalate)
import qualified Data.Version as DV
import qualified Distribution.Compat.SysInfo as SIC
import Distribution.Version
import qualified System.Info as SI

import qualified Paths_cabal_install as PackageInfo

#ifdef GIT_REV
import Data.Either (isLeft)
import GitHash
  ( giHash
  , giBranch
  , giCommitDate
  , tGitInfoCwdTry
  )
#endif

-- |
-- This value determines the output of `cabal-install --version`.
cabalInstallVersion :: Version
cabalInstallVersion :: Version
cabalInstallVersion = Version -> Version
mkVersion' Version
PackageInfo.version

-- |
-- `cabal-install` compiler information.
cabalInstallCompilerInfo :: String
cabalInstallCompilerInfo :: [Char]
cabalInstallCompilerInfo =
  [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [ [Char]
SI.compilerName
    , [Char]
" "
    , [Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"." ((Int -> [Char]) -> [Int] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map Int -> [Char]
forall a. Show a => a -> [Char]
show (Version -> [Int]
DV.versionBranch Version
SIC.fullCompilerVersion))
    , [Char]
" on "
    , [Char]
SI.os
    , [Char]
" "
    , [Char]
SI.arch
    ]

-- |
-- `cabal-install` Git information. Only filled in if built in a Git tree in
-- development mode and Template Haskell is available.
cabalInstallGitInfo :: String
#ifdef GIT_REV
cabalInstallGitInfo :: [Char]
cabalInstallGitInfo = if [Char]
giHash' [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
""
                        then [Char]
""
                        else [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ [Char]
"(commit "
                                    , [Char]
giHash'
                                    , [Char]
branchInfo
                                    , ([Char] -> [Char])
-> (GitInfo -> [Char]) -> Either [Char] GitInfo -> [Char]
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ([Char] -> [Char] -> [Char]
forall a b. a -> b -> a
const [Char]
"") (([Char]
", " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++) ([Char] -> [Char]) -> (GitInfo -> [Char]) -> GitInfo -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GitInfo -> [Char]
giCommitDate) Either [Char] GitInfo
gi'
                                    , [Char]
")"
                                    ]
  where
    gi' :: Either [Char] GitInfo
gi' = $$Bool
Int
[Char]
[[Char]]
[Char]
-> [Char]
-> Bool
-> [Char]
-> Int
-> [[Char]]
-> [Char]
-> [Char]
-> [Char]
-> GitInfo
GitInfo -> Either [Char] GitInfo
forall a b. b -> Either a b
tGitInfoCwdTry
    giHash' :: [Char]
giHash' = Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
take Int
7 ([Char] -> [Char])
-> (Either [Char] GitInfo -> [Char])
-> Either [Char] GitInfo
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char] -> [Char])
-> (GitInfo -> [Char]) -> Either [Char] GitInfo -> [Char]
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ([Char] -> [Char] -> [Char]
forall a b. a -> b -> a
const [Char]
"") GitInfo -> [Char]
giHash (Either [Char] GitInfo -> [Char])
-> Either [Char] GitInfo -> [Char]
forall a b. (a -> b) -> a -> b
$ Either [Char] GitInfo
gi'
    branch :: [Char]
branch = ([Char] -> [Char])
-> (GitInfo -> [Char]) -> Either [Char] GitInfo -> [Char]
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either [Char] -> [Char]
forall a. a -> a
id GitInfo -> [Char]
giBranch Either [Char] GitInfo
gi'
    branchInfo :: [Char]
branchInfo | Either [Char] GitInfo -> Bool
forall a b. Either a b -> Bool
isLeft Either [Char] GitInfo
gi' = [Char]
""
               | [Char]
branch [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"master" = [Char]
""
               | Bool
otherwise = [Char]
" on " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
branch
#else
cabalInstallGitInfo = ""
#endif