From 752a3b23b97e24f2b75ae510144c90d85368fe66 Mon Sep 17 00:00:00 2001 From: Joshua Clayton Date: Sat, 2 Jul 2016 07:46:01 -0400 Subject: [PATCH] Remove race conditions checking file existence before reading --- src/Unused/Cache.hs | 12 +++++++----- src/Unused/ResultsClassifier/Config.hs | 11 +++++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Unused/Cache.hs b/src/Unused/Cache.hs index 772f6da..038c7a6 100644 --- a/src/Unused/Cache.hs +++ b/src/Unused/Cache.hs @@ -5,11 +5,13 @@ module Unused.Cache import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans.Reader -import System.Directory import Data.Csv (FromRecord, ToRecord, HasHeader(..), encode, decode) import Data.Vector (toList) +import System.Directory (createDirectoryIfMissing) import qualified Data.ByteString.Lazy as BS +import qualified Data.ByteString.Lazy.Char8 as C import Unused.Cache.DirectoryFingerprint +import Unused.Util (safeReadFile) newtype CacheFileName = CacheFileName String type Cache = ReaderT CacheFileName IO @@ -31,11 +33,11 @@ writeCache contents = do readCache :: FromRecord a => Cache (Maybe [a]) readCache = do (CacheFileName fileName) <- ask - exists <- liftIO $ doesFileExist fileName - if exists - then fmap processCsv (decode NoHeader <$> liftIO (BS.readFile fileName)) - else return Nothing + either + (const Nothing) + (processCsv . decode NoHeader . C.pack) + <$> (liftIO $ safeReadFile fileName) where processCsv = either (const Nothing) (Just . toList) diff --git a/src/Unused/ResultsClassifier/Config.hs b/src/Unused/ResultsClassifier/Config.hs index 1991572..ed5f065 100644 --- a/src/Unused/ResultsClassifier/Config.hs +++ b/src/Unused/ResultsClassifier/Config.hs @@ -4,12 +4,11 @@ module Unused.ResultsClassifier.Config ) where import qualified Data.Yaml as Y -import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as C import qualified Data.Either as E import qualified Data.Bifunctor as B import System.FilePath (()) -import System.Directory (getHomeDirectory, doesFileExist) +import System.Directory (getHomeDirectory) import Paths_unused (getDataFileName) import Unused.ResultsClassifier.Types (LanguageConfiguration, ParseConfigError(..)) import Unused.Util (safeReadFile) @@ -17,11 +16,11 @@ import Unused.Util (safeReadFile) loadConfig :: IO (Either String [LanguageConfiguration]) loadConfig = do configFileName <- getDataFileName ("data" "config.yml") - exists <- doesFileExist configFileName - if exists - then Y.decodeEither <$> BS.readFile configFileName - else return $ Left "default config not found" + either + (const $ Left "default config not found") + (Y.decodeEither . C.pack) + <$> safeReadFile configFileName loadAllConfigurations :: IO (Either [ParseConfigError] [LanguageConfiguration]) loadAllConfigurations = do