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

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

import Distribution.Version

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` Git information. Only filled in if built in a Git tree in
-- developmnent 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] -> [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]
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'
    branchInfo :: [Char]
branchInfo | Either [Char] GitInfo -> Bool
forall a b. Either a b -> Bool
isLeft Either [Char] GitInfo
gi' = [Char]
""
               | ([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' [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] -> [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'
#else
cabalInstallGitInfo = ""
#endif