diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal index a9e108d1f7b..80bf3c5d5d3 100644 --- a/Cabal/Cabal.cabal +++ b/Cabal/Cabal.cabal @@ -29,6 +29,11 @@ source-repository head location: https://github.com/haskell/cabal/ subdir: Cabal +flag git-rev + description: include Git revision hash in version + default: False + manual: True + library default-language: Haskell2010 hs-source-dirs: src @@ -51,6 +56,10 @@ library else build-depends: unix >= 2.6.0.0 && < 2.9 + if flag(git-rev) + build-depends: githash ^>= 0.1.7.0 + cpp-options: -DGIT_REV + ghc-options: -Wall -fno-ignore-asserts diff --git a/Cabal/src/Distribution/Simple/Utils.hs b/Cabal/src/Distribution/Simple/Utils.hs index d51601e5c27..1456b28a6da 100644 --- a/Cabal/src/Distribution/Simple/Utils.hs +++ b/Cabal/src/Distribution/Simple/Utils.hs @@ -9,6 +9,9 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} +#ifdef GIT_REV +{-# LANGUAGE TemplateHaskell #-} +#endif ----------------------------------------------------------------------------- @@ -28,6 +31,7 @@ -- various directory and file functions that do extra logging. module Distribution.Simple.Utils ( cabalVersion + , cabalGitInfo -- * logging and errors , dieNoVerbosity @@ -287,6 +291,16 @@ import System.IO.Unsafe import qualified System.Process as Process import qualified Text.PrettyPrint as Disp +#ifdef GIT_REV +import Data.Either (isLeft) +import GitHash + ( giHash + , giBranch + , giCommitDate + , tGitInfoCwdTry + ) +#endif + -- We only get our own version number when we're building with ourselves cabalVersion :: Version #if defined(BOOTSTRAPPED_CABAL) @@ -297,6 +311,28 @@ cabalVersion = mkVersion [CABAL_VERSION] cabalVersion = mkVersion [3,0] --used when bootstrapping #endif +-- | +-- `Cabal` Git information. Only filled in if built in a Git tree in +-- developmnent mode and Template Haskell is available. +cabalGitInfo :: String +#ifdef GIT_REV +cabalGitInfo = concat [ "(commit " + , giHash' + , branchInfo + , ", " + , either (const "") giCommitDate gi' + , ")" + ] + where + gi' = $$tGitInfoCwdTry + giHash' = take 7 . either (const "") giHash $ gi' + branchInfo | isLeft gi' = "" + | either id giBranch gi' == "master" = "" + | otherwise = " on " <> either id giBranch gi' +#else +cabalGitInfo = "" +#endif + -- ---------------------------------------------------------------------------- -- Exception and logging utils diff --git a/cabal-install/cabal-install.cabal b/cabal-install/cabal-install.cabal index 68845e4b8b4..f5d251e035d 100644 --- a/cabal-install/cabal-install.cabal +++ b/cabal-install/cabal-install.cabal @@ -39,6 +39,11 @@ Flag lukko default: True manual: True +flag git-rev + description: include Git revision hash in version + default: False + manual: True + common warnings ghc-options: -Wall @@ -269,6 +274,9 @@ library if impl(ghc >=8.2) build-depends: process >= 1.6.15.0 + if flag(git-rev) + build-depends: githash ^>= 0.1.7.0 + cpp-options: -DGIT_REV executable cabal import: warnings, base-dep @@ -282,6 +290,9 @@ executable cabal if os(aix) extra-libraries: bsd + if flag(git-rev) + cpp-options: -DGIT_REV + build-depends: cabal-install diff --git a/cabal-install/src/Distribution/Client/Main.hs b/cabal-install/src/Distribution/Client/Main.hs index e6278a5ef9a..fcaba722143 100644 --- a/cabal-install/src/Distribution/Client/Main.hs +++ b/cabal-install/src/Distribution/Client/Main.hs @@ -173,7 +173,8 @@ import Distribution.Client.Utils , relaxEncodingErrors ) import Distribution.Client.Version - ( cabalInstallVersion + ( cabalInstallGitInfo + , cabalInstallVersion ) import Distribution.Package (packageId) @@ -227,7 +228,8 @@ import Distribution.Simple.Program import Distribution.Simple.Program.Db (reconfigurePrograms) import qualified Distribution.Simple.Setup as Cabal import Distribution.Simple.Utils - ( cabalVersion + ( cabalGitInfo + , cabalVersion , createDirectoryIfMissingVerbose , dieNoVerbosity , dieWithException @@ -413,9 +415,16 @@ mainWorker args = do putStrLn $ "cabal-install version " ++ display cabalInstallVersion + ++ " " + ++ cabalInstallGitInfo ++ "\ncompiled using version " ++ display cabalVersion ++ " of the Cabal library " + ++ cabalGitInfo' + where + cabalGitInfo' + | cabalGitInfo == cabalInstallGitInfo = "(in-tree)" + | otherwise = cabalGitInfo commands = map commandFromSpec commandSpecs commandSpecs = diff --git a/cabal-install/src/Distribution/Client/Version.hs b/cabal-install/src/Distribution/Client/Version.hs index f5c6bec510d..e50f4231090 100644 --- a/cabal-install/src/Distribution/Client/Version.hs +++ b/cabal-install/src/Distribution/Client/Version.hs @@ -1,13 +1,51 @@ +{-# LANGUAGE CPP #-} +#ifdef GIT_REV +{-# LANGUAGE TemplateHaskell #-} +#endif + -- | Provides the version number of @cabal-install@. module Distribution.Client.Version ( cabalInstallVersion + , cabalInstallGitInfo ) where import Distribution.Version import qualified Paths_cabal_install as PackageInfo +#ifdef GIT_REV +import Data.Either (isLeft) +import GitHash + ( giHash + , giBranch + , giCommitDate + , tGitInfoCwdTry + ) +#endif + -- | -- This value determines the output of `cabal-install --version`. cabalInstallVersion :: Version cabalInstallVersion = mkVersion' PackageInfo.version + +-- | +-- `cabal-install` Git information. Only filled in if built in a Git tree in +-- developmnent mode and Template Haskell is available. +cabalInstallGitInfo :: String +#ifdef GIT_REV +cabalInstallGitInfo = concat [ "(commit " + , giHash' + , branchInfo + , ", " + , either (const "") giCommitDate gi' + , ")" + ] + where + gi' = $$tGitInfoCwdTry + giHash' = take 7 . either (const "") giHash $ gi' + branchInfo | isLeft gi' = "" + | either id giBranch gi' == "master" = "" + | otherwise = " on " <> either id giBranch gi' +#else +cabalInstallGitInfo = "" +#endif diff --git a/cabal.project b/cabal.project index e368c280c99..a2075cfdc29 100644 --- a/cabal.project +++ b/cabal.project @@ -4,3 +4,11 @@ import: project-cabal/pkgs.config import: project-cabal/constraints.config tests: True + +-- if you are developing on a system without TH, use a `cabal.project.local` +-- to disable this +package cabal-install + flags: +git-rev + +package Cabal + flags: +git-rev diff --git a/cabal.release.project b/cabal.release.project index a321282a95e..31ef00994f7 100644 --- a/cabal.release.project +++ b/cabal.release.project @@ -3,3 +3,10 @@ import: project-cabal/pkgs/install.config import: project-cabal/pkgs/tests.config index-state: hackage.haskell.org 2024-09-06T14:16:40Z + +-- never include this or its TH dependency in a release! +package cabal-install + flags: -git-rev + +package Cabal + flags: -git-rev diff --git a/cabal.validate.project b/cabal.validate.project index 52c78411107..5075458c1b8 100644 --- a/cabal.validate.project +++ b/cabal.validate.project @@ -7,3 +7,8 @@ tests: True write-ghc-environment-files: never program-options ghc-options: -Werror + +-- if you are developing on a system without TH, use a `cabal.validate.project.local` +-- to disable this +package cabal-install + flags: +git-rev