lib: more version helpers, rename to HledgerBinaryInfo, silence warnings
This commit is contained in:
parent
b0959cb23d
commit
78baaee6c5
@ -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 = [
|
||||||
|
|||||||
@ -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 =
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user