zip-stream 0.1 → 0.1.0.1
raw patch · 4 files changed
+28/−9 lines, 4 filesdep +transformersdep ~basedep ~conduitdep ~conduit-extra
Dependencies added: transformers
Dependency ranges changed: base, conduit, conduit-extra, directory
Files
- Codec/Archive/Zip/Conduit/Zip.hs +2/−3
- cmd/unzip.hs +8/−1
- cmd/zip.hs +12/−1
- zip-stream.cabal +6/−4
Codec/Archive/Zip/Conduit/Zip.hs view
@@ -32,7 +32,6 @@ import Data.Digest.CRC32 (crc32) import Data.Either (isLeft) import Data.Maybe (fromMaybe, fromJust)-import Data.Monoid ((<>)) import Data.Time (LocalTime(..), TimeOfDay(..), toGregorian) import Data.Word (Word16, Word64) @@ -95,7 +94,7 @@ -- Any errors are thrown in the underlying monad (as 'ZipError's). zipStream :: (MonadBase b m, PrimMonad b, MonadThrow m) => ZipOptions -> C.ConduitM (ZipEntry, ZipData m) BS.ByteString m Word64 zipStream ZipOptions{..} = execStateC 0 $ do- (cnt, cdir) <- next 0 (mempty :: P.Put)+ (cnt, cdir) <- next 0 (return ()) cdoff <- get output cdir eoff <- get@@ -105,7 +104,7 @@ (return (cnt, dir)) (\e -> do d <- entry e- next (succ cnt) $ dir <> d)+ next (succ cnt) $ dir >> d) entry (ZipEntry{..}, zipData -> dat) = do let usiz = dataSize dat sdat = left ((C..| sizeCRC) . C.toProducer) dat
cmd/unzip.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE RecordWildCards #-} import Control.Monad (when, unless) import Control.Monad.IO.Class (liftIO)@@ -6,7 +7,11 @@ import qualified Data.Conduit as C import qualified Data.Conduit.Binary as CB import Data.Time.LocalTime (localTimeToUTC, utc)-import System.Directory (createDirectoryIfMissing, setModificationTime)+import System.Directory (createDirectoryIfMissing+#if MIN_VERSION_directory(1,2,3)+ , setModificationTime+#endif+ ) import System.Environment (getProgName, getArgs) import System.Exit (exitFailure) import System.FilePath.Posix (takeDirectory) -- zip files only use forward slashes@@ -26,7 +31,9 @@ mapM_ (liftIO . hSetFileSize h . toInteger) zipEntrySize write C..| CB.sinkHandle h liftIO $ hClose h+#if MIN_VERSION_directory(1,2,3) liftIO $ setModificationTime name $ localTimeToUTC utc zipEntryTime -- FIXME: timezone+#endif where name = BSC.unpack $ BSC.dropWhile ('/' ==) zipEntryName -- should we utf8 decode? start (Right _) = fail "Unexpected leading or directory data contents" write = C.await >>= maybe
cmd/zip.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} import Control.Monad (filterM, void) import Control.Monad.IO.Class (MonadIO, liftIO) import Control.Monad.Trans.Resource (MonadResource, runResourceT)@@ -7,7 +8,13 @@ import Data.List (foldl') import Data.Time.LocalTime (utcToLocalTime, utc) import qualified System.Console.GetOpt as Opt-import System.Directory (doesDirectoryExist, getModificationTime, isSymbolicLink, listDirectory)+import System.Directory (doesDirectoryExist, getModificationTime+#if MIN_VERSION_directory(1,2,6)+ , isSymbolicLink, listDirectory+#else+ , getDirectoryContents+#endif+ ) import System.Environment (getProgName, getArgs) import System.Exit (exitFailure) import System.FilePath.Posix ((</>)) -- zip files only want forward slashes@@ -38,7 +45,11 @@ isd <- liftIO $ doesDirectoryExist p if isd then do+#if MIN_VERSION_directory(1,2,6) dl <- liftIO $ filterM (fmap not . isSymbolicLink) . map (p </>) =<< listDirectory p+#else+ dl <- liftIO $ filter (`notElem` [".",".."]) . map (p </>) <$> getDirectoryContents p+#endif C.yield (e{ zipEntryName = zipEntryName e `BSC.snoc` '/', zipEntrySize = Just 0 }, mempty) generate $ dl ++ paths else do
zip-stream.cabal view
@@ -1,5 +1,5 @@ name: zip-stream-version: 0.1+version: 0.1.0.1 synopsis: ZIP archive streaming using conduits description: Process (extract and create) zip files as streams (e.g., over the network), accessing contained files without having to write the zip file to disk (unlike zip-conduit). license: BSD3@@ -7,7 +7,7 @@ author: Dylan Simon maintainer: dylan@dylex.net copyright: 2017-category: Codec+category: Codec, Conduit build-type: Simple cabal-version: >=1.10 @@ -46,13 +46,14 @@ default-language: Haskell2010 ghc-options: -Wall build-depends:- base >=4.7 && <5,+ base >=4.8 && <5, bytestring, conduit, conduit-extra, directory, filepath, time,+ transformers, zip-stream executable zip-stream@@ -61,7 +62,7 @@ default-language: Haskell2010 ghc-options: -Wall build-depends:- base >=4.7 && <5,+ base >=4.8 && <5, bytestring, conduit, conduit-extra,@@ -69,4 +70,5 @@ filepath, resourcet, time,+ transformers, zip-stream