packages feed

apotiki-0.5.1: System/Apotiki/Tar.hs

module System.Apotiki.Tar (getControl, getStrictControl) where
import Data.List
import qualified Data.Map as M
import qualified Codec.Archive.Tar as Tar
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString.Lazy.Char8 as BC
import qualified Codec.Compression.GZip as Z

tarEntryList :: Tar.Entries Tar.FormatError -> [Tar.Entry] -> [Tar.Entry]
tarEntryList entries outlist =
  case entries of
    Tar.Next entry (more) -> (tarEntryList more (entry:outlist))
    Tar.Done -> outlist
    Tar.Fail e -> error (show e)

tarEntryPayload :: Tar.EntryContent -> String
tarEntryPayload (Tar.NormalFile payload size) = BC.unpack payload

getStrictControl :: BS.ByteString -> String
getStrictControl content =
  getControl $ B.fromChunks [content]

getControl :: B.ByteString -> String
getControl content =
  tarEntryPayload $ Tar.entryContent entry
    where unzipped = Z.decompress content
          entries = tarEntryList (Tar.read unzipped) []
          entry = case find ((== "./control") . Tar.entryPath) entries of
            Just entry -> entry
            Nothing -> error (show $ map Tar.entryPath entries)