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).
This commit is contained in:
Simon Michael 2016-04-04 11:09:43 -07:00
parent c6f1371251
commit 25cd65442a
2 changed files with 11 additions and 6 deletions

View File

@ -167,12 +167,13 @@ moveFlagsAfterCommand args = moveArgs $ ensureDebugHasArg args
_ -> as _ -> as
-- -h ..., --version ... -- -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 ... -- -f FILE ..., --alias ALIAS ...
moveArgs (f:v:a:as) | isMovableReqArgFlag f moveArgs (f:v:a:as) | isMovableReqArgFlag f, isValue v = (moveArgs $ a:as) ++ [f,v]
, not (take 1 v == "-") = (moveArgs $ a:as) ++ [f,v]
-- -fFILE ..., --alias=ALIAS ... -- -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 -- anything else
moveArgs as = as moveArgs as = as
@ -185,6 +186,10 @@ isMovableReqArgFlagAndValue ('-':'-':a:as) = case break (== '=') (a:as) of (f:fs
isMovableReqArgFlagAndValue ('-':shortflag:_:_) = [shortflag] `elem` reqargflagstomove isMovableReqArgFlagAndValue ('-':shortflag:_:_) = [shortflag] `elem` reqargflagstomove
isMovableReqArgFlagAndValue _ = False isMovableReqArgFlagAndValue _ = False
isValue "-" = True
isValue ('-':_) = False
isValue _ = True
flagstomove = inputflags ++ helpflags flagstomove = inputflags ++ helpflags
noargflagstomove = concatMap flagNames $ filter ((==FlagNone).flagInfo) flagstomove noargflagstomove = concatMap flagNames $ filter ((==FlagNone).flagInfo) flagstomove
reqargflagstomove = -- filter (/= "debug") $ reqargflagstomove = -- filter (/= "debug") $

View File

@ -122,12 +122,12 @@ hledger --daily register
>>>=1 >>>=1
# 12. help and input flags can go before command # 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\]/ >>> /^hledger \[COMMAND\]/
>>>=0 >>>=0
# 13. or after it, and spaces in options are optional # 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\]/ >>> /^register \[OPTIONS\]/
>>>=0 >>>=0