From c5f8444627da6ce5ac43e5068c5274661fec1fa9 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Wed, 29 May 2024 14:34:23 -1000 Subject: [PATCH] feat: hledger's tldr pages are now built in, accessible via --tldr And a few cleanups/fixes related to flag processing. The help flags are now listed in order of precedence. --- hledger-ui/Hledger/UI/Main.hs | 1 + hledger-ui/Hledger/UI/UIOptions.hs | 5 +- hledger-web/Hledger/Web/Main.hs | 3 +- hledger-web/Hledger/Web/WebOptions.hs | 5 +- hledger/Hledger/Cli.hs | 67 ++++++++-------- hledger/Hledger/Cli/CliOptions.hs | 9 ++- hledger/Hledger/Cli/DocFiles.hs | 78 ++++++++++++------- hledger/embeddedfiles/DEMOS.md | 58 ++++++++++++++ hledger/embeddedfiles/README | 4 +- hledger/embeddedfiles/README.md | 1 + hledger/embeddedfiles/hledger-accounts.md | 1 + hledger/embeddedfiles/hledger-add.md | 1 + hledger/embeddedfiles/hledger-aregister.md | 1 + hledger/embeddedfiles/hledger-balance.md | 1 + hledger/embeddedfiles/hledger-balancesheet.md | 1 + hledger/embeddedfiles/hledger-import.md | 1 + .../embeddedfiles/hledger-incomestatement.md | 1 + hledger/embeddedfiles/hledger-journal.md | 1 + hledger/embeddedfiles/hledger-print.md | 1 + hledger/embeddedfiles/hledger-ui.md | 1 + hledger/embeddedfiles/hledger-web.md | 1 + hledger/embeddedfiles/hledger.md | 1 + hledger/package.yaml | 23 ++++-- hledger/test/cli/cli.test | 11 ++- 24 files changed, 200 insertions(+), 77 deletions(-) create mode 100644 hledger/embeddedfiles/DEMOS.md create mode 120000 hledger/embeddedfiles/README.md create mode 120000 hledger/embeddedfiles/hledger-accounts.md create mode 120000 hledger/embeddedfiles/hledger-add.md create mode 120000 hledger/embeddedfiles/hledger-aregister.md create mode 120000 hledger/embeddedfiles/hledger-balance.md create mode 120000 hledger/embeddedfiles/hledger-balancesheet.md create mode 120000 hledger/embeddedfiles/hledger-import.md create mode 120000 hledger/embeddedfiles/hledger-incomestatement.md create mode 120000 hledger/embeddedfiles/hledger-journal.md create mode 120000 hledger/embeddedfiles/hledger-print.md create mode 120000 hledger/embeddedfiles/hledger-ui.md create mode 120000 hledger/embeddedfiles/hledger-web.md create mode 120000 hledger/embeddedfiles/hledger.md diff --git a/hledger-ui/Hledger/UI/Main.hs b/hledger-ui/Hledger/UI/Main.hs index a338cbc26..de1d4af5d 100644 --- a/hledger-ui/Hledger/UI/Main.hs +++ b/hledger-ui/Hledger/UI/Main.hs @@ -76,6 +76,7 @@ hledgerUiMain = withGhcDebug' $ withProgName "hledger-ui.log" $ do -- force Hle case True of _ | boolopt "help" rawopts -> pager $ showModeUsage uimode ++ "\n" + _ | boolopt "tldr" rawopts -> runTldrForPage "hledger-ui" _ | boolopt "info" rawopts -> runInfoForTopic "hledger-ui" Nothing _ | boolopt "man" rawopts -> runManForTopic "hledger-ui" Nothing _ | boolopt "version" rawopts -> putStrLn prognameandversion diff --git a/hledger-ui/Hledger/UI/UIOptions.hs b/hledger-ui/Hledger/UI/UIOptions.hs index 8bee776ff..2827f348a 100644 --- a/hledger-ui/Hledger/UI/UIOptions.hs +++ b/hledger-ui/Hledger/UI/UIOptions.hs @@ -89,10 +89,11 @@ uimode = uihelpflags :: [Flag RawOpts] uihelpflags = [ - flagNone ["version"] (setboolopt "version") "show version information" - ,flagNone ["help","h"] (setboolopt "help") "show command line help" + flagNone ["help","h"] (setboolopt "help") "show command line help" + ,flagNone ["tldr"] (setboolopt "tldr") "show command examples with tldr" ,flagNone ["info"] (setboolopt "info") "show the hledger-ui manual with info" ,flagNone ["man"] (setboolopt "man") "show the hledger-ui manual with man" + ,flagNone ["version"] (setboolopt "version") "show version information" ] -- hledger-ui options, used in hledger-ui and above diff --git a/hledger-web/Hledger/Web/Main.hs b/hledger-web/Hledger/Web/Main.hs index 3353b2cf7..6f5041c09 100644 --- a/hledger-web/Hledger/Web/Main.hs +++ b/hledger-web/Hledger/Web/Main.hs @@ -21,7 +21,7 @@ import Network.Wai.Handler.Warp (runSettings, runSettingsSocket, defaultSettings import Network.Wai.Handler.Launch (runHostPortFullUrl) import System.Directory (removeFile) import System.Environment ( getArgs, withArgs ) -import System.Exit (exitSuccess, exitFailure) +import System.Exit (exitFailure) import System.IO (hFlush, stdout) import System.PosixCompat.Files (getFileStatus, isSocket) import Text.Printf (printf) @@ -56,6 +56,7 @@ hledgerWebMain = withGhcDebug' $ do when (debug_ > 0) $ printf "%s\n" prognameandversion >> printf "opts: %s\n" (show wopts) if | boolopt "help" rawopts_ -> pager $ showModeUsage webmode ++ "\n" + | boolopt "tldr" rawopts_ -> runTldrForPage "hledger-web" | boolopt "info" rawopts_ -> runInfoForTopic "hledger-web" Nothing | boolopt "man" rawopts_ -> runManForTopic "hledger-web" Nothing | boolopt "version" rawopts_ -> putStrLn prognameandversion diff --git a/hledger-web/Hledger/Web/WebOptions.hs b/hledger-web/Hledger/Web/WebOptions.hs index bf2713412..6f06e1fb1 100644 --- a/hledger-web/Hledger/Web/WebOptions.hs +++ b/hledger-web/Hledger/Web/WebOptions.hs @@ -120,10 +120,11 @@ webmode = webhelpflags :: [Flag RawOpts] webhelpflags = [ - flagNone ["version"] (setboolopt "version") "show version information" - ,flagNone ["help","h"] (setboolopt "help") "show command line help" + flagNone ["help","h"] (setboolopt "help") "show command line help" + ,flagNone ["tldr"] (setboolopt "tldr") "show command examples with tldr" ,flagNone ["info"] (setboolopt "info") "show the hledger-web manual with info" ,flagNone ["man"] (setboolopt "man") "show the hledger-web manual with man" + ,flagNone ["version"] (setboolopt "version") "show version information" ] -- hledger-web options, used in hledger-web and above diff --git a/hledger/Hledger/Cli.hs b/hledger/Hledger/Cli.hs index f3fc264fc..0a33ae4df 100644 --- a/hledger/Hledger/Cli.hs +++ b/hledger/Hledger/Cli.hs @@ -188,23 +188,25 @@ main = withGhcDebug' $ do opts' <- argsToCliOpts args addons let opts = opts'{progstarttime_=starttime} - -- select an action and run it. + -- select an action and prepare to run it let - cmd = command_ opts -- the full matched internal or external command name, if any - isInternalCommand = cmd `elem` builtinCommandNames -- not (null cmd) && not (cmd `elem` addons) - isExternalCommand = not (null cmd) && cmd `elem` addons -- probably - isBadCommand = not (null rawcmd) && null cmd - hasVersion = ("--version" `elem`) - printUsage = pager $ showModeUsage (mainmode addons) ++ "\n" - badCommandError = error' ("command "++rawcmd++" is not recognized, run with no command to see a list") >> exitFailure -- PARTIAL: - hasHelpFlag args1 = any (`elem` args1) ["-h","--help"] - hasManFlag args1 = (`elem` args1) "--man" - hasInfoFlag args1 = (`elem` args1) "--info" + cmd = command_ opts -- the full matched internal or external command name, if any + isInternalCommand = cmd `elem` builtinCommandNames -- not (null cmd) && not (cmd `elem` addons) + isExternalCommand = not (null cmd) && cmd `elem` addons -- probably + isBadCommand = not (null rawcmd) && null cmd + printUsage = pager $ showModeUsage (mainmode addons) ++ "\n" + badCommandError = error' ("command "++rawcmd++" is not recognized, run with no command to see a list") >> exitFailure -- PARTIAL: + helpFlag = boolopt "help" $ rawopts_ opts + tldrFlag = boolopt "tldr" $ rawopts_ opts + infoFlag = boolopt "info" $ rawopts_ opts + manFlag = boolopt "man" $ rawopts_ opts + versionFlag = boolopt "version" $ rawopts_ opts f `orShowHelp` mode1 - | hasHelpFlag args = pager $ showModeUsage mode1 ++ "\n" - | hasInfoFlag args = runInfoForTopic "hledger" (headMay $ modeNames mode1) - | hasManFlag args = runManForTopic "hledger" (headMay $ modeNames mode1) - | otherwise = f + | helpFlag = pager $ showModeUsage mode1 ++ "\n" + | tldrFlag = runTldrForPage $ maybe "hledger" (("hledger-"<>)) $ headMay $ modeNames mode1 + | infoFlag = runInfoForTopic "hledger" (headMay $ modeNames mode1) + | manFlag = runManForTopic "hledger" (headMay $ modeNames mode1) + | otherwise = f -- where -- lastdocflag dbgIO "processed opts" opts @@ -217,29 +219,26 @@ main = withGhcDebug' $ do dbgIO "interval from opts" (interval_ . _rsReportOpts $ reportspec_ opts) dbgIO "query from opts & args" (_rsQuery $ reportspec_ opts) let - journallesserror = error $ cmd++" tried to read the journal but is not supposed to" runHledgerCommand - -- high priority flags and situations. -h, then --help, then --info are highest priority. - | isNullCommand && hasHelpFlag args = dbgIO "" "-h/--help with no command, showing general help" >> printUsage - | isNullCommand && hasInfoFlag args = dbgIO "" "--info with no command, showing general info manual" >> runInfoForTopic "hledger" Nothing - | isNullCommand && hasManFlag args = dbgIO "" "--man with no command, showing general man page" >> runManForTopic "hledger" Nothing - | not (isExternalCommand || hasHelpFlag args || hasInfoFlag args || hasManFlag args) - && (hasVersion args) -- || (hasVersion argsaftercmd && isInternalCommand)) - = putStrLn prognameandversion - -- \| (null externalcmd) && boolopt "binary-filename" 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 prognameandversion addons - | isBadCommand = badCommandError + -- high priority flags and situations. -h, then --help, then --tldr, then --info, then --man are highest priority. + | isNullCommand && helpFlag = dbgIO "" "-h/--help with no command, showing general help" >> printUsage + | isNullCommand && tldrFlag = dbgIO "" "--tldr with no command, showing general tldr page" >> runTldrForPage "hledger" + | isNullCommand && infoFlag = dbgIO "" "--info with no command, showing general info manual" >> runInfoForTopic "hledger" Nothing + | isNullCommand && manFlag = dbgIO "" "--man with no command, showing general man page" >> runManForTopic "hledger" Nothing + | versionFlag && not (isExternalCommand || helpFlag || tldrFlag || infoFlag || manFlag) = putStrLn prognameandversion + | isNullCommand = dbgIO "" "no command, showing commands list" >> printCommandsList prognameandversion addons + | isBadCommand = badCommandError -- builtin commands | Just (cmdmode, cmdaction) <- findBuiltinCommand cmd = (case True of -- these commands should not require or read the journal - _ | cmd `elem` ["demo","help","test"] -> cmdaction opts journallesserror + _ | cmd `elem` ["demo","help","test"] -> + cmdaction opts $ error' $ cmd++" tried to read the journal but is not supposed to" -- these commands should create the journal if missing _ | cmd `elem` ["add","import"] -> do - ensureJournalFileExists . NE.head =<< journalFilePathFromOpts opts - withJournalDo opts (cmdaction opts) + ensureJournalFileExists . NE.head =<< journalFilePathFromOpts opts + withJournalDo opts (cmdaction opts) -- other commands read the journal and should fail if it's missing _ -> withJournalDo opts (cmdaction opts) ) @@ -260,6 +259,7 @@ main = withGhcDebug' $ do -- shouldn't reach here | otherwise = usageError ("could not understand the arguments "++show args) >> exitFailure + -- do it runHledgerCommand when (ghcDebugMode == GDPauseAtEnd) $ ghcDebugPause' @@ -317,8 +317,11 @@ isValue "-" = True isValue ('-':_) = False isValue _ = True -flagstomove = inputflags ++ reportflags ++ helpflags -noargflagstomove = concatMap flagNames $ filter ((==FlagNone).flagInfo) flagstomove +flagstomove = inputflags ++ reportflags ++ clihelpflags +noargflagstomove = concatMap flagNames (filter ((==FlagNone).flagInfo) flagstomove) + -- silly special case: if someone is abbreviating --tldr, make sure it works right when written before COMMAND + -- (not needed for --info, --man, --version since their abbreviations are ambiguous) + ++ ["tl", "tld"] reqargflagstomove = -- filter (/= "debug") $ concatMap flagNames $ filter ((==FlagReq ).flagInfo) flagstomove optargflagstomove = concatMap flagNames $ filter (isFlagOpt .flagInfo) flagstomove diff --git a/hledger/Hledger/Cli/CliOptions.hs b/hledger/Hledger/Cli/CliOptions.hs index bceebf510..7d54ee90e 100644 --- a/hledger/Hledger/Cli/CliOptions.hs +++ b/hledger/Hledger/Cli/CliOptions.hs @@ -240,10 +240,11 @@ reportflags = [ clihelpflags :: [Flag RawOpts] clihelpflags = [ - flagNone ["version"] (setboolopt "version") "show version information" - ,flagNone ["help","h"] (setboolopt "help") "show command-line help for hledger [or COMMAND]" - ,flagNone ["info"] (setboolopt "info") "show the hledger manual [for COMMAND] with info" - ,flagNone ["man"] (setboolopt "man") "show the hledger manual [for COMMAND] with man" + flagNone ["help","h"] (setboolopt "help") "show command line help" + ,flagNone ["tldr"] (setboolopt "tldr") "show command examples with tldr" + ,flagNone ["info"] (setboolopt "info") "show the hledger manual with info" + ,flagNone ["man"] (setboolopt "man") "show the hledger manual with man" + ,flagNone ["version"] (setboolopt "version") "show version information" ] -- XXX why are these duplicated in defCommandMode below ? diff --git a/hledger/Hledger/Cli/DocFiles.hs b/hledger/Hledger/Cli/DocFiles.hs index 228e2b1ea..9e0f75652 100644 --- a/hledger/Hledger/Cli/DocFiles.hs +++ b/hledger/Hledger/Cli/DocFiles.hs @@ -8,15 +8,11 @@ Embedded documentation files in various formats, and helpers for viewing them. module Hledger.Cli.DocFiles ( Topic - -- ,toolDocs - -- ,toolDocNames - -- ,toolDocMan - -- ,toolDocTxt - -- ,toolDocInfo ,printHelpForTopic ,runManForTopic ,runInfoForTopic ,runPagerForTopic + ,runTldrForPage ) where @@ -28,7 +24,7 @@ import System.IO import System.IO.Temp import System.Process -import Hledger.Utils (first3, second3, third3, embedFileRelative) +import Hledger.Utils (first3, second3, third3, embedFileRelative, error') import Text.Printf (printf) import System.Environment (lookupEnv) import Hledger.Utils.Debug @@ -39,11 +35,30 @@ type Tool = String -- Any heading in the hledger user manual (and perhaps later the hledger-ui/hledger-web manuals). type Topic = String +-- Any name of a hledger tldr page (hledger, hledger-ui, hledger-print etc.) +type TldrPage = String + +-- | All hledger-related pages from the tldr-pages project. +-- All are symlinked into the hledger package directory to allow embeddeding. +tldrs :: [(TldrPage, ByteString)] +tldrs = [ + ("hledger-accounts", $(embedFileRelative "embeddedfiles/hledger-accounts.md")) + ,("hledger-add", $(embedFileRelative "embeddedfiles/hledger-add.md")) + ,("hledger-aregister", $(embedFileRelative "embeddedfiles/hledger-aregister.md")) + ,("hledger-balance", $(embedFileRelative "embeddedfiles/hledger-balance.md")) + ,("hledger-balancesheet", $(embedFileRelative "embeddedfiles/hledger-balancesheet.md")) + ,("hledger-import", $(embedFileRelative "embeddedfiles/hledger-import.md")) + ,("hledger-incomestatement", $(embedFileRelative "embeddedfiles/hledger-incomestatement.md")) + ,("hledger-print", $(embedFileRelative "embeddedfiles/hledger-print.md")) + ,("hledger-ui", $(embedFileRelative "embeddedfiles/hledger-ui.md")) + ,("hledger-web", $(embedFileRelative "embeddedfiles/hledger-web.md")) + ,("hledger", $(embedFileRelative "embeddedfiles/hledger.md")) + ] + -- | The main hledger manuals as source for man, info and as plain text. --- Only files under the current package directory can be embedded, --- so some of these are symlinked from the other package directories. -toolDocs :: [(Tool, (ByteString, ByteString, ByteString))] -toolDocs = [ +-- All are symlinked into the hledger package directory to allow embeddeding. +manuals :: [(Tool, (ByteString, ByteString, ByteString))] +manuals = [ ("hledger", ($(embedFileRelative "embeddedfiles/hledger.1") ,$(embedFileRelative "embeddedfiles/hledger.txt") @@ -61,29 +76,22 @@ toolDocs = [ )) ] --- toolNames :: [Tool] --- toolNames = map fst toolDocs - -- | Get the manual as plain text for this tool, or a not found message. -toolDocTxt :: Tool -> ByteString -toolDocTxt name = - maybe (fromString $ "No text manual found for tool: "++name) second3 $ lookup name toolDocs +manualTxt :: Tool -> ByteString +manualTxt name = maybe (fromString $ "No text manual found for tool: "++name) second3 $ lookup name manuals -- | Get the manual as man source (nroff) for this tool, or a not found message. -toolDocMan :: Tool -> ByteString -toolDocMan name = - maybe (fromString $ "No man page found for tool: "++name) first3 $ lookup name toolDocs +manualMan :: Tool -> ByteString +manualMan name = maybe (fromString $ "No man page found for tool: "++name) first3 $ lookup name manuals -- | Get the manual as info source (texinfo) for this tool, or a not found message. -toolDocInfo :: Tool -> ByteString -toolDocInfo name = - maybe (fromString $ "No info manual found for tool: "++name) third3 $ lookup name toolDocs +manualInfo :: Tool -> ByteString +manualInfo name = maybe (fromString $ "No info manual found for tool: "++name) third3 $ lookup name manuals -- | Print plain text help for this tool. -- Takes an optional topic argument for convenience but it is currently ignored. printHelpForTopic :: Tool -> Maybe Topic -> IO () -printHelpForTopic tool _mtopic = - BC.putStr (toolDocTxt tool) +printHelpForTopic tool _mtopic = BC.putStr (manualTxt tool) -- | Display an info manual for this topic, opened at the given topic if provided, -- using the "info" executable in $PATH. @@ -91,7 +99,7 @@ printHelpForTopic tool _mtopic = runInfoForTopic :: Tool -> Maybe Topic -> IO () runInfoForTopic tool mtopic = withSystemTempFile ("hledger-"++tool++".info") $ \f h -> do - BC.hPutStrLn h $ toolDocInfo tool + BC.hPutStrLn h $ manualInfo tool hClose h callCommand $ dbg1 "info command" $ "info -f " ++ f ++ maybe "" (printf " -n '%s'") mtopic @@ -104,7 +112,7 @@ less = "less -s -i --use-backslash" runPagerForTopic :: Tool -> Maybe Topic -> IO () runPagerForTopic tool mtopic = do withSystemTempFile ("hledger-"++tool++".txt") $ \f h -> do - BC.hPutStrLn h $ toolDocTxt tool + BC.hPutStrLn h $ manualTxt tool hClose h envpager <- fromMaybe less <$> lookupEnv "PAGER" let @@ -121,7 +129,7 @@ runManForTopic :: Tool -> Maybe Topic -> IO () runManForTopic tool mtopic = -- This temp file path should have a slash in it, man requires at least one. withSystemTempFile ("hledger-"++tool++".1") $ \f h -> do - BC.hPutStrLn h $ toolDocMan tool + BC.hPutStrLn h $ manualMan tool hClose h let exactmatch = True @@ -130,3 +138,19 @@ runManForTopic tool mtopic = Nothing -> "" Just t -> "-P \"" ++ less ++ " -p'^( )?" ++ t ++ (if exactmatch then "\\\\$" else "") ++ "'\"" callCommand $ dbg1 "man command" $ unwords ["man", pagerarg, f] + +-- | Get the named tldr page's source, if we know it. +tldr :: TldrPage -> Maybe ByteString +tldr name = lookup name tldrs + +-- | Display one of the hledger tldr pages, using "tldr". +runTldrForPage :: TldrPage -> IO () +runTldrForPage name = + case tldr name of + Nothing -> error' $ "sorry, there's no " <> name <> " tldr page yet" + Just b -> do + withSystemTempFile (name++".md") $ \f h -> do + BC.hPutStrLn h b + hClose h + callCommand $ dbg1 "tldr command" $ unwords ["tldr", "-r", f] + diff --git a/hledger/embeddedfiles/DEMOS.md b/hledger/embeddedfiles/DEMOS.md new file mode 100644 index 000000000..5b64b5c06 --- /dev/null +++ b/hledger/embeddedfiles/DEMOS.md @@ -0,0 +1,58 @@ +# Scripts and notes for demos +## install.cast +Installing hledger from source with hledger-install +https://asciinema.org/a/567934 + +``` 80x44 +curl -O +https://raw.githubusercontent.com/simonmichael/hledger/master/hledger-install/hledger-install.sh + +ls -l hledger-install.sh less hledger-install.sh + +bash hledger-install.sh +``` +Issues: +- with PATH not set up, hledger-install does not find the stack it installed + +## ghcup.cast +Installing hledger from source with ghcup +``` +curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org +``` + +Issues: +- ghcup installs an older version of ghc 9.2 +- with PATH not set up, ghcup does not find the cabal it installed + +## help.cast +Getting help +### Things to cover +#### hledger +show this commands list +#### hledger -h +show hledger's command-line help +#### hledger CMD -h +show CMD's command-line help and manual +#### hledger help [-i|-m|-p] [TOPIC] +show hledger's manual with info, man, or pager +#### hledger demo [DEMO] -- [ASCOPTS] +show brief demos on various topics +#### https://hledger.org + html manuals, tutorials, support + +## demo.cast +Watching the built-in demos +https://asciinema.org/a/567944 + +## add.cast +The simplest way to start a journal (add) +https://asciinema.org/a/567935 + +## print.cast +Show full transactions (print) +https://asciinema.org/a/567936 + +## balance.cast +Show account balances and changes (balance) +https://asciinema.org/a/567937 + diff --git a/hledger/embeddedfiles/README b/hledger/embeddedfiles/README index af0ce9ac6..a86876a3d 100644 --- a/hledger/embeddedfiles/README +++ b/hledger/embeddedfiles/README @@ -2,6 +2,8 @@ These files are embedded into the hledger executable at compile time. They include: - symbolic links to all the main hledger manuals in several formats, for embedding in Hledger/Cli/DocFiles.hs. - (Having these symlinked here within the hledger package allows embedding them without using absolute paths.) + (Having the hledger-ui/hledger-web files also symlinked here within the hledger package allows embedding them without using absolute paths.) + +- symbolic links to all the hledger tldr pages. - asciinema screen casts, for embedding in Hledger/Cli/Commands/Demo.hs. diff --git a/hledger/embeddedfiles/README.md b/hledger/embeddedfiles/README.md new file mode 120000 index 000000000..840f59466 --- /dev/null +++ b/hledger/embeddedfiles/README.md @@ -0,0 +1 @@ +../../doc/tldr/README.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-accounts.md b/hledger/embeddedfiles/hledger-accounts.md new file mode 120000 index 000000000..59d3207b6 --- /dev/null +++ b/hledger/embeddedfiles/hledger-accounts.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-accounts.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-add.md b/hledger/embeddedfiles/hledger-add.md new file mode 120000 index 000000000..8bfe8c935 --- /dev/null +++ b/hledger/embeddedfiles/hledger-add.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-add.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-aregister.md b/hledger/embeddedfiles/hledger-aregister.md new file mode 120000 index 000000000..02656070b --- /dev/null +++ b/hledger/embeddedfiles/hledger-aregister.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-aregister.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-balance.md b/hledger/embeddedfiles/hledger-balance.md new file mode 120000 index 000000000..3136fdd67 --- /dev/null +++ b/hledger/embeddedfiles/hledger-balance.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-balance.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-balancesheet.md b/hledger/embeddedfiles/hledger-balancesheet.md new file mode 120000 index 000000000..1592df075 --- /dev/null +++ b/hledger/embeddedfiles/hledger-balancesheet.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-balancesheet.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-import.md b/hledger/embeddedfiles/hledger-import.md new file mode 120000 index 000000000..15df2bef7 --- /dev/null +++ b/hledger/embeddedfiles/hledger-import.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-import.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-incomestatement.md b/hledger/embeddedfiles/hledger-incomestatement.md new file mode 120000 index 000000000..8f58b2cda --- /dev/null +++ b/hledger/embeddedfiles/hledger-incomestatement.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-incomestatement.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-journal.md b/hledger/embeddedfiles/hledger-journal.md new file mode 120000 index 000000000..2be907a83 --- /dev/null +++ b/hledger/embeddedfiles/hledger-journal.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-journal.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-print.md b/hledger/embeddedfiles/hledger-print.md new file mode 120000 index 000000000..6e1f7f091 --- /dev/null +++ b/hledger/embeddedfiles/hledger-print.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-print.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-ui.md b/hledger/embeddedfiles/hledger-ui.md new file mode 120000 index 000000000..9249656d7 --- /dev/null +++ b/hledger/embeddedfiles/hledger-ui.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-ui.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger-web.md b/hledger/embeddedfiles/hledger-web.md new file mode 120000 index 000000000..efc18718a --- /dev/null +++ b/hledger/embeddedfiles/hledger-web.md @@ -0,0 +1 @@ +../../doc/tldr/hledger-web.md \ No newline at end of file diff --git a/hledger/embeddedfiles/hledger.md b/hledger/embeddedfiles/hledger.md new file mode 120000 index 000000000..bd2a7413c --- /dev/null +++ b/hledger/embeddedfiles/hledger.md @@ -0,0 +1 @@ +../../doc/tldr/hledger.md \ No newline at end of file diff --git a/hledger/package.yaml b/hledger/package.yaml index df88c686e..35cad1993 100644 --- a/hledger/package.yaml +++ b/hledger/package.yaml @@ -26,15 +26,28 @@ tested-with: GHC==8.10.7, GHC==9.0.2, GHC==9.2.8, GHC==9.4.5, GHC==9.6.2 extra-source-files: - CHANGES.md - README.md -- test/unittest.hs - bench/10000x1000x10.journal -- hledger.1 -- hledger.txt -- hledger.info +- shell-completion/hledger-completion.bash +- test/unittest.hs + - embeddedfiles/add.cast - embeddedfiles/balance.cast - embeddedfiles/install.cast - embeddedfiles/print.cast + +- embeddedfiles/hledger-accounts.md +- embeddedfiles/hledger-add.md +- embeddedfiles/hledger-aregister.md +- embeddedfiles/hledger-balance.md +- embeddedfiles/hledger-balancesheet.md +- embeddedfiles/hledger-import.md +- embeddedfiles/hledger-incomestatement.md +- embeddedfiles/hledger-journal.md +- embeddedfiles/hledger-print.md +- embeddedfiles/hledger-ui.md +- embeddedfiles/hledger-web.md +- embeddedfiles/hledger.md + - embeddedfiles/hledger.1 - embeddedfiles/hledger.txt - embeddedfiles/hledger.info @@ -44,7 +57,7 @@ extra-source-files: - embeddedfiles/hledger-web.1 - embeddedfiles/hledger-web.txt - embeddedfiles/hledger-web.info -- shell-completion/hledger-completion.bash + - Hledger/Cli/Commands/Accounts.txt - Hledger/Cli/Commands/Activity.txt - Hledger/Cli/Commands/Add.txt diff --git a/hledger/test/cli/cli.test b/hledger/test/cli/cli.test index fc70234f3..136ac7bc4 100644 --- a/hledger/test/cli/cli.test +++ b/hledger/test/cli/cli.test @@ -82,9 +82,15 @@ $ hledger -f somefile > /^Commands/ # ** 6. with -h, and possibly other common flags present, show general usage -$ hledger -h --version -f /dev/null +$ hledger -h --version -f/dev/null > /^hledger \[COMMAND\]/ +# ** 6b. XXX our moveFlagsAfterCommand plus the way cmdargs' argument-requiring flags +# consume a following flag rather than failing, means things like this go wrong +# (args are rearranged to -f -h --version /dev/null, shows version when it should show help): +#$ hledger -h --version -f /dev/null +#> /^hledger \[COMMAND\]/ + # ** 7. with -h before a COMMAND, show command usage $ hledger -h balance --cost > /balance \[OPTIONS\]/ @@ -104,7 +110,7 @@ $ hledger nosuchcommand $ hledger -f /dev/null --alias somealiases --rules-file --debug 1 --daily register # ** 11. or after it, and spaces in options are optional -$ hledger register -f/dev/null --alias=somealiases --rules-file -h --version --debug 1 --daily +$ hledger register -f/dev/null --alias=somealiases -h --version --debug 1 --daily > /^register \[OPTIONS\]/ # ** 12. general flags before command should work @@ -117,4 +123,3 @@ $ hledger -f /dev/null register --daily $ hledger --related register >2 /Unknown flag: --related/ >= 1 -