zip-archive 0.3.0.7 → 0.3.1
raw patch · 6 files changed
+102/−100 lines, 6 filessetup-changednew-component:exe:zip-archive
Files
+ Main.hs view
@@ -0,0 +1,90 @@+------------------------------------------------------------------------+-- Zip.hs+-- Copyright (c) 2008 John MacFarlane+-- License : BSD3 (see LICENSE)+--+-- This is a demonstration of the use of the 'Codec.Archive.Zip' library.+-- It duplicates some of the functionality of the 'zip' command-line+-- program.+------------------------------------------------------------------------++import Codec.Archive.Zip+import System.IO+import qualified Data.ByteString.Lazy as B+import System.Exit+import System.Environment+import System.Directory+import System.Console.GetOpt+import Control.Monad ( when )+import Control.Applicative ( (<$>) )+import Data.Version ( showVersion )+import Paths_zip_archive ( version )+import Debug.Trace ( traceShowId )++data Flag+ = Quiet+ | Version+ | Decompress+ | Recursive+ | Remove+ | List+ | Debug+ | Help+ deriving (Eq, Show, Read)++options :: [OptDescr Flag]+options =+ [ Option ['d'] ["decompress"] (NoArg Decompress) "decompress (unzip)"+ , Option ['r'] ["recursive"] (NoArg Recursive) "recursive"+ , Option ['R'] ["remove"] (NoArg Remove) "remove"+ , Option ['l'] ["list"] (NoArg List) "list"+ , Option ['v'] ["version"] (NoArg Version) "version"+ , Option ['q'] ["quiet"] (NoArg Quiet) "quiet"+ , Option [] ["debug"] (NoArg Debug) "debug output"+ , Option ['h'] ["help"] (NoArg Help) "help"+ ]++main :: IO ()+main = do+ argv <- getArgs+ progname <- getProgName+ let header = "Usage: " ++ progname ++ " [OPTION...] archive files..."+ (opts, args) <- case getOpt Permute options argv of+ (o, _, _) | Version `elem` o -> do+ putStrLn ("version " ++ showVersion version)+ exitWith ExitSuccess+ (o, _, _) | Help `elem` o -> error $ usageInfo header options+ (o, (a:as), []) -> return (o, a:as)+ (_, _, errs) -> error $ concat errs ++ "\n" ++ usageInfo header options+ let verbosity = if Quiet `elem` opts then [] else [OptVerbose]+ let debug = Debug `elem` opts+ let cmd = case filter (`notElem` [Quiet, Help, Version, Debug]) opts of+ [] -> Recursive+ (x:_) -> x+ let (archivePath : files) = args+ exists <- doesFileExist archivePath+ archive <- if exists+ then toArchive <$> B.readFile archivePath+ else return emptyArchive+ let showArchiveIfDebug x = if debug+ then traceShowId x+ else x+ case cmd of+ Decompress -> extractFilesFromArchive verbosity $ showArchiveIfDebug archive+ Remove -> do tempDir <- getTemporaryDirectory+ (tempArchivePath, tempArchive) <- openTempFile tempDir "zip"+ B.hPut tempArchive $ fromArchive $ showArchiveIfDebug $+ foldr deleteEntryFromArchive archive files+ hClose tempArchive+ copyFile tempArchivePath archivePath+ removeFile tempArchivePath+ List -> mapM_ putStrLn $ filesInArchive $ showArchiveIfDebug archive+ Recursive -> do when (null files) $ error "No files specified."+ tempDir <- getTemporaryDirectory+ (tempArchivePath, tempArchive) <- openTempFile tempDir "zip"+ addFilesToArchive (verbosity ++ [OptRecursive]) archive files >>=+ B.hPut tempArchive . fromArchive . showArchiveIfDebug+ hClose tempArchive+ copyFile tempArchivePath archivePath+ removeFile tempArchivePath+ _ -> error $ "Unknown command " ++ show cmd
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
− Setup.lhs
@@ -1,11 +0,0 @@-#!/usr/bin/env runhaskell--> module Main ( main ) where->-> import Distribution.Simple-> import Distribution.Simple.Program->-> main :: IO ()-> main = defaultMainWithHooks simpleUserHooks-> { hookedPrograms = [ simpleProgram "zip" ]-> }
− Zip.hs
@@ -1,84 +0,0 @@---------------------------------------------------------------------------- Zip.hs--- Copyright (c) 2008 John MacFarlane--- License : BSD3 (see LICENSE)------ This is a demonstration of the use of the 'Codec.Archive.Zip' library.--- It duplicates some of the functionality of the 'zip' command-line--- program.---------------------------------------------------------------------------import Codec.Archive.Zip-import System.IO-import qualified Data.ByteString.Lazy as B-import System.Exit-import System.Environment-import System.Directory-import System.Console.GetOpt-import Control.Monad ( when )-import Control.Applicative ( (<$>) )-import Data.Version ( showVersion )-import Paths_zip_archive ( version )--data Flag - = Quiet - | Version- | Decompress- | Recursive- | Remove- | List- | Help- deriving (Eq, Show, Read)--options :: [OptDescr Flag]-options =- [ Option ['d'] ["decompress"] (NoArg Decompress) "decompress (unzip)"- , Option ['r'] ["recursive"] (NoArg Recursive) "recursive"- , Option ['R'] ["remove"] (NoArg Remove) "remove"- , Option ['l'] ["list"] (NoArg List) "list"- , Option ['v'] ["version"] (NoArg Version) "version"- , Option ['q'] ["quiet"] (NoArg Quiet) "quiet"- , Option ['h'] ["help"] (NoArg Help) "help"- ]--main :: IO ()-main = do- argv <- getArgs- progname <- getProgName- let header = "Usage: " ++ progname ++ " [OPTION...] archive files..."- (opts, args) <- case getOpt Permute options argv of- (o, _, _) | Version `elem` o -> do- putStrLn ("version " ++ showVersion version)- exitWith ExitSuccess- (o, _, _) | Help `elem` o -> error $ usageInfo header options- (o, (a:as), []) -> return (o, a:as)- (_, _, errs) -> error $ concat errs ++ "\n" ++ usageInfo header options- let verbosity = if Quiet `elem` opts then [] else [OptVerbose]- let cmd = take 1 $ filter (`notElem` [Quiet, Help, Version]) opts- let cmd' = if null cmd- then Recursive- else head cmd- let (archivePath : files) = args- exists <- doesFileExist archivePath- archive <- if exists- then toArchive <$> B.readFile archivePath- else return emptyArchive- case cmd' of- Decompress -> extractFilesFromArchive verbosity archive - Remove -> do tempDir <- getTemporaryDirectory- (tempArchivePath, tempArchive) <- openTempFile tempDir "zip" - B.hPut tempArchive $ fromArchive $ - foldr deleteEntryFromArchive archive files- hClose tempArchive- copyFile tempArchivePath archivePath- removeFile tempArchivePath- List -> mapM_ putStrLn $ filesInArchive archive- Recursive -> do when (null files) $ error "No files specified."- tempDir <- getTemporaryDirectory- (tempArchivePath, tempArchive) <- openTempFile tempDir "zip" - addFilesToArchive (verbosity ++ [OptRecursive]) archive files >>= - B.hPut tempArchive . fromArchive- hClose tempArchive- copyFile tempArchivePath archivePath- removeFile tempArchivePath- _ -> error "Unknown command"
changelog view
@@ -1,3 +1,9 @@+zip-archive 0.3.1++ * Don't use a custom build (#28).+ * Renamed executable Zip -> zip-archive, added --debug option.+ The --debug option prints the intermediate Haskell data structure.+ zip-archive 0.3.0.7 * Fix check for unix file attributes (#34).
zip-archive.cabal view
@@ -1,7 +1,7 @@ Name: zip-archive-Version: 0.3.0.7+Version: 0.3.1 Cabal-Version: >= 1.10-Build-type: Custom+Build-type: Simple Synopsis: Library for creating and modifying zip archives. Description: The zip-archive library provides functions for creating, modifying, and extracting files from zip archives.@@ -42,12 +42,12 @@ else Build-depends: unix -Executable Zip+Executable zip-archive if flag(executable) Buildable: True else Buildable: False- Main-is: Zip.hs+ Main-is: Main.hs Hs-Source-Dirs: . Build-Depends: base >= 4.2 && < 5, directory >= 1.1, bytestring >= 0.9.0, zip-archive@@ -64,7 +64,6 @@ HUnit, zip-archive, temporary Default-Language: Haskell98 Ghc-Options: -Wall- Build-Tools: zip if os(windows) cpp-options: -D_WINDOWS else