lib: more version helpers, rename to HledgerBinaryInfo, silence warnings

This commit is contained in:
Simon Michael 2025-04-25 09:36:38 -10:00
parent b0959cb23d
commit 78baaee6c5
4 changed files with 36 additions and 10 deletions

View File

@ -4,6 +4,7 @@
module Hledger.UI.UIOptions where
import Data.Default (def)
import Data.Either (fromRight)
import Data.List (intercalate)
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
@ -41,8 +42,8 @@ prognameandversion =
progname
packageversion
binaryinfo :: HledgerBinaryVersion
Right binaryinfo = parseHledgerVersion prognameandversion
binaryinfo :: HledgerBinaryInfo
binaryinfo = fromRight nullbinaryinfo $ parseHledgerVersion prognameandversion
uiflags = [

View File

@ -23,6 +23,7 @@ import Hledger.Web.Settings (defhost, defport, defbaseurl)
import qualified Data.Text as T
import Data.Char (toLower)
import Data.List (isPrefixOf)
import Data.Either (fromRight)
-- cf Hledger.Cli.Version
@ -52,8 +53,8 @@ prognameandversion =
progname
packageversion
binaryinfo :: HledgerBinaryVersion
Right binaryinfo = parseHledgerVersion prognameandversion
binaryinfo :: HledgerBinaryInfo
binaryinfo = fromRight nullbinaryinfo $ parseHledgerVersion prognameandversion
webflags :: [Flag RawOpts]
webflags =

View File

@ -139,8 +139,12 @@ prognameandversion =
progname
packageversion
binaryinfo :: HledgerBinaryVersion
binaryinfo :: HledgerBinaryInfo
Right binaryinfo = parseHledgerVersion prognameandversion
-- ui and web use nullbinaryinfo for a parse failure here to silence an inexhaustive pattern warning.
-- I can't reproduce that warning right now, so here I've stuck with the original approach,
-- which will force a compile error if prognameandversion is ever malformed, eg from unexpected
-- git output.
-- Common options.
-- keep synced: the docs macro in doc/common.m4

View File

@ -6,10 +6,13 @@ Version number-related utilities. See also the Makefile.
module Hledger.Cli.Version (
PackageVersionString,
Version,
nullversion,
toVersion,
showVersion,
isReleaseVersion,
HledgerVersionString,
HledgerBinaryVersion(..),
HledgerBinaryInfo(..),
nullbinaryinfo,
ProgramName,
GitHash,
ArchName,
@ -36,6 +39,7 @@ import Text.Megaparsec.Char
import qualified Text.Megaparsec.Char.Lexer as L
import Hledger.Data.Dates (parsedate)
import Data.Bifunctor
import qualified Data.List.NonEmpty as NE
-- | A Cabal/Hackage-compatible package version string: one or more dot-separated integers.
@ -44,6 +48,8 @@ type PackageVersionString = String
-- | The number parts parsed from a PackageVersionString.
type Version = NonEmpty Int
nullversion = NE.fromList [0]
showVersion :: Version -> String
showVersion = intercalate "." . map show . toList
@ -56,6 +62,9 @@ toVersion s =
then Nothing
else nonEmpty $ catMaybes parts
isReleaseVersion :: Version -> Bool
isReleaseVersion v = NE.last v < 98 -- .99 and possibly .98 are dev
-- | A hledger version string, as shown by hledger --version.
-- This can vary; some examples:
--
@ -88,7 +97,7 @@ type GitHash = String
-- and the build's git hash, the release date, and the binary's
-- intended operating machine and machine architecture, if we can detect these.
-- Also, a copy of the --version output from which it was parsed.
data HledgerBinaryVersion = HledgerBinaryVersion {
data HledgerBinaryInfo = HledgerBinaryInfo {
hbinVersionOutput :: String
, hbinProgramName :: ProgramName
, hbinPackageVersion :: Version
@ -99,6 +108,17 @@ data HledgerBinaryVersion = HledgerBinaryVersion {
, hbinArch :: Maybe ArchName
} deriving (Show, Eq)
nullbinaryinfo = HledgerBinaryInfo {
hbinVersionOutput = ""
, hbinProgramName = ""
, hbinPackageVersion = nullversion
, hbinPackageVersionStr = ""
, hbinGitHash = Nothing
, hbinReleaseDate = Nothing
, hbinOs = Nothing
, hbinArch = Nothing
}
type Parser = Parsec Void String
-- | Parse hledger's --version output.
@ -110,7 +130,7 @@ type Parser = Parsec Void String
-- >>> isRight $ parseHledgerVersion "hledger 1.42.99-g2288f5193-20250422, mac-aarch64"
-- True
--
parseHledgerVersion :: HledgerVersionString -> Either String HledgerBinaryVersion
parseHledgerVersion :: HledgerVersionString -> Either String HledgerBinaryInfo
parseHledgerVersion s =
case parse hledgerversionp "" s of
Left err -> Left $ errorBundlePretty err
@ -121,7 +141,7 @@ parseHledgerVersion s =
-- possibly followed by the binary's intended operating system and architecture
-- (see HledgerVersionString and versionStringWith).
-- The hbinVersionOutput field is left blank here; parseHledgerVersion sets it.
hledgerversionp :: Parser HledgerBinaryVersion
hledgerversionp :: Parser HledgerBinaryInfo
hledgerversionp = do
progName <- (<>) <$> string "hledger" <*> many (letterChar <|> char '-')
some $ char ' '
@ -144,7 +164,7 @@ hledgerversionp = do
Just osarch -> bimap (Just . reverse) (Just . reverse) $ second (drop 1) $ break (== '-') $ reverse osarch
many spaceChar
eof
return $ HledgerBinaryVersion
return $ HledgerBinaryInfo
{ hbinVersionOutput = ""
, hbinProgramName = progName
, hbinPackageVersion = pkgversion