diff options
author | Joey Hess <joey@kitenet.net> | 2013-10-06 17:48:38 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-10-06 17:48:38 -0400 |
commit | e64c2e0929ee56ad44d40689d78f1f6b650d3cf9 (patch) | |
tree | 32f199e70e3779ffabbd394cc847d6ef42cdd766 /Build/Version.hs | |
parent | 55011adebbf792a99f7d5bd6014726324eb32386 (diff) |
factor out Build.Version
Diffstat (limited to 'Build/Version.hs')
-rw-r--r-- | Build/Version.hs | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/Build/Version.hs b/Build/Version.hs new file mode 100644 index 000000000..98e0dbfd2 --- /dev/null +++ b/Build/Version.hs @@ -0,0 +1,69 @@ +{- 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 ++ ": " |