@@ -8,10 +8,11 @@ module Stack.Clean
88 ) where
99
1010import Control.Exception (Exception )
11+ import Control.Monad (when )
1112import Control.Monad.Catch (MonadThrow ,throwM )
1213import Control.Monad.IO.Class (MonadIO )
1314import Control.Monad.Logger (MonadLogger )
14- import Control.Monad.Reader (MonadReader )
15+ import Control.Monad.Reader (MonadReader , asks )
1516import Data.Foldable (forM_ )
1617import Data.List ((\\) ,intercalate )
1718import qualified Data.Map.Strict as Map
@@ -20,8 +21,8 @@ import Data.Typeable (Typeable)
2021import Path.IO (removeTreeIfExists )
2122import Stack.Build.Source (getLocalPackageViews )
2223import Stack.Build.Target (LocalPackageView (.. ))
23- import Stack.Constants (distDirFromDir )
24- import Stack.Types (HasEnvConfig ,PackageName )
24+ import Stack.Constants (distDirFromDir , workDirFromDir )
25+ import Stack.Types (HasEnvConfig ,PackageName , bcWorkDir , getBuildConfig )
2526
2627
2728-- | Reset the build, i.e. remove the @dist@ directory
3334 :: (MonadThrow m , MonadIO m , MonadReader env m , HasEnvConfig env , MonadLogger m )
3435 => CleanOpts
3536 -> m ()
36- clean (CleanOpts targets) = do
37+ clean (CleanTargets targets) =
38+ cleanup targets False
39+ clean (CleanFull _ ) =
40+ cleanup [] True
41+
42+ cleanup
43+ :: (MonadThrow m , MonadIO m , MonadReader env m , HasEnvConfig env , MonadLogger m )
44+ => [PackageName ] -> Bool
45+ -> m ()
46+ cleanup targets doFullClean = do
3747 locals <- getLocalPackageViews
3848 case targets \\ Map. keys locals of
3949 [] -> do
@@ -42,16 +52,24 @@ clean (CleanOpts targets) = do
4252 then Map. elems locals -- default to cleaning all local packages
4353 else mapMaybe (`Map.lookup` locals) targets
4454 forM_ lpvs $ \ (LocalPackageView {lpvRoot = pkgDir},_) -> do
45- distDir <- distDirFromDir pkgDir
46- removeTreeIfExists distDir
55+ let delDir =
56+ if doFullClean
57+ then workDirFromDir pkgDir
58+ else distDirFromDir pkgDir
59+ removeTreeIfExists =<< delDir
60+ when doFullClean $ do
61+ bconfig <- asks getBuildConfig
62+ bcwd <- bcWorkDir bconfig
63+ removeTreeIfExists bcwd
4764 pkgs -> throwM (NonLocalPackages pkgs)
4865
4966-- | Options for cleaning a project.
50- newtype CleanOpts = CleanOpts
67+ data CleanOpts = CleanTargets
5168 { cleanOptsTargets :: [PackageName ]
5269 -- ^ Names of the packages to clean.
5370 -- If the list is empty, every local package should be cleaned.
5471 }
72+ | CleanFull { cleanOptsFull :: Bool }
5573
5674-- | Exceptions during cleanup.
5775newtype StackCleanException
0 commit comments