haskdeep-0.1.0.0: src/HaskDeep/KnownHash/Writer.hs
{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module : HaskDeep.Computation.Writer
-- Copyright : Mauro Taraborelli 2012
-- License : BSD3
--
-- Maintainer : maurotaraborelli@gmail.com
-- Stability : experimental
-- Portability : unknown
--
-- Computes hashes traversing recursively through a directory structure.
-- Uses a list of known hashes to audit a set of files.
--
-- Internal module.
module HaskDeep.KnownHash.Writer
(
-- * Write the known hashes file
writeHashes -- HaskDeepConfiguration -> HashSet -> IO ()
)
where
import Prelude hiding (FilePath)
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as B8
import Data.Conduit (($$))
import qualified Data.Conduit as C
import qualified Data.Conduit.Filesystem as CF
import qualified Data.Conduit.List as CL
import Data.Text ()
import qualified Data.Text.Encoding as TE
import Filesystem.Path ()
import qualified Filesystem.Path.CurrentOS as FSC
import HaskDeep.Configuration
import HaskDeep.HashSet (HashSet)
import qualified HaskDeep.HashSet as HS
-- | Write an @HashSet@ to a known hashes file.
writeHashes :: HaskDeepConfiguration -- ^ Configuration
-> HashSet -- ^ @HashSet@ to write
-> IO ()
writeHashes conf hs = C.runResourceT $ CL.sourceList bs_known $$ CF.sinkFile (knownHashes conf)
where
newline = "\n" :: ByteString
root = TE.encodeUtf8 $ either id id $ FSC.toText $ rootDirectory conf
ignore = case ignoreRule conf of
(Just rule) -> TE.encodeUtf8 rule
Nothing -> BS.empty
files_count = B8.pack $ show $ HS.filesCount hs
size_sum = B8.pack $ show $ HS.sizeSum hs
known_header1 = "%%%% HASHDEEP-1.0"
`BS.append` newline
known_header2 = "%%%% size,"
`BS.append` TE.encodeUtf8 (HS.compSymbol hs)
`BS.append` ",filename"
`BS.append` newline
bs_comments = map (flip BS.append newline . BS.append "## ")
[ "Root directory: " `BS.append` root
, "Ignore rule : " `BS.append` ignore
, "Files count : " `BS.append` files_count
, "Files size : " `BS.append` size_sum
, "" ]
bs_hash_set = map (flip BS.append newline . HS.toByteString) $ HS.toAscList hs
bs_known = [known_header1, known_header2] ++ bs_comments ++ bs_hash_set