69 lines
		
	
	
	
		
			2 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			69 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 Utility.Monad
 | 
						|
import Utility.Exception
 | 
						|
 | 
						|
type Version = String
 | 
						|
 | 
						|
{- 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 :: IO Version
 | 
						|
getVersion = do
 | 
						|
	changelogversion <- getChangelogVersion
 | 
						|
	ifM (isReleaseBuild)
 | 
						|
		( return changelogversion
 | 
						|
		, catchDefaultIO changelogversion $ do
 | 
						|
			let major = takeWhile (/= '.') changelogversion
 | 
						|
			autoversion <- takeWhile (\c -> isAlphaNum c || c == '-') <$> 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 ]
 | 
						|
		)
 | 
						|
	
 | 
						|
getChangelogVersion :: IO Version
 | 
						|
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 ++ ": "
 |