sak 0.1.3.0 → 0.1.3.1
raw patch · 8 files changed
+87/−21 lines, 8 files
Files
- CHANGELOG.md +4/−0
- man/sak.1 +3/−1
- sak.cabal +13/−14
- src/Compression.cpphs +1/−2
- src/Compression/Type.cpphs +25/−0
- src/Detect.hs +1/−0
- src/Info.cpphs +2/−2
- src/Main.hs +38/−2
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)