summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2013-11-18 13:53:38 -0400
committerJoey Hess <joey@kitenet.net>2013-11-18 13:53:38 -0400
commit50036caa0a39aaa2fef393a20f67d1f9ea35684c (patch)
treeb1f2fd95ea7e320dac7bb4406b785cd422487a33
parent05355d4aab533d0c55666412b6c250e644bc7088 (diff)
downloadgit-repair-50036caa0a39aaa2fef393a20f67d1f9ea35684c.tar.gz
use debian/changelog for version
-rw-r--r--Build/Configure.hs6
-rw-r--r--Build/Version.hs69
2 files changed, 74 insertions, 1 deletions
diff --git a/Build/Configure.hs b/Build/Configure.hs
index 0c6245d..967738d 100644
--- a/Build/Configure.hs
+++ b/Build/Configure.hs
@@ -7,11 +7,13 @@ import Control.Applicative
import Control.Monad.IfElse
import Build.TestConfig
+import Build.Version
import Git.Version
tests :: [TestCase]
tests =
- [ TestCase "git" $ requireCmd "git" "git --version >/dev/null"
+ [ TestCase "version" getVersion
+ , TestCase "git" $ requireCmd "git" "git --version >/dev/null"
, TestCase "git version" getGitVersion
, TestCase "nice" $ testCmd "nice" "nice true >/dev/null"
]
@@ -25,3 +27,5 @@ run ts = do
args <- getArgs
config <- runTests ts
writeSysConfig config
+ whenM (isReleaseBuild) $
+ cabalSetup "github-repair.cabal"
diff --git a/Build/Version.hs b/Build/Version.hs
new file mode 100644
index 0000000..98e0dbf
--- /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 ++ ": "