From db748465a834fcfe09019c0b3aa4b9319594541f Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Thu, 17 Oct 2024 21:20:02 -1000 Subject: [PATCH] fix:pager: when the $PAGER is not in PATH, print instead of failing --- hledger-lib/Hledger/Utils/IO.hs | 16 ++++++++++++++-- hledger-lib/hledger-lib.cabal | 6 +++--- hledger-lib/package.yaml | 2 +- hledger/Hledger/Cli/DocFiles.hs | 1 + 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/hledger-lib/Hledger/Utils/IO.hs b/hledger-lib/Hledger/Utils/IO.hs index 06d165db2..72b9cfe27 100644 --- a/hledger-lib/Hledger/Utils/IO.hs +++ b/hledger-lib/Hledger/Utils/IO.hs @@ -114,7 +114,7 @@ import String.ANSI import System.Console.ANSI (Color(..),ColorIntensity(..), ConsoleLayer(..), SGR(..), hSupportsANSIColor, setSGRCode, getLayerColor) import System.Console.Terminal.Size (Window (Window), size) -import System.Directory (getHomeDirectory, getModificationTime) +import System.Directory (getHomeDirectory, getModificationTime, findExecutable) import System.Environment (getArgs, lookupEnv, setEnv) import System.FilePath (isRelative, ()) import "Glob" System.FilePath.Glob (glob) @@ -202,6 +202,7 @@ setupPager = do addR "LESS" addR "MORE" +-- related: Hledger.Cli.DocFiles.runPagerForTopic -- | Display the given text on the terminal, using the user's $PAGER if the text is taller -- than the current terminal and stdout is interactive and TERM is not "dumb"; -- except on Windows, where currently we don't attempt to use a pager. @@ -220,7 +221,18 @@ printOrPage' s = do dumbterm <- (== Just "dumb") <$> lookupEnv "TERM" -- avoid a pager crash with single-line output, https://github.com/pharpend/pager/issues/2 let singleline = not $ '\n' `elem` s - (if dumbterm || singleline + -- avoid a pager crash when PAGER is set to something not in PATH + mpagervar <- lookupEnv "PAGER" + badpager <- + case mpagervar of + Nothing -> return False + Just p -> do + mexe <- findExecutable p + case mexe of + Just _ -> return False + Nothing -> return True + + (if dumbterm || singleline || badpager then putStr else printOrPage . T.pack) s diff --git a/hledger-lib/hledger-lib.cabal b/hledger-lib/hledger-lib.cabal index 18b2daacb..cab8fb49c 100644 --- a/hledger-lib/hledger-lib.cabal +++ b/hledger-lib/hledger-lib.cabal @@ -138,7 +138,7 @@ library , containers >=0.5.9 , data-default >=0.5 , deepseq - , directory + , directory >=1.2.6.1 , doclayout >=0.3 && <0.6 , extra >=1.6.3 , file-embed >=0.0.10 @@ -202,7 +202,7 @@ test-suite doctest , containers >=0.5.9 , data-default >=0.5 , deepseq - , directory + , directory >=1.2.6.1 , doclayout >=0.3 && <0.6 , doctest >=0.18.1 , extra >=1.6.3 @@ -269,7 +269,7 @@ test-suite unittest , containers >=0.5.9 , data-default >=0.5 , deepseq - , directory + , directory >=1.2.6.1 , doclayout >=0.3 && <0.6 , extra >=1.6.3 , file-embed >=0.0.10 diff --git a/hledger-lib/package.yaml b/hledger-lib/package.yaml index f0aeed1d1..21a17b7cb 100644 --- a/hledger-lib/package.yaml +++ b/hledger-lib/package.yaml @@ -57,7 +57,7 @@ dependencies: - data-default >=0.5 - deepseq - Decimal >=0.5.1 -- directory +- directory >=1.2.6.1 - doclayout >=0.3 && <0.6 - file-embed >=0.0.10 - filepath diff --git a/hledger/Hledger/Cli/DocFiles.hs b/hledger/Hledger/Cli/DocFiles.hs index 007c32879..2ddfd6768 100644 --- a/hledger/Hledger/Cli/DocFiles.hs +++ b/hledger/Hledger/Cli/DocFiles.hs @@ -109,6 +109,7 @@ runInfoForTopic tool mtopic = -- less with any vertical whitespace squashed, case-insensitive searching, the $ regex metacharacter accessible as \$. less = "less -s -i --use-backslash" +-- related: Hledger.Utils.IO.pager -- | Display plain text help for this tool, scrolled to the given topic if any, using the users $PAGER or "less". -- When a topic is provided we always use less, ignoring $PAGER. runPagerForTopic :: Tool -> Maybe Topic -> IO ()