on master help sign in
Merge pull request #3871 from jfdm/make-ipkg-reading-robust
c1329d7Niklas Larsson
src/Idris/Package/Parser.hs+16−5
@@ -24,7 +24,9 @@ import Control.Applicative
24import Control.Monad.State.Strict
24import Control.Monad.State.Strict
25import Data.List (union)
25import Data.List (union)
26import Data.Maybe (fromJust, isNothing)
26import Data.Maybe (fromJust, isNothing)
27+import System.Directory (doesFileExist)
28+import System.Exit
27−import System.FilePath (isValid, takeFileName)
29+import System.FilePath (isValid, takeExtension, takeFileName)
28import qualified Text.PrettyPrint.ANSI.Leijen as PP
30import qualified Text.PrettyPrint.ANSI.Leijen as PP
29import Text.Trifecta hiding (char, charLiteral, natural, span, string, symbol,
31import Text.Trifecta hiding (char, charLiteral, natural, span, string, symbol,
30 whiteSpace)
32 whiteSpace)
@@ -58,10 +60,19 @@ instance TokenParsing PParser where
58
60
59parseDesc :: FilePath -> IO PkgDesc
61parseDesc :: FilePath -> IO PkgDesc
60parseDesc fp = do
62parseDesc fp = do
63+ when (not $ takeExtension fp == ".ipkg") $ do
64+ putStrLn $ unwords ["The presented iPKG file does not have a '.ipkg' extension:", show fp]
65+ exitWith (ExitFailure 1)
66+ res <- doesFileExist fp
67+ if res
68+ then do
61− p <- readFile fp
69+ p <- readFile fp
62− case runparser pPkg defaultPkg fp p of
70+ case runparser pPkg defaultPkg fp p of
63− Failure (ErrInfo err _) -> fail (show $ PP.plain err)
71+ Failure (ErrInfo err _) -> fail (show $ PP.plain err)
64− Success x -> return x
72+ Success x -> return x
73+ else do
74+ putStrLn $ unwords [ "The presented iPKG file does not exist:", show fp]
75+ exitWith (ExitFailure 1)
65
76
66pPkg :: PParser PkgDesc
77pPkg :: PParser PkgDesc
67pPkg = do
78pPkg = do
test/pkg001/expected+3
@@ -18,3 +18,6 @@ builtin
18Elaborating type decl Main.main[]
18Elaborating type decl Main.main[]
19Elaborating clause Main.main
19Elaborating clause Main.main
20Rechecking for positivity []
20Rechecking for positivity []
21+The presented iPKG file does not have a '.ipkg' extension: "malformed-package-name"
22+The presented iPKG file does not exist: "non-existent-package.ipkg"
23+The presented iPKG file does not have a '.ipkg' extension: "non-existent-package-with-malformed-name"
test/pkg001/run+3
@@ -3,3 +3,6 @@ ${IDRIS:-idris} $@ --build test-pkg.ipkg
3rm -f *.ibc
3rm -f *.ibc
4${IDRIS:-idris} $@ --build test-pkg.ipkg --quiet
4${IDRIS:-idris} $@ --build test-pkg.ipkg --quiet
5${IDRIS:-idris} $@ --build test-pkg.ipkg --logging-categories "elab" --log 1
5${IDRIS:-idris} $@ --build test-pkg.ipkg --logging-categories "elab" --log 1
6+${IDRIS:-idris} $@ --build malformed-package-name
7+${IDRIS:-idris} $@ --build non-existent-package.ipkg
8+${IDRIS:-idris} $@ --build non-existent-package-with-malformed-name