Skip to content

Commit 183ae43

Browse files
author
Ahmad Salim Al-Sibahi
authored
Merge pull request #4257 from gallais/opts-ipkg
Not silently accepting invalid options in package files
2 parents 5813103 + 377d87a commit 183ae43

File tree

6 files changed

+53
-5
lines changed

6 files changed

+53
-5
lines changed

src/Idris/CmdOptions.hs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ Maintainer : The Idris Community.
1010

1111
module Idris.CmdOptions
1212
( opt, getClient, getPkg, getPkgCheck, getPkgClean, getPkgMkDoc,
13-
getPkgREPL, getPkgTest, getPort, getIBCSubDir, pureArgParser, runArgParser
13+
getPkgREPL, getPkgTest, getPort, getIBCSubDir,
14+
pureArgParser, execArgParserPure, runArgParser
1415
) where
1516

1617
import Idris.Info (getIdrisVersion)
@@ -72,10 +73,13 @@ runArgParser = do opts <- execParser $ info parser
7273
PP.empty,
7374
PP.indent 4 (PP.text "http://www.idris-lang.org/")]
7475

76+
execArgParserPure :: [String] -> ParserResult [Opt]
77+
execArgParserPure args = preProcOpts <$> execParserPure (prefs idm) (info parser idm) args
78+
7579
pureArgParser :: [String] -> [Opt]
76-
pureArgParser args = case getParseResult $ execParserPure (prefs idm) (info parser idm) args of
80+
pureArgParser args = case getParseResult (execArgParserPure args) of
7781
Just opts -> preProcOpts opts
78-
Nothing -> []
82+
Nothing -> []
7983

8084
parser :: Parser [Opt]
8185
parser = runA $ proc () -> do

src/Idris/Package/Parser.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Idris.Package.Parser where
1010

1111
import Idris.CmdOptions
1212
import Idris.Imports
13+
import Idris.Options (Opt)
1314
import Idris.Package.Common
1415
import Idris.Parser (moduleName)
1516
import Idris.Parser.Helpers (Parser, Parsing, eol, iName, identifier, isEol,
@@ -19,6 +20,7 @@ import Idris.Parser.Helpers (Parser, Parsing, eol, iName, identifier, isEol,
1920
import Control.Applicative
2021
import Control.Monad.State.Strict
2122
import Data.List (union)
23+
import qualified Options.Applicative as Opts
2224
import System.Directory (doesFileExist)
2325
import System.Exit
2426
import System.FilePath (isValid, takeExtension, takeFileName)
@@ -109,11 +111,19 @@ clause name p f = do value <- reserved name *> lchar '=' *> p <* someSpace
109111
commaSep :: Parsing m => m a -> m [a]
110112
commaSep p = P.sepBy1 p (lchar ',')
111113

114+
pOptions :: PParser [Opt]
115+
pOptions = do
116+
str <- stringLiteral
117+
case execArgParserPure (words str) of
118+
Opts.Success a -> return a
119+
Opts.Failure e -> fail $ fst $ Opts.renderFailure e ""
120+
_ -> fail "Unexpected error"
121+
112122
pClause :: PParser ()
113123
pClause = clause "executable" filename (\st v -> st { execout = Just v })
114124
<|> clause "main" (iName []) (\st v -> st { idris_main = Just v })
115125
<|> clause "sourcedir" identifier (\st v -> st { sourcedir = v })
116-
<|> clause "opts" (pureArgParser . words <$> stringLiteral) (\st v -> st { idris_opts = v ++ idris_opts st })
126+
<|> clause "opts" pOptions (\st v -> st { idris_opts = v ++ idris_opts st })
117127
<|> clause "pkgs" (commaSep (pPkgName <* someSpace)) (\st ps ->
118128
let pkgs = pureArgParser $ concatMap (\x -> ["-p", show x]) ps
119129
in st { pkgdeps = ps `union` pkgdeps st

test/TestData.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,8 @@ testFamiliesData = [
205205
( 5, ANY ),
206206
( 6, ANY ),
207207
( 7, ANY ),
208-
( 8, ANY )]),
208+
( 8, ANY ),
209+
( 10, ANY )]),
209210
("prelude", "Prelude",
210211
[ ( 1, ANY )]),
211212
("primitives", "Primitive types",

test/pkg010/expected

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
Uncaught error: user error (wrongopts.ipkg:4:1:
2+
|
3+
4 | <empty line>
4+
| ^
5+
Invalid option `-total'
6+
7+
Usage: ([--nobanner] | [-q|--quiet] | [--ide-mode] | [--ide-mode-socket] |
8+
[--client ARG] | [--log LEVEL] | [--logging-categories CATS] |
9+
[--nobasepkgs] | [--noprelude] | [--nobuiltins] | [--check] |
10+
[-o|--output FILE] | [--interface] | [--typeintype] | [--total] |
11+
[--partial] | [--warnpartial] | [--warnreach] | [--warnipkg] |
12+
[--nocoverage] | [--errorcontext] | [--info] | [--listlogcats] |
13+
[--link] | [--listlibs] | [--libdir] | [--docdir] | [--include] | [--V2]
14+
| [--V1] | [-V|--V0|--verbose] | [--ibcsubdir FILE] |
15+
[-i|--idrispath ARG] | [--sourcepath ARG] | [--warn] |
16+
[-p|--package ARG] | [--port PORT] | [--build IPKG] | [--install IPKG] |
17+
[--repl IPKG] | [--clean IPKG] | [--mkdoc IPKG] | [--installdoc IPKG] |
18+
[--checkpkg IPKG] | [--testpkg IPKG] | [--indent-with INDENT] |
19+
[--indent-clause INDENT] | [--bytecode ARG] | [-S|--codegenonly] |
20+
[-c|--compileonly] | [--dumpdefuns ARG] | [--dumpcases ARG] |
21+
[--codegen TARGET] | [--portable-codegen TARGET] | [--cg-opt ARG] |
22+
[-e|--eval EXPR] | [--execute] | [--exec EXPR] | [-X|--extension EXT] |
23+
[--O3] | [--O2] | [--O1] | [--O0] | [--partial-eval] |
24+
[--no-partial-eval] | [-O|--level ARG] | [--target TRIPLE] | [--cpu CPU]
25+
| [--color|--colour] | [--nocolor|--nocolour] | [--consolewidth WIDTH] |
26+
[--highlight] | [--no-elim-deprecation-warnings] |
27+
[--no-tactic-deprecation-warnings]) [FILES] [-v|--version]
28+
)

test/pkg010/run

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/usr/bin/env bash
2+
${IDRIS:-idris} $@ --build wrongopts.ipkg

test/pkg010/wrongopts.ipkg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package wrongopts
2+
3+
opts = "-total"

0 commit comments

Comments
 (0)