packages feed

sak 0.1.3.0 → 0.1.3.1

raw patch · 8 files changed

+87/−21 lines, 8 files

Files

CHANGELOG.md view
@@ -1,5 +1,9 @@ # sak +## 0.1.3.1++  * Add `size` subcommand to show hypothetical compression+ ## 0.1.3.0    * Preserve file permissions
man/sak.1 view
@@ -1,4 +1,4 @@-.\" Automatically generated by Pandoc 2.10+.\" Automatically generated by Pandoc 2.13 .\" .TH "sak (1)" "" "" "" "" .hy@@ -31,6 +31,8 @@ \f[B]matrix\f[R] - Generate multiple compressed files in various formats .PP \f[B]recompress\f[R] - Recompress a file in-memory.+.PP+\f[B]size\f[R] - Show hypothetical compressed size for a file .PP \f[B]info\f[R] - Guess a file format (for debugging) .SH OPTIONS
sak.cabal view
@@ -1,9 +1,9 @@ cabal-version:      1.18 name:               sak-version:            0.1.3.0+version:            0.1.3.1 license:            BSD3 license-file:       LICENSE-copyright:          Copyright: (c) 2020 Vanessa McHale+copyright:          Copyright: (c) 2020-2021 Vanessa McHale maintainer:         vamchale@gmail.com author:             Vanessa McHale bug-reports:        https://hub.darcs.net/vmchale/sak/issues@@ -34,7 +34,7 @@  executable sak     main-is:            Main.hs-    build-tool-depends: cpphs:cpphs -any+    build-tool-depends: cpphs:cpphs     hs-source-dirs:     src     other-modules:         Version@@ -46,33 +46,32 @@         Detect         Paths_sak -    autogen-modules:    Paths_sak     default-language:   Haskell2010     ghc-options:        -Wall -threaded -rtsopts "-with-rtsopts=-N -qg"     build-depends:         base >=4.9 && <5,         lzlib >=1.0.7.0,         bz2 >=0.1.1.0,-        zlib -any,-        zstd -any,-        lzma -any,+        zlib,+        zstd,+        lzma,         lz4-hs >=0.1.4.0,-        optparse-applicative -any,-        filepath -any,-        bytestring -any,+        optparse-applicative,+        filepath,+        bytestring,         directory >=1.3.1.0,-        parallel-io -any,+        parallel-io,         lzo >=0.1.1.0,-        unix-compat -any+        unix-compat      if flag(with-snappy)-        build-depends: snappy-lazy -any+        build-depends: snappy-lazy      if flag(with-snappy)         cpp-options: -DSNAPPY      if flag(with-brotli)-        build-depends: brotli -any+        build-depends: brotli      if flag(with-brotli)         cpp-options: -DBROTLI
src/Compression.cpphs view
@@ -1,5 +1,4 @@-module Compression ( Compression (..)-                   , detectCompression+module Compression ( detectCompression                    , toCompressor                    , toDecompressor                    , toFileCompressor
src/Compression/Type.cpphs view
@@ -1,4 +1,5 @@ module Compression.Type ( Compression (..)+                        , parseCompression                         ) where  data Compression = Lzma@@ -18,3 +19,27 @@                  | Lrzip                  | None                  deriving (Show, Enum)++parseCompression :: String -> Compression+parseCompression "lzma"   = Lzma+parseCompression "xz"     = Lzma+parseCompression "bz2"    = BZip+parseCompression "bzip2"  = BZip+parseCompression "bzip"   = BZip+parseCompression "gzip"   = GZip+parseCompression "zstd"   = Zstd+#ifdef BROTLI+parseCompression "brotli" = Brotli+#endif+#ifdef SNAPPY+parseCompression "snappy" = Snappy+parseCompression "sz"     = Snappy+parseCompression "szip"   = Snappy+#endif+parseCompression "lzo"    = Lzo+parseCompression "lz4"    = Lz4+parseCompression "zlib"   = Z+parseCompression "lrzip"  = Lrzip+parseCompression "lzip"   = Lzip+parseCompression "lz"     = Lzip+parseCompression _        = error "Unrecognized compression format."
src/Detect.hs view
@@ -2,6 +2,7 @@               ) where  import           Compression+import           Compression.Type import qualified Data.ByteString      as BS import qualified Data.ByteString.Lazy as BSL import           Info
src/Info.cpphs view
@@ -1,8 +1,8 @@ module Info ( identify             ) where -import           Compression-import           Data.ByteString as BS+import           Compression.Type+import           Data.ByteString  as BS  identify :: BS.ByteString -> Compression identify bs | lzipMagicBytes `isPrefixOf` bs = Lzip
src/Main.hs view
@@ -4,6 +4,7 @@  import           Compression import           Compression.Level+import           Compression.Type import           Control.Concurrent.ParallelIO.Global (parallel_, stopGlobalPool) import           Control.Monad                        (forM_) import qualified Data.ByteString.Lazy                 as BSL@@ -13,6 +14,7 @@ import           System.Directory                     (getSymbolicLinkTarget, pathIsSymbolicLink) import           System.PosixCompat.Files             (fileMode, getFileStatus, setFileMode) import           System.PosixCompat.Types             (FileMode)+import           Text.Printf                          (printf) import           Version                              (allVersionsString)  reifyPath :: FilePath -> IO FilePath@@ -35,6 +37,7 @@     | Compress !FilePath !FilePath !CompressionLevel     | Recompress !FilePath !CompressionLevel     | Transcode !FilePath !FilePath !CompressionLevel+    | CompressSize !FilePath !CompressionLevel !Compression     | Verify !FilePath     | Matrix !FilePath !CompressionLevel     | Info ![FilePath]@@ -73,10 +76,26 @@                      -> FilePath -- ^ Output                      -> IO () decompressDetectFile inp o = do-    f <- toFileDecompressor <$> (detectFileCompression inp)-    BSL.writeFile o =<< (f inp)+    f <- toFileDecompressor <$> detectFileCompression inp+    BSL.writeFile o =<< f inp     matchPerms inp o +szFile :: Compression+       -> CompressionLevel+       -> FilePath+       -> IO ()+szFile c lvl inp = do+    preComp <- fileSize inp+    res <- BSL.length <$> toFileCompressor c lvl inp+    putStrLn ("Pre-compression: " ++ printB preComp)+    putStrLn ("Post-compression: " ++ printB res)++printB :: (Show a, Integral a) => a -> String+printB b | b >= 1024 ^ (3 :: Int) = printf "%.3f" ((realToFrac b :: Double) / (1024 ^ (3 :: Int))) ++ " GB"+         | b >= 1024 ^ (2 :: Int) = printf "%.3f" ((realToFrac b :: Double) / (1024 ^ (2 :: Int))) ++ " MB"+         | b >= 1024 = printf "%.3f" ((realToFrac b :: Double) / 1024) ++ " kB"+         | otherwise = show b ++ " b"+ compressFile :: CompressionLevel              -> FilePath -- ^ Input file              -> FilePath -- ^ Compressed output@@ -101,6 +120,7 @@ run (Decompress i Nothing)      = flip decompressFile (uncompressedExt i) =<< reifyPath i run (Decompress i (Just o))     = flip decompressDetectFile o =<< reifyPath i run (Compress i o lvl)          = flip (compressFile lvl) o =<< reifyPath i+run (CompressSize fp lvl c)     = szFile c lvl fp run (Transcode i o lvl)         = do     cO <- detectFileCompression o     guessSz <- case cO of@@ -129,6 +149,15 @@ verify :: Parser Command verify = Verify <$> inpFile +compressionP :: Parser Compression+compressionP = parseCompression <$>+    strOption+    (long "compression"+    <> completer (listCompleter ["lzip", "zstd", "lz4", "lzo", "xz"])+    <> metavar "ALGORITHM"+    <> help "Compression format to use"+    )+ compressionLevel :: Parser CompressionLevel compressionLevel =         compressCustom@@ -185,6 +214,12 @@     <*> fileHelp "Compressed output"     <*> compressionLevel +compressSize :: Parser Command+compressSize = CompressSize+    <$> fileHelp "File"+    <*> compressionLevel+    <*> compressionP+ fileHelp :: String -> Parser FilePath fileHelp helpTxt =     argument str@@ -201,6 +236,7 @@     <> command "matrix" (info matrix (progDesc "Compress a file to all available formats"))     <> command "recompress" (info recompress (progDesc "Recompress a file (for instance, to compress it at a higher level)"))     <> command "info" (info infoFile (progDesc "Guess file compression"))+    <> command "size" (info compressSize (progDesc "Show compressed file size"))     )  versionMod :: Parser (a -> a)