From 83aa7324eb73fd80e31217f6ed8ee8a27016278d Mon Sep 17 00:00:00 2001 From: Stephen Morgan Date: Tue, 31 Aug 2021 00:12:13 +1000 Subject: [PATCH] dev: cli: Move Template Haskell to get git hash from Hledger.Cli.Version to Hledger.Cli. Since the git hash changes whenever any file in the repository changes, this means Hledger.Cli.Version needs to be recompiled all the time. Since it is at the bottom of the module hierarchy, this means that the whole hledger package needs to be recompiled. We instead move the TemplateHaskell splice to one of the top modules, so much less needs to be recompiled. Note: Ghc seems to be able to get out of most of the recompiling a lot of the time (due to caching?), but this makes things more reliable. --- hledger-ui/Hledger/UI/UIOptions.hs | 3 ++- hledger-web/Hledger/Web/WebOptions.hs | 2 +- hledger/Hledger/Cli.hs | 12 +++++++++++- hledger/Hledger/Cli/Commands.hs | 8 ++++---- hledger/Hledger/Cli/Main.hs | 3 +-- hledger/Hledger/Cli/Version.hs | 15 ++++----------- 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/hledger-ui/Hledger/UI/UIOptions.hs b/hledger-ui/Hledger/UI/UIOptions.hs index 584215737..da0c95e62 100644 --- a/hledger-ui/Hledger/UI/UIOptions.hs +++ b/hledger-ui/Hledger/UI/UIOptions.hs @@ -5,6 +5,7 @@ module Hledger.UI.UIOptions where + import Data.Default import Data.List (intercalate) import System.Environment @@ -25,7 +26,7 @@ progname :: String progname = "hledger-ui" prognameandversion :: String -prognameandversion = versionStringFor progname +prognameandversion = versionStringForProgname progname uiflags = [ -- flagNone ["debug-ui"] (setboolopt "rules-file") "run with no terminal output, showing console" diff --git a/hledger-web/Hledger/Web/WebOptions.hs b/hledger-web/Hledger/Web/WebOptions.hs index 5800b75a3..35a1ac348 100644 --- a/hledger-web/Hledger/Web/WebOptions.hs +++ b/hledger-web/Hledger/Web/WebOptions.hs @@ -31,7 +31,7 @@ progname :: String progname = "hledger-web" prognameandversion :: String -prognameandversion = versionStringFor progname +prognameandversion = versionStringForProgname progname webflags :: [Flag RawOpts] diff --git a/hledger/Hledger/Cli.hs b/hledger/Hledger/Cli.hs index dee9e185c..fea48cfee 100644 --- a/hledger/Hledger/Cli.hs +++ b/hledger/Hledger/Cli.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE TemplateHaskell #-} {-| Hledger.Cli re-exports the options, utilities and commands provided by @@ -14,9 +15,13 @@ module Hledger.Cli ( module Hledger.Cli.Utils, module Hledger.Cli.Version, module Hledger, - module System.Console.CmdArgs.Explicit + module System.Console.CmdArgs.Explicit, + prognameandversion, + versionStringForProgname ) where + +import GitHash (tGitInfoCwdTry) import System.Console.CmdArgs.Explicit hiding (Name) -- don't clash with hledger-ui import Hledger @@ -26,4 +31,9 @@ import Hledger.Cli.DocFiles import Hledger.Cli.Utils import Hledger.Cli.Version +-- | The program name and the best version information we can obtain +-- from git describe or build variables. +prognameandversion = versionStringForProgname progname +versionStringForProgname = versionStringFor $$tGitInfoCwdTry + -- unit tests (tests_Hledger_Cli) are defined in Hledger.Cli.Commands diff --git a/hledger/Hledger/Cli/Commands.hs b/hledger/Hledger/Cli/Commands.hs index bde4113ec..f2ef4d1a9 100644 --- a/hledger/Hledger/Cli/Commands.hs +++ b/hledger/Hledger/Cli/Commands.hs @@ -228,15 +228,15 @@ commandsFromCommandsList s = [w | c:l <- s, c `elem` [' ','+'], let w:_ = words l] knownCommands :: [String] -knownCommands = sort . commandsFromCommandsList $ commandsList prognameandversion [] +knownCommands = sort . commandsFromCommandsList . drop 1 $ commandsList progname [] -- progname will not be seen -- | Print the commands list, modifying the template above based on -- the currently available addons. Missing addons will be removed, and -- extra addons will be added under Misc. -printCommandsList :: [String] -> IO () -printCommandsList addonsFound = +printCommandsList :: String -> [String] -> IO () +printCommandsList progversion addonsFound = putStr . unlines . concatMap adjustline $ - commandsList prognameandversion (map ('+':) unknownCommandsFound) + commandsList progversion (map ('+':) unknownCommandsFound) where commandsFound = map (' ':) builtinCommandNames ++ map ('+':) addonsFound unknownCommandsFound = addonsFound \\ knownCommands diff --git a/hledger/Hledger/Cli/Main.hs b/hledger/Hledger/Cli/Main.hs index 9bcfcc0de..ea9d92207 100644 --- a/hledger/Hledger/Cli/Main.hs +++ b/hledger/Hledger/Cli/Main.hs @@ -169,7 +169,7 @@ main = do = putStrLn prognameandversion -- \| (null externalcmd) && "binary-filename" `inRawOpts` rawopts = putStrLn $ binaryfilename progname -- \| "--browse-args" `elem` args = System.Console.CmdArgs.Helper.execute "cmdargs-browser" mainmode' args >>= (putStr . show) - | isNullCommand = dbgIO "" "no command, showing commands list" >> printCommandsList addons + | isNullCommand = dbgIO "" "no command, showing commands list" >> printCommandsList prognameandversion addons | isBadCommand = badCommandError -- builtin commands @@ -265,4 +265,3 @@ flagstomove = inputflags ++ reportflags ++ helpflags noargflagstomove = concatMap flagNames $ filter ((==FlagNone).flagInfo) flagstomove reqargflagstomove = -- filter (/= "debug") $ concatMap flagNames $ filter ((==FlagReq ).flagInfo) flagstomove - diff --git a/hledger/Hledger/Cli/Version.hs b/hledger/Hledger/Cli/Version.hs index 102a4bd67..56aef68ae 100644 --- a/hledger/Hledger/Cli/Version.hs +++ b/hledger/Hledger/Cli/Version.hs @@ -1,5 +1,4 @@ {-# LANGUAGE CPP #-} -{-# LANGUAGE TemplateHaskell #-} {- Version number-related utilities. See also the Makefile. -} @@ -7,12 +6,11 @@ Version number-related utilities. See also the Makefile. module Hledger.Cli.Version ( packageversion, progname, - prognameandversion, versionStringFor, ) where -import GitHash (giDescribe, tGitInfoCwdTry) +import GitHash (GitInfo, giDescribe) import System.Info (os, arch) import Hledger.Utils @@ -56,11 +54,6 @@ buildversion = prettify . splitAtElement '.' $ packageversion ++ patchlevel progname :: String progname = "hledger" --- | The program name and the best version information we can obtain --- from git describe or build variables. -prognameandversion :: String -prognameandversion = versionStringFor progname - -- | Given a program name, make a version string consisting of: -- -- * the program name @@ -70,11 +63,11 @@ prognameandversion = versionStringFor progname -- * the platform (OS) name -- * the processor architecture name. -- -versionStringFor :: String -> String -versionStringFor progname = concat [ +versionStringFor :: Either String GitInfo -> String -> String +versionStringFor gitinfo progname = concat [ progname , " " - , either (const buildversion) giDescribe $$tGitInfoCwdTry + , either (const buildversion) giDescribe gitinfo , ", " , os' , "-"