From 990924703f95aa991d4e451fc2db9bd3e0c76099 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 6 Oct 2013 17:48:38 -0400 Subject: [PATCH] factor out Build.Version --- Build/Configure.hs | 59 ++------------------------------------- Build/Version.hs | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 56 deletions(-) create mode 100644 Build/Version.hs diff --git a/Build/Configure.hs b/Build/Configure.hs index 9caff6c089..aae874d48b 100644 --- a/Build/Configure.hs +++ b/Build/Configure.hs @@ -13,9 +13,9 @@ import Control.Monad.IfElse import Data.Char import Build.TestConfig +import Build.Version import Utility.SafeCommand import Utility.Monad -import Utility.Exception import Utility.ExternalSHA import qualified Git.Version @@ -89,40 +89,6 @@ testCp k option = TestCase cmd $ testCmd k cmdline cmd = "cp " ++ option cmdline = cmd ++ " " ++ testFile ++ " " ++ testFile ++ ".new" -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 - getGitVersion :: Test getGitVersion = Config "gitversion" . StringConfig . show <$> Git.Version.installed @@ -131,25 +97,6 @@ getSshConnectionCaching :: Test getSshConnectionCaching = Config "sshconnectioncaching" . BoolConfig <$> boolSystem "sh" [Param "-c", Param "ssh -o ControlPersist=yes -V >/dev/null 2>/dev/null"] -{- Set up cabal file with version. -} -cabalSetup :: IO () -cabalSetup = do - version <- takeWhile (\c -> isDigit c || c == '.') - <$> getChangelogVersion - cabal <- readFile cabalfile - writeFile tmpcabalfile $ unlines $ - map (setfield "Version" version) $ - lines cabal - renameFile tmpcabalfile cabalfile - where - cabalfile = "git-annex.cabal" - tmpcabalfile = cabalfile++".tmp" - setfield field value s - | fullfield `isPrefixOf` s = fullfield ++ value - | otherwise = s - where - fullfield = field ++ ": " - setup :: IO () setup = do createDirectoryIfMissing True tmpDir @@ -167,8 +114,8 @@ run ts = do then writeSysConfig $ androidConfig config else writeSysConfig config cleanup - whenM (isReleaseBuild) $ - cabalSetup + whenM isReleaseBuild $ + cabalSetup "git-annex.cabal" {- Hard codes some settings to cross-compile for Android. -} androidConfig :: [Config] -> [Config] diff --git a/Build/Version.hs b/Build/Version.hs new file mode 100644 index 0000000000..98e0dbfd22 --- /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 ++ ": "