From 25cd65442a5b04e9d16e3bd9911e362d10ad8e17 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Mon, 4 Apr 2016 11:09:43 -0700 Subject: [PATCH] cli: fix opts parsing regressions from feb Since commit 7aab544, "-f -" before the command broke command detection, causing spurious "no such option" errors (and breaking about 70 functional tests which neither I nor travis noticed). --- hledger/Hledger/Cli/Main.hs | 13 +++++++++---- tests/cli/cli.test | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/hledger/Hledger/Cli/Main.hs b/hledger/Hledger/Cli/Main.hs index 9db220d6a..878d84cfa 100644 --- a/hledger/Hledger/Cli/Main.hs +++ b/hledger/Hledger/Cli/Main.hs @@ -167,12 +167,13 @@ moveFlagsAfterCommand args = moveArgs $ ensureDebugHasArg args _ -> as -- -h ..., --version ... - moveArgs (f:a:as) | isMovableNoArgFlag f = (moveArgs $ a:as) ++ [f] + moveArgs (f:a:as) | isMovableNoArgFlag f = (moveArgs $ a:as) ++ [f] -- -f FILE ..., --alias ALIAS ... - moveArgs (f:v:a:as) | isMovableReqArgFlag f - , not (take 1 v == "-") = (moveArgs $ a:as) ++ [f,v] + moveArgs (f:v:a:as) | isMovableReqArgFlag f, isValue v = (moveArgs $ a:as) ++ [f,v] -- -fFILE ..., --alias=ALIAS ... - moveArgs (fv:a:as) | isMovableReqArgFlagAndValue fv = (moveArgs $ a:as) ++ [fv] + moveArgs (fv:a:as) | isMovableReqArgFlagAndValue fv = (moveArgs $ a:as) ++ [fv] + -- -f(missing arg) + moveArgs (f:a:as) | isMovableReqArgFlag f, not (isValue a) = (moveArgs $ a:as) ++ [f] -- anything else moveArgs as = as @@ -185,6 +186,10 @@ isMovableReqArgFlagAndValue ('-':'-':a:as) = case break (== '=') (a:as) of (f:fs isMovableReqArgFlagAndValue ('-':shortflag:_:_) = [shortflag] `elem` reqargflagstomove isMovableReqArgFlagAndValue _ = False +isValue "-" = True +isValue ('-':_) = False +isValue _ = True + flagstomove = inputflags ++ helpflags noargflagstomove = concatMap flagNames $ filter ((==FlagNone).flagInfo) flagstomove reqargflagstomove = -- filter (/= "debug") $ diff --git a/tests/cli/cli.test b/tests/cli/cli.test index e988c2547..2736e7675 100644 --- a/tests/cli/cli.test +++ b/tests/cli/cli.test @@ -122,12 +122,12 @@ hledger --daily register >>>=1 # 12. help and input flags can go before command -hledger -f /dev/null --alias somealiases --rules-file -? -h --help --version --debug 1 register --daily +hledger -f /dev/null --alias somealiases --rules-file -h --help --version --debug 1 register --daily >>> /^hledger \[COMMAND\]/ >>>=0 # 13. or after it, and spaces in options are optional -hledger register -f/dev/null --alias=somealiases --rules-file -? -h --help --version --debug 1 --daily +hledger register -f/dev/null --alias=somealiases --rules-file -h --help --version --debug 1 --daily >>> /^register \[OPTIONS\]/ >>>=0