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

View File

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

View File

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