70 lines
2 KiB
Haskell
70 lines
2 KiB
Haskell
|
{- Package version determination, for configure script. -}
|
||
|
|
||
|
module Build.Version where
|
||
|
|
||
|
import Data.Maybe
|
||
|
import Control.Applicative
|
||
|
import Data.List
|
||
|
import System.Environment
|
||
|
import System.Directory
|
||
|
import Data.Char
|
||
|
import System.Process
|
||
|
|
||
|
import Build.TestConfig
|
||
|
import Utility.Monad
|
||
|
import Utility.Exception
|
||
|
|
||
|
{- Set when making an official release. (Distribution vendors should set
|
||
|
- this too.) -}
|
||
|
isReleaseBuild :: IO Bool
|
||
|
isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD")
|
||
|
|
||
|
{- Version is usually based on the major version from the changelog,
|
||
|
- plus the date of the last commit, plus the git rev of that 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 :: Test
|
||
|
getVersion = do
|
||
|
changelogversion <- getChangelogVersion
|
||
|
version <- ifM (isReleaseBuild)
|
||
|
( return changelogversion
|
||
|
, catchDefaultIO changelogversion $ do
|
||
|
let major = takeWhile (/= '.') changelogversion
|
||
|
autoversion <- readProcess "sh"
|
||
|
[ "-c"
|
||
|
, "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'"
|
||
|
] ""
|
||
|
if null autoversion
|
||
|
then return changelogversion
|
||
|
else return $ concat [ major, ".", autoversion ]
|
||
|
)
|
||
|
return $ Config "packageversion" (StringConfig version)
|
||
|
|
||
|
getChangelogVersion :: IO String
|
||
|
getChangelogVersion = do
|
||
|
changelog <- readFile "debian/changelog"
|
||
|
let verline = takeWhile (/= '\n') changelog
|
||
|
return $ middle (words verline !! 1)
|
||
|
where
|
||
|
middle = drop 1 . init
|
||
|
|
||
|
{- Set up cabal file with version. -}
|
||
|
cabalSetup :: FilePath -> IO ()
|
||
|
cabalSetup cabalfile = do
|
||
|
version <- takeWhile (\c -> isDigit c || c == '.')
|
||
|
<$> getChangelogVersion
|
||
|
cabal <- readFile cabalfile
|
||
|
writeFile tmpcabalfile $ unlines $
|
||
|
map (setfield "Version" version) $
|
||
|
lines cabal
|
||
|
renameFile tmpcabalfile cabalfile
|
||
|
where
|
||
|
tmpcabalfile = cabalfile++".tmp"
|
||
|
setfield field value s
|
||
|
| fullfield `isPrefixOf` s = fullfield ++ value
|
||
|
| otherwise = s
|
||
|
where
|
||
|
fullfield = field ++ ": "
|