diff --git a/.gitignore b/.gitignore index 03cb059e6a..16314abf76 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ Setup tmp test Build/SysConfig -Build/SysConfig.hs +Build/Version Build/InstallDesktopFile Build/EvilSplicer Build/Standalone diff --git a/Build/BuildVersion.hs b/Build/BuildVersion.hs index 0093f5b5b1..5ae1c4cef7 100644 --- a/Build/BuildVersion.hs +++ b/Build/BuildVersion.hs @@ -1,6 +1,12 @@ -{- Outputs the version of git-annex that was built, for use by - - autobuilders. Note that this includes the git rev. -} +{- For use by autobuilders, this outputs the version of git-annex that + - is being built, and also updates the Build/Version file so the build + - will report the right version, including the current git rev. -} + +{-# OPTIONS_GHC -fno-warn-tabs #-} import Build.Version -main = putStr =<< getVersion +main = do + ver <- getVersion + writeVersion ver + putStr ver diff --git a/Build/Configure.hs b/Build/Configure.hs index 31d7dcafa4..c490148f50 100644 --- a/Build/Configure.hs +++ b/Build/Configure.hs @@ -1,4 +1,4 @@ -{- Checks system configuration and generates SysConfig. -} +{- Checks system configuration and generates Build/SysConfig and Build/Version. -} {-# OPTIONS_GHC -fno-warn-tabs #-} @@ -12,15 +12,13 @@ import Utility.Env.Basic import qualified Git.Version import Utility.Directory -import Control.Monad.IfElse import Control.Monad import Control.Applicative import Prelude tests :: [TestCase] tests = - [ TestCase "version" (Config "packageversion" . StringConfig <$> getVersion) - , TestCase "UPGRADE_LOCATION" getUpgradeLocation + [ TestCase "UPGRADE_LOCATION" getUpgradeLocation , TestCase "git" $ testCmd "git" "git --version >/dev/null" , TestCase "git version" getGitVersion , testCp "cp_a" "-a" @@ -120,9 +118,8 @@ run ts = do case v of Just "Android" -> writeSysConfig $ androidConfig config _ -> writeSysConfig config + writeVersion =<< getVersion cleanup - 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 index d39a0fe08b..69752a0897 100644 --- a/Build/Version.hs +++ b/Build/Version.hs @@ -1,4 +1,4 @@ -{- Package version determination, for configure script. -} +{- Package version determination. -} {-# OPTIONS_GHC -fno-warn-tabs #-} @@ -13,7 +13,6 @@ import Prelude import Utility.Monad import Utility.Exception -import Utility.Directory type Version = String @@ -22,26 +21,28 @@ type Version = String isReleaseBuild :: IO Bool isReleaseBuild = (== Just "1") <$> 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. +{- 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. -} + - 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" + gitversion <- takeWhile (\c -> isAlphaNum c) <$> readProcess "sh" [ "-c" - , "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'" + , "git log -n 1 --format=format:'%h'" ] "" - if null autoversion - then return changelogversion - else return $ concat [ major, ".", autoversion ] + return $ if null gitversion + then changelogversion + else concat + [ changelogversion + , "-g" + , gitversion + ] ) getChangelogVersion :: IO Version @@ -52,20 +53,17 @@ getChangelogVersion = do 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 +writeVersion :: Version -> IO () +writeVersion = writeFile "Build/Version" . body where - tmpcabalfile = cabalfile++".tmp" - setfield field value s - | fullfield `isPrefixOf` s = fullfield ++ value - | otherwise = s - where - fullfield = field ++ ": " + body ver = unlines $ concat + [ header + , ["packageversion :: String"] + , ["packageversion = \"" ++ ver ++ "\""] + , footer + ] + header = [ + "{- Automatically generated. -}" + , "" + ] + footer = [] diff --git a/BuildInfo.hs b/BuildInfo.hs index 40aa2fdfb4..465ac372ef 100644 --- a/BuildInfo.hs +++ b/BuildInfo.hs @@ -12,3 +12,5 @@ module BuildInfo where -- This file is generated by the configure program with the results of its -- probing. #include "Build/SysConfig" +-- This file is automatically generated from the CHANGELOG version +#include "Build/Version" diff --git a/Makefile b/Makefile index 9f4c122c3c..c5773c5c71 100644 --- a/Makefile +++ b/Makefile @@ -108,7 +108,7 @@ docs: mans clean: if [ "$(BUILDER)" != ./Setup ] && [ "$(BUILDER)" != cabal ]; then $(BUILDER) clean; fi rm -rf tmp dist git-annex $(mans) configure *.tix .hpc \ - doc/.ikiwiki html dist tags Build/SysConfig \ + doc/.ikiwiki html dist tags Build/SysConfig Build/Version \ Setup Build/InstallDesktopFile Build/EvilSplicer \ Build/Standalone Build/OSXMkLibs Build/LinuxMkLibs \ Build/DistributionUpdate Build/BuildVersion Build/MakeMans \ diff --git a/standalone/windows/build.sh b/standalone/windows/build.sh index b0e6bdd4ff..123dc7ddf9 100755 --- a/standalone/windows/build.sh +++ b/standalone/windows/build.sh @@ -63,6 +63,11 @@ getextra rsync.exe 85cb7a4d16d274fcf8069b39042965ad26abd6aa #stack upgrade --git stack --version +# Update version info for git rev being built. +mkdir -p dist +stack ghc --stack-yaml stack-windows.yaml --no-haddock Build/BuildVersion.hs +./Build/BuildVersion > dist/build-version + # Build git-annex stack setup --stack-yaml stack-windows.yaml stack install -j 1 --stack-yaml stack-windows.yaml --no-haddock \ @@ -73,10 +78,6 @@ withcygpreferred stack ghc --stack-yaml stack-windows.yaml --no-haddock \ --package nsis Build/NullSoftInstaller.hs ./Build/NullSoftInstaller -mkdir -p dist -stack ghc --stack-yaml stack-windows.yaml --no-haddock Build/BuildVersion.hs -./Build/BuildVersion > dist/build-version - # Test git-annex # The test is run in c:/WINDOWS/Temp, because running it in the autobuilder # directory runs afoul of Windows's short PATH_MAX.