{-# LANGUAGE CPP             #-}
{-# LANGUAGE TemplateHaskell #-}
{-
Version number-related utilities. See also the Makefile.
-}

module Hledger.Cli.Version (
  progname,
  version,
  prognameandversion,
  versiondescription,
  binaryfilename,
)
where

#if MIN_VERSION_githash(0,1,4)
import GitHash (giDescribe, tGitInfoCwdTry)
#else
import GitHash (giHash, tGitInfoCwdTry)
#endif
import System.Info (os, arch)
import Hledger.Utils


-- package name and version from the cabal file
progname, version, prognameandversion :: String
progname :: String
progname = String
"hledger"
#ifdef VERSION
version :: String
version = VERSION
#else
version = "dev build"
#endif
prognameandversion :: String
prognameandversion = String -> String
versiondescription String
progname

-- developer build version strings include PATCHLEVEL (number of
-- patches since the last tag). If defined, it must be a number.
patchlevel :: String
#ifdef PATCHLEVEL
patchlevel = "." ++ show (PATCHLEVEL :: Int)
#else
patchlevel :: String
patchlevel = String
""
#endif

-- the package version plus patchlevel if specified
buildversion :: String
buildversion :: String
buildversion = [String] -> String
prettify ([String] -> String) -> (String -> [String]) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> String -> [String]
forall a. Eq a => a -> [a] -> [[a]]
splitAtElement Char
'.' (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
version String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
patchlevel
  where
    prettify :: [String] -> String
prettify (String
major:String
minor:String
bugfix:String
patches:[]) =
        String
major String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"." String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
minor String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
bugfix' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
patches'
      where
        bugfix' :: String
bugfix'  = if String
bugfix  String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"0" then String
"" else Char
'.' Char -> String -> String
forall a. a -> [a] -> [a]
: String
bugfix
        patches' :: String
patches' = if String
patches String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"0" then String
"" else Char
'+' Char -> String -> String
forall a. a -> [a] -> [a]
: String
patches
    prettify (String
major:String
minor:String
bugfix:[]) = [String] -> String
prettify [String
major,String
minor,String
bugfix,String
"0"]
    prettify (String
major:String
minor:[])        = [String] -> String
prettify [String
major,String
minor,String
"0",String
"0"]
    prettify (String
major:[])              = [String] -> String
prettify [String
major,String
"0",String
"0",String
"0"]
    prettify []                      = String -> String
forall a. String -> a
error' String
"VERSION is empty, please fix"  -- PARTIAL:
    prettify [String]
_                       = String -> String
forall a. String -> a
error' String
"VERSION has too many components, please fix"

-- | A string representing the version description of the current package
versiondescription :: String -> String
versiondescription :: String -> String
versiondescription String
progname = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
#if MIN_VERSION_githash(0,1,4)
    [String
progname, String
" ", (String -> String)
-> (GitInfo -> String) -> Either String GitInfo -> String
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> String -> String
forall a b. a -> b -> a
const String
buildversion) GitInfo -> String
giDescribe Either String GitInfo
gi, String
", ", String
os', String
"-", String
arch]
#else
    [progname, " ", buildversion, either (const "") (\x -> ", git revision " ++ giHash x) gi, ", ", os', "-", arch]
#endif
  where
    gi :: Either String GitInfo
gi = String
String -> Either String GitInfo
forall a b. a -> Either a b
$$tGitInfoCwdTry
    os' :: String
os' | String
os String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"darwin"  = String
"mac"
        | String
os String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"mingw32" = String
"windows"
        | Bool
otherwise       = String
os

-- | Given a program name, return a precise platform-specific executable
-- name suitable for naming downloadable binaries.  Can raise an error if
-- the version and patch level was not defined correctly at build time.
binaryfilename :: String -> String
binaryfilename :: String -> String
binaryfilename String
progname = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [String
progname, String
"-", String
buildversion, String
"-", String
os', String
"-", String
arch, String
suffix]
  where
    (String
os',String
suffix) | String
os String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"darwin"  = (String
"mac",String
"" :: String)
                 | String
os String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"mingw32" = (String
"windows",String
".exe")
                 | Bool
otherwise       = (String
os,String
"")