gdo 0.1.4 → 0.1.5
raw patch · 3 files changed
+54/−23 lines, 3 files
Files
Lib.hs view
@@ -15,6 +15,8 @@ , recordMissingDependency , purgeRecordedDependencies , getHashesAndDepsForTarget+ , getInvocationDir+ , setInvocationDir ) where @@ -30,8 +32,8 @@ import qualified Prelude import Prelude hiding (fail,readFile) import System.Directory (getCurrentDirectory, makeAbsolute, doesFileExist, renameFile, removeFile, createDirectoryIfMissing, getDirectoryContents, removeDirectoryRecursive, withCurrentDirectory, doesDirectoryExist)-import System.Environment (getEnvironment,lookupEnv)-import System.Exit (ExitCode(ExitSuccess),exitFailure)+import System.Environment (getEnvironment,lookupEnv,setEnv)+import System.Exit (ExitCode(ExitSuccess)) import System.FilePath ((</>), takeBaseName, dropFileName, replaceBaseName, addExtension,splitSearchPath) import System.IO (hPutStrLn,stderr,hPutStr,withFile,IOMode(ReadMode,WriteMode,AppendMode),hFileSize) import qualified System.Process as Proc (env, waitForProcess, createProcess, proc)@@ -94,7 +96,6 @@ if code /= ExitSuccess then do putStrLnErr $ "*** redo failed for target "++show target- exitFailure else do filesize <- getFileSize tempFilePath when (filesize /= 0) $ renameFile tempFilePath target return code@@ -138,6 +139,17 @@ getDefaultDirs :: (MonadIO m) => m [FilePath] getDefaultDirs = maybe [] splitSearchPath <$> liftIO (lookupEnv "GDO_DEFAULTS")++gdoInvocationDir :: String+gdoInvocationDir = "GDO_INVOCATION_DIR"++getInvocationDir :: (MonadIO m) => m (Maybe FilePath)+getInvocationDir =+ liftIO $ lookupEnv gdoInvocationDir++setInvocationDir :: (MonadIO m) => m ()+setInvocationDir =+ liftIO (setEnv gdoInvocationDir =<< getCurrentDirectory) hashFile :: (MonadIO m, MonadFail m) => FilePath -> m Hash hashFile target = do
Main.hs view
@@ -1,16 +1,18 @@-import Control.Exception-import Control.Monad-import Control.Monad.IO.Class-import Control.Monad.Trans.Except-import Data.List-import Data.Maybe-import Data.Monoid-import System.Console.GetOpt-import System.Directory-import System.Environment-import System.Exit-import System.FilePath-import System.IO.Error+import Control.Exception+import Control.Monad+import Control.Monad.IO.Class+import Control.Monad.Trans.Class+import Control.Monad.Trans.Except+import Control.Monad.Trans.Reader+import Data.List+import Data.Maybe+import Data.Monoid+import System.Console.GetOpt+import System.Directory+import System.Environment+import System.Exit+import System.FilePath+import System.IO.Error import Lib @@ -70,8 +72,13 @@ main :: IO () main = do+ invocationDir <-+ fromMaybeM+ (setInvocationDir >> getCurrentDirectory)+ getInvocationDir defaultDirs <- getDefaultDirs- either exitWith (const exitSuccess) =<< runExceptT+ either exitWith (const exitSuccess) =<<+ (flip runReaderT invocationDir . runExceptT) (do (mMode,deps) <- getCliOpts case optsToMode mMode of Just Changed -> do@@ -85,9 +92,14 @@ return () ) +type Redo m = ExceptT ExitCode (ReaderT FilePath m)+ redo :: (MonadIO m) =>- [FilePath] -> FilePath -> ExceptT ExitCode m ()+ [FilePath] -> FilePath -> Redo m () redo mDefaultsDir target = do+ invocationDir <- lift $ ask+ targetRelativePath <- makeRelative invocationDir <$>+ liftIO (makeAbsolute target) targetDoesExist <- liftIO $ doesFileExist target isUpToDate <- upToDate mDefaultsDir target unless (isUpToDate && targetDoesExist) $ do@@ -99,21 +111,28 @@ ("Neither target nor do file found for "++show target) throwE (ExitFailure 1)) (\recipe ->- do liftIO $ putStrLnErr $ "redo "++show target+ do liftIO $ putStrLnErr $ "redo "++show targetRelativePath redoIfCreated mDefaultsDir target (target++".do") redoIfChanged mDefaultsDir target recipe buildResult <- liftIO $ executeRecipe target recipe when (buildResult /= ExitSuccess) (do liftIO $ purgeRecordedDependencies target throwE buildResult)- liftIO $ putStrLnErr $ "redone "++show target)+ liftIO $ putStrLnErr $ "redone "++show targetRelativePath) =<< getRecipeFile mDefaultsDir target +fromMaybeM :: (Monad m) => m a -> m (Maybe a) -> m a+fromMaybeM fallback action = do+ mValue <- action+ case mValue of+ Just value -> return value+ Nothing -> fallback+ redoIfCreated :: (MonadIO m) => [FilePath] -- ^ directory path of defaults -> FilePath -- ^ build target -> FilePath -- ^ path of the dependency- -> ExceptT ExitCode m ()+ -> Redo m () redoIfCreated mDefaultsDir buildTarget dep = do depExists <- liftIO $ doesFileExist dep if depExists@@ -124,7 +143,7 @@ [FilePath] -- ^ directory of defaults -> FilePath -- ^ build target -> FilePath -- ^ path of the dependency- -> ExceptT ExitCode m ()+ -> Redo m () redoIfChanged mDefaultsDir buildTarget dep = do (`withTarget` redo mDefaultsDir) dep liftIO $ recordDependency buildTarget dep
gdo.cabal view
@@ -2,7 +2,7 @@ -- see http://haskell.org/cabal/users-guide/ name: gdo-version: 0.1.4+version: 0.1.5 synopsis: recursive atomic build system description: *gdo* is a build system similar to **GNU Make**. It builds files from