packages feed

haskdeep 0.2.0.0 → 0.2.0.1

raw patch · 8 files changed

+82/−90 lines, 8 filesdep +conduit-combinatorsdep +conduit-extradep +directorydep −attoparsec-conduitdep −filesystem-conduitdep −old-localedep ~attoparsecdep ~bytestringdep ~cereal

Dependencies added: conduit-combinators, conduit-extra, directory, filepath, resourcet, transformers, unix-compat

Dependencies removed: attoparsec-conduit, filesystem-conduit, old-locale, system-fileio, system-filepath

Dependency ranges changed: attoparsec, bytestring, cereal, conduit, containers, crypto-api, cryptohash, optparse-applicative, regex-tdfa, text, time

Files

CHANGELOG.md view
@@ -1,3 +1,7 @@+## Version 0.2.0.1 (01 Jun 2015)++- Updated package dependencies+ ## Version 0.2.0.0 (15 Sep 2013)  - Added option -v for version information
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2013 Mauro Taraborelli+Copyright (c) 2015 Mauro Taraborelli  All rights reserved. 
haskdeep.cabal view
@@ -1,10 +1,10 @@ name:                haskdeep-version:             0.2.0.0+version:             0.2.0.1 cabal-version:       >=1.8 build-type:          Simple license:             BSD3 license-file:        LICENSE-copyright:           © 2013 Mauro Taraborelli+copyright:           © 2015 Mauro Taraborelli author:              Mauro Taraborelli maintainer:          maurotaraborelli@gmail.com stability:           experimental@@ -70,27 +70,29 @@     HaskDeep.KnownHash.Reader     HaskDeep.KnownHash.Writer   build-depends:-      attoparsec           ==0.10.*-    , attoparsec-conduit   ==1.0.*+      attoparsec           ==0.13.*     , base                 ==4.*     , base16-bytestring    ==0.1.*-    , bytestring           ==0.9.*-    , cereal               ==0.3.*-    , conduit              ==1.0.*-    , containers           ==0.4.*-    , cryptohash           ==0.10.*+    , bytestring           ==0.10.*+    , cereal               ==0.4.*+    , conduit              ==1.2.*+    , conduit-combinators  ==1.0.*+    , conduit-extra        ==1.1.*+    , containers           ==0.5.*+    , cryptohash           ==0.11.*     , cryptohash-cryptoapi ==0.1.*-    , crypto-api           ==0.12.*+    , crypto-api           ==0.13.*     , crypto-conduit       ==0.5.*-    , filesystem-conduit   ==1.0.*-    , old-locale           ==1.0.*-    , optparse-applicative ==0.5.*-    , system-fileio        ==0.3.*-    , system-filepath      ==0.4.*-    , text                 ==0.11.*-    , time                 ==1.4.*-    , regex-tdfa           ==1.1.*+    , directory            ==1.2.*+    , filepath             ==1.4.*+    , optparse-applicative ==0.11.*+    , resourcet            ==1.1.*+    , text                 ==1.2.*+    , time                 ==1.5.*+    , transformers         ==0.3.*+    , regex-tdfa           ==1.2.*     , regex-tdfa-text      ==1.0.*+    , unix-compat          ==0.4.*   ghc-options: -Wall  source-repository head
src/HaskDeep/Computation.hs view
@@ -22,20 +22,20 @@ where  import           Control.Monad (liftM)-import           Data.Maybe (fromJust)+import           Control.Monad.IO.Class (liftIO)+import           Control.Monad.Trans.Resource (ResourceT, runResourceT) import           Prelude hiding (FilePath)  import           Crypto.Classes (Hash) import qualified Crypto.Conduit as CC import           Data.Conduit (($$))-import qualified Data.Conduit as C-import qualified Data.Conduit.Filesystem as CF-import qualified Data.Conduit.List as CL+import qualified Data.Conduit.Combinators as CCB+import qualified Data.Conduit.Binary as CB import qualified Data.Text as T import           Data.Time (UTCTime)-import qualified Filesystem as FS-import           Filesystem.Path.CurrentOS (FilePath)-import qualified Filesystem.Path.CurrentOS as FSC+import qualified System.Directory as D+import           System.FilePath (FilePath, makeRelative)+import qualified System.PosixCompat.Files as PF import           Text.Regex.TDFA ((=~)) import           Text.Regex.TDFA.Text () @@ -48,7 +48,7 @@ compute :: Hash ctx a => HaskDeepConfiguration         -> ComputationMode a         -> IO HashSet-compute conf cm = CF.traverse False root $$ CL.foldM insert_hash empty_with_symbol+compute conf cm = runResourceT $ CCB.sourceDirectoryDeep False root $$ CCB.foldM insert_hash empty_with_symbol     where       root              = rootDirectory conf       regex             = excludeRegex conf@@ -56,21 +56,20 @@       mod_upto          = includeModUpTo conf       empty_with_symbol = HS.setSymbol (symbol cm) HS.empty -      insert_hash :: HashSet -> FilePath -> IO HashSet-      insert_hash hs fp = do let fpt = fpToText $ relativize root fp-                             fmt <- FS.getModified fp-                             if (excRegex fpt regex) || (excMod fmt mod_from mod_upto)+      insert_hash :: HashSet -> FilePath -> ResourceT IO HashSet+      insert_hash hs fp = do let fpt = T.pack $ makeRelative root fp+                             fmt <- liftIO $ D.getModificationTime fp+                             if excRegex fpt regex || excMod fmt mod_from mod_upto                              then return hs-                             else do s <- FS.getSize fp-                                     h <- liftM (runComputation cm) $ C.runResourceT-                                          $ CF.sourceFile fp $$ CC.sinkHash+                             else do s <- liftIO $ getFileSize fp+                                     h <- liftM (runComputation cm) $ runResourceT+                                          $ CB.sourceFile fp $$ CC.sinkHash                                      return $ HS.insert (HashInfo fpt s h) hs -relativize :: FilePath -> FilePath -> FilePath-relativize root fp = fromJust $ FSC.stripPrefix root fp--fpToText :: FilePath -> T.Text-fpToText = either id id . FSC.toText+getFileSize :: FilePath -> IO Integer+getFileSize path = do+  stat <- PF.getFileStatus path+  return (toInteger $ PF.fileSize stat)  excRegex :: T.Text -> Maybe T.Text -> Bool excRegex fpt (Just rule) = fpt =~ rule
src/HaskDeep/Configuration.hs view
@@ -24,8 +24,7 @@  import           Data.Text (Text) import           Data.Time (UTCTime)-import           Filesystem.Path (FilePath)-import qualified Filesystem.Path.CurrentOS as FSC+import           System.FilePath (FilePath)  -- | HaskDeep configuration. data HaskDeepConfiguration = HaskDeepConfiguration@@ -39,8 +38,8 @@ -- | HaskDeep default configuration. defaultHaskDeepConfiguration :: HaskDeepConfiguration defaultHaskDeepConfiguration = HaskDeepConfiguration-    { rootDirectory   = FSC.decodeString "."-    , knownHashes     = FSC.decodeString "known.haskdeep"+    { rootDirectory   = "."+    , knownHashes     = "known.haskdeep"     , excludeRegex    = Nothing     , includeModFrom  = Nothing     , includeModUpTo  = Nothing
src/HaskDeep/KnownHash/Reader.hs view
@@ -22,6 +22,7 @@  import           Control.Applicative ((<*), many) import           Control.Monad (liftM)+import           Control.Monad.Trans.Resource (runResourceT) import           Data.Maybe(fromJust) import           Data.Word (Word8) import           Prelude hiding (FilePath)@@ -32,12 +33,11 @@ import qualified Data.Attoparsec.Combinator as AC import qualified Data.ByteString.Char8 as B8 import           Data.Conduit (($$))-import qualified Data.Conduit as C import qualified Data.Conduit.Attoparsec as CA-import qualified Data.Conduit.Filesystem as CF+import qualified Data.Conduit.Binary as CB import           Data.Text () import qualified Data.Text.Encoding as TE-import           Filesystem.Path ()+import           System.FilePath ()  import           HaskDeep.Configuration import           HaskDeep.HashSet (HashSet, HashInfo(..))@@ -46,8 +46,8 @@ -- | Read known hashes file into an @HashSet@. readHashes :: HaskDeepConfiguration -- ^ Configuration            -> IO HashSet            -- ^ @HashSet@ red from file-readHashes conf = liftM HS.fromList $ C.runResourceT-                  $ CF.sourceFile (knownHashes conf) $$ CA.sinkParser knownHashesP+readHashes conf = liftM HS.fromList $ runResourceT+                  $ CB.sourceFile (knownHashes conf) $$ CA.sinkParser knownHashesP   -- Parsers
src/HaskDeep/KnownHash/Writer.hs view
@@ -20,21 +20,19 @@     ) where +import           Control.Monad.Trans.Resource (runResourceT) 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.Binary as CB import qualified Data.Conduit.List as CL import qualified Data.Time as DT-import           Data.Text ()+import qualified Data.Text as T import qualified Data.Text.Encoding as TE-import           Filesystem.Path ()-import qualified Filesystem.Path.CurrentOS as FSC-import qualified System.Locale as SL+import           System.FilePath ()  import           HaskDeep.Configuration import           HaskDeep.HashSet (HashSet)@@ -44,18 +42,18 @@ writeHashes :: HaskDeepConfiguration -- ^ Configuration             -> HashSet               -- ^ @HashSet@ to write             -> IO ()-writeHashes conf hs = C.runResourceT $ CL.sourceList bs_known $$ CF.sinkFile (knownHashes conf)+writeHashes conf hs = runResourceT $ CL.sourceList bs_known $$ CB.sinkFile (knownHashes conf)     where       newline          = "\n" :: ByteString-      root             =  TE.encodeUtf8 $ either id id $ FSC.toText $ rootDirectory conf+      root             =  TE.encodeUtf8 $ T.pack $ rootDirectory conf       exclude_regex    = case excludeRegex conf of                            (Just regex) -> TE.encodeUtf8 regex                            Nothing      -> BS.empty       include_mod_from = case includeModFrom conf of-                           (Just modFrom) -> B8.pack $ DT.formatTime SL.defaultTimeLocale "%FT%TZ" modFrom+                           (Just modFrom) -> B8.pack $ DT.formatTime DT.defaultTimeLocale "%FT%TZ" modFrom                            Nothing        -> BS.empty       include_mod_upto = case includeModUpTo conf of-                           (Just modUpTo) -> B8.pack $ DT.formatTime SL.defaultTimeLocale "%FT%TZ" modUpTo+                           (Just modUpTo) -> B8.pack $ DT.formatTime DT.defaultTimeLocale "%FT%TZ" modUpTo                            Nothing        -> BS.empty       files_count      = B8.pack $ show $ HS.filesCount hs       size_sum         = B8.pack $ show $ HS.sizeSum hs
src/Options.hs view
@@ -25,16 +25,13 @@ import           Data.Text (Text) import qualified Data.Text as T import           Data.Time (UTCTime)-import qualified Data.Time as DT-import           Filesystem.Path.CurrentOS (FilePath)-import qualified Filesystem.Path.CurrentOS as FSC+import qualified Data.Time.Format as DTF import           Options.Applicative-import qualified System.Locale as SL  import           HaskDeep  haskdeepVersion :: String-haskdeepVersion = "haskdeep 0.2.0.0 - file hashing and audit"+haskdeepVersion = "haskdeep 0.2.0.1 - file hashing and audit"  data Options = Version              | Options OptExecution OptCompMode HaskDeepConfiguration@@ -55,42 +52,37 @@  configurationP :: Parser HaskDeepConfiguration configurationP = HaskDeepConfiguration-                 <$> nullOption+                 <$> strOption                          ( long "root"                            <> short 'r'                            <> metavar "DIRNAME"                            <> help "Root directory - default current directory"-                           <> reader fpReader                            <> value (rootDirectory defaultHaskDeepConfiguration))-                 <*> nullOption+                 <*> strOption                          ( long "known"                            <> short 'k'                            <> metavar "FILENAME"                            <> help "Known hashes file - default known.haskdeep"-                           <> reader fpReader                            <> value (knownHashes defaultHaskDeepConfiguration))-                 <*> nullOption+                 <*> option (str >>= parseText)                          ( long "excl-regex"                            <> short 'e'                            <> metavar "REGEX"                            <> help "Exclude files or directories based on regex"-                           <> reader regexReader                            <> value (excludeRegex defaultHaskDeepConfiguration)                            <> hidden )-                 <*> nullOption+                 <*> option (str >>= parseTime)                          ( long "incl-mod-from"                            <> short 'f'                            <> metavar "DATE"                            <> help "Include files modified from yyyy-mm-ddThh:mm:ssZ"-                           <> reader timeReader                            <> value (includeModFrom defaultHaskDeepConfiguration)                            <> hidden )-                 <*> nullOption+                 <*> option (str >>= parseTime)                          ( long "incl-mod-upto"                            <> short 't'                            <> metavar "DATE"                            <> help "Include files modified up to yyyy-mm-ddThh:mm:ssZ"-                           <> reader timeReader                            <> value (includeModUpTo defaultHaskDeepConfiguration)                            <> hidden ) @@ -108,31 +100,29 @@                            <> command "audit"                            (info (pure OptAudit)                             (progDesc "Audit files comparing them to known hashes")))-                 <*> nullOption+                 <*> option (str >>= parseOptCompMode)                          ( long "computation"                            <> short 'c'                            <> metavar "MODE"                            <> help "md5 | sha1 | sha256 | skein512 - default md5"-                           <> reader compReader                            <> value OptMD5)                  <*> configurationP ) -compReader :: String -> Either ParseError OptCompMode-compReader "md5"      = Right OptMD5-compReader "sha1"     = Right OptSHA1-compReader "sha256"   = Right OptSHA256-compReader "skein512" = Right OptSkein512-compReader _          = Left ShowHelpText -fpReader :: String -> Either ParseError FilePath-fpReader fp = Right $ FSC.decodeString fp+parseOptCompMode :: String -> ReadM OptCompMode+parseOptCompMode "md5"      = return OptMD5+parseOptCompMode "sha1"     = return OptSHA1+parseOptCompMode "sha256"   = return OptSHA256+parseOptCompMode "skein512" = return OptSkein512+parseOptCompMode _          = readerAbort ShowHelpText -regexReader :: String -> Either ParseError (Maybe Text)-regexReader = Right . Just . T.pack+parseText :: String -> ReadM (Maybe Text)+parseText s = return $ Just $ T.pack s -timeReader :: String -> Either ParseError (Maybe UTCTime)-timeReader dt = case parsedTime of-                  (Just _) -> Right parsedTime-                  Nothing  -> Left ShowHelpText+parseTime :: String -> ReadM (Maybe UTCTime)+parseTime s = case parsedTime of+                (Just _) -> return parsedTime+                Nothing  -> readerAbort ShowHelpText     where-      parsedTime = DT.parseTime SL.defaultTimeLocale "%FT%TZ" dt+      parsedTime = DTF.parseTimeM True DTF.defaultTimeLocale "%FT%TZ" s+