{-# LANGUAGE TupleSections #-} module Audit ( audit ) where import Audit.Latest import Audit.Panic import Control.Monad import Data.Maybe import Data.Version import Distribution.Package import Distribution.PackageDescription import Distribution.PackageDescription.Parse import Distribution.Text import Distribution.Verbosity import Distribution.Version import Text.Printf audit :: FilePath -> IO () audit f = do pkgDesc <- readPackageDescription deafening f mapM_ (auditChunk id) (fmap ("library",) $ maybeToList $ condLibrary pkgDesc) mapM_ (auditChunk (printf "executable %s")) (condExecutables pkgDesc) mapM_ (auditChunk (printf "test suite %s")) (condTestSuites pkgDesc) mapM_ (auditChunk (printf "benchmark %s")) (condBenchmarks pkgDesc) auditChunk :: (String -> String) -> (String, CondTree ConfVar [Dependency] a) -> IO () auditChunk f (e,m) = do putStrLn (f $ bold e) allOk <- mapM auditDep $ condTreeConstraints m when (and allOk) $ putStrLn $ success "ok!" auditDep :: Dependency -> IO Bool auditDep (Dependency (PackageName n) v) | n == "base" = return True | otherwise = do latest <- getLatestVersionOf n unless (withinRange latest v) $ printf "%s\n latest: %s\n requested: %s\n" (warning n) (showVersion latest) (display v) return (withinRange latest v)