git-annex/Build/Version.hs
Joey Hess a1b55056fc
Make Build/BuildVersion update embedded version number
This way, autobuilders can run it before building, in a tree where
git-annex was already built, and get the current git rev embedded in the
build.

Before, the version number only updated when the setup program was run,
which was up to cabal and not on every build.
2018-06-26 10:36:54 -04:00

69 lines
1.7 KiB
Haskell

{- Package version determination. -}
{-# OPTIONS_GHC -fno-warn-tabs #-}
module Build.Version where
import Data.List
import System.Environment
import Data.Char
import System.Process
import Control.Applicative
import Prelude
import Utility.Monad
import Utility.Exception
type Version = String
{- Set when making an official release. (Distribution vendors should set
- this too.) -}
isReleaseBuild :: IO Bool
isReleaseBuild = (== Just "1") <$> catchMaybeIO (getEnv "RELEASE_BUILD")
{- Version comes from the CHANGELOG, plus the git rev of the last commit.
- This works for autobuilds, ad-hoc builds, etc.
-
- If git or a git repo is not available, or something goes wrong,
- or this is a release build, just use the version from the CHANGELOG. -}
getVersion :: IO Version
getVersion = do
changelogversion <- getChangelogVersion
ifM (isReleaseBuild)
( return changelogversion
, catchDefaultIO changelogversion $ do
gitversion <- takeWhile (\c -> isAlphaNum c) <$> readProcess "sh"
[ "-c"
, "git log -n 1 --format=format:'%h'"
] ""
return $ if null gitversion
then changelogversion
else concat
[ changelogversion
, "-g"
, gitversion
]
)
getChangelogVersion :: IO Version
getChangelogVersion = do
changelog <- readFile "CHANGELOG"
let verline = takeWhile (/= '\n') changelog
return $ middle (words verline !! 1)
where
middle = drop 1 . init
writeVersion :: Version -> IO ()
writeVersion = writeFile "Build/Version" . body
where
body ver = unlines $ concat
[ header
, ["packageversion :: String"]
, ["packageversion = \"" ++ ver ++ "\""]
, footer
]
header = [
"{- Automatically generated. -}"
, ""
]
footer = []