on master help sign in
Merge pull request #786 from LeifW/report_unzip_errors

More descriptive error message on failure to unzip .ibc

commit59edc75994f2c809953967307c17cecf5fda63ab authorEdwin Brady <edwin.brady@gmail.com> dateWed 22 Jan 2014, 02:16 (13 years ago) parentb849041e825007
3 files changed+25−5
idris.cabal+1 src/Idris/IBC.hs+9−5 src/Util/Zlib.hs+15
idris.cabal+1
@@ -423,6 +423,7 @@ Library
423423 Util.Pretty
424424 , Util.System
425425 , Util.Net
426+ , Util.Zlib
426427
427428 , Pkg.PParser
428429
src/Idris/IBC.hs+9−5
@@ -21,11 +21,9 @@ import Control.Monad.State.Strict hiding (get, put)
2121import qualified Control.Monad.State.Strict as ST
2222import System.FilePath
2323import System.Directory
24−import Codec.Compression.Zlib
24+import Codec.Compression.Zlib (compress)
25+import Util.Zlib (decompressEither)
2526
26−import Debug.Trace
27−
28−import Paths_idris
2927
3028ibcVersion :: Word8
3129ibcVersion = 54
@@ -74,9 +72,15 @@ loadIBC fp = do iLOG $ "Loading ibc " ++ fp
7472 ibcf <- runIO $ (bdecode fp :: IO IBCFile)
7573 process ibcf fp
7674
75+bencode :: Binary a => FilePath -> a -> IO ()
7776bencode f d = B.writeFile f (compress (encode d))
77+
78+bdecode :: Binary b => FilePath -> IO b
7879bdecode f = do d' <- B.readFile f
79− return (decode (decompress d'))
80+ either
81+ (\(_, e) -> error $ "Invalid / corrupted zip format on " ++ show f ++ ": " ++ e)
82+ (return . decode)
83+ (decompressEither d')
8084
8185writeIBC :: FilePath -> FilePath -> Idris ()
8286writeIBC src f
src/Util/Zlib.hsnew file+15
@@ -0,0 +1,15 @@
1+module Util.Zlib (decompressEither) where
2+
3+-- From http://stackoverflow.com/questions/10043102/how-to-catch-the-decompress-ioerror/10045963#10045963
4+import Codec.Compression.Zlib.Internal
5+import Data.ByteString.Lazy (ByteString, fromChunks)
6+import Control.Arrow (right)
7+
8+decompressEither :: ByteString -> Either (DecompressError, String) ByteString
9+decompressEither = finalise
10+ . foldDecompressStream cons nil err
11+ . decompressWithErrors zlibFormat defaultDecompressParams
12+ where err errorCode errorString = Left (errorCode, errorString)
13+ nil = Right []
14+ cons chunk = right (chunk :)
15+ finalise = right fromChunks