Skip to content

Commit cee18eb

Browse files
Merge pull request #1780 from achernyak/stack-init
Have "stack init" accept a list of sub-directories
2 parents 4fc1b8d + ea8e85b commit cee18eb

File tree

2 files changed

+41
-30
lines changed

2 files changed

+41
-30
lines changed

src/Stack/Init.hs

+16-11
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ import Control.Monad
1313
import Control.Monad.Catch (MonadMask, throwM)
1414
import Control.Monad.IO.Class
1515
import Control.Monad.Logger
16-
import Control.Monad.Reader (asks, MonadReader)
16+
import Control.Monad.Reader (MonadReader, asks)
1717
import Control.Monad.Trans.Control (MonadBaseControl)
1818
import qualified Data.ByteString.Builder as B
19-
import qualified Data.ByteString.Lazy as L
2019
import qualified Data.ByteString.Char8 as BC
20+
import qualified Data.ByteString.Lazy as L
21+
import qualified Data.Foldable as F
2122
import Data.Function (on)
2223
import qualified Data.HashMap.Strict as HM
2324
import qualified Data.IntMap as IntMap
24-
import qualified Data.Foldable as F
2525
import Data.List (intersect, maximumBy)
2626
import Data.List.Extra (nubOrd)
2727
import Data.Map (Map)
@@ -35,13 +35,13 @@ import Network.HTTP.Client.Conduit (HasHttpManager)
3535
import Path
3636
import Path.IO
3737
import Stack.BuildPlan
38+
import Stack.Config (getSnapshots,
39+
makeConcreteResolver)
3840
import Stack.Constants
3941
import Stack.Solver
4042
import Stack.Types
41-
import Stack.Types.Internal ( HasTerminal, HasReExec
42-
, HasLogLevel)
43-
import Stack.Config ( getSnapshots
44-
, makeConcreteResolver)
43+
import Stack.Types.Internal (HasLogLevel, HasReExec,
44+
HasTerminal)
4545
import qualified System.FilePath as FP
4646

4747
-- | Generate stack.yaml
@@ -57,6 +57,7 @@ initProject
5757
initProject currDir initOpts mresolver = do
5858
let dest = currDir </> stackDotYaml
5959

60+
dirs <- mapM (resolveDir' . T.unpack) (searchDirs initOpts)
6061
reldest <- toFilePath `liftM` makeRelativeToCurrentDir dest
6162

6263
exists <- doesFileExist dest
@@ -67,8 +68,10 @@ initProject currDir initOpts mresolver = do
6768

6869
let noPkgMsg = "In order to init, you should have an existing .cabal \
6970
\file. Please try \"stack new\" instead."
70-
71-
cabalfps <- findCabalFiles (includeSubDirs initOpts) currDir
71+
let findCabalFiles' = findCabalFiles (includeSubDirs initOpts)
72+
cabalfps <- if null dirs
73+
then findCabalFiles' currDir
74+
else liftM concat $ mapM findCabalFiles' dirs
7275
(bundle, dupPkgs) <- cabalPackagesCheck cabalfps noPkgMsg Nothing
7376

7477
(r, flags, extraDeps, rbundle) <- getDefaultResolver dest initOpts
@@ -435,12 +438,14 @@ getRecommendedSnapshots snapshots = do
435438
]
436439

437440
data InitOpts = InitOpts
438-
{ useSolver :: Bool
441+
{ useSolver :: Bool
439442
-- ^ Use solver to determine required external dependencies
440-
, omitPackages :: Bool
443+
, omitPackages :: Bool
441444
-- ^ Exclude conflicting or incompatible user packages
442445
, forceOverwrite :: Bool
443446
-- ^ Overwrite existing stack.yaml
444447
, includeSubDirs :: Bool
445448
-- ^ If True, include all .cabal files found in any sub directories
449+
, searchDirs :: ![T.Text]
450+
-- ^ List of sub directories to search for .cabal files
446451
}

src/Stack/Options.hs

+25-19
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
{-# LANGUAGE OverloadedStrings,RecordWildCards #-}
1+
{-# LANGUAGE OverloadedStrings #-}
2+
{-# LANGUAGE RecordWildCards #-}
23

34
module Stack.Options
45
(BuildCommand(..)
@@ -26,32 +27,32 @@ module Stack.Options
2627
,globalOptsFromMonoid
2728
) where
2829

29-
import Control.Monad.Logger (LogLevel(..))
30-
import Data.Char (isSpace, toLower)
31-
import Data.List (intercalate)
32-
import Data.List.Split (splitOn)
33-
import qualified Data.Map as Map
34-
import Data.Map.Strict (Map)
35-
import qualified Data.Map.Strict as M
30+
import Control.Monad.Logger (LogLevel (..))
31+
import Data.Char (isSpace, toLower)
32+
import Data.List (intercalate)
33+
import Data.List.Split (splitOn)
34+
import qualified Data.Map as Map
35+
import Data.Map.Strict (Map)
36+
import qualified Data.Map.Strict as M
3637
import Data.Maybe
3738
import Data.Monoid
38-
import qualified Data.Set as Set
39-
import qualified Data.Text as T
40-
import Data.Text.Read (decimal)
41-
import Distribution.Version (anyVersion)
39+
import qualified Data.Set as Set
40+
import qualified Data.Text as T
41+
import Data.Text.Read (decimal)
42+
import Distribution.Version (anyVersion)
4243
import Options.Applicative
4344
import Options.Applicative.Args
4445
import Options.Applicative.Builder.Extra
45-
import Options.Applicative.Types (fromM, oneM, readerAsk)
46-
import Stack.Clean (CleanOpts(..))
47-
import Stack.Config (packagesParser)
46+
import Options.Applicative.Types (fromM, oneM, readerAsk)
47+
import Stack.Clean (CleanOpts (..))
48+
import Stack.Config (packagesParser)
4849
import Stack.ConfigCmd
49-
import Stack.Constants (stackProgName)
50-
import Stack.Coverage (HpcReportOpts(..))
50+
import Stack.Constants (stackProgName)
51+
import Stack.Coverage (HpcReportOpts (..))
5152
import Stack.Docker
52-
import qualified Stack.Docker as Docker
53+
import qualified Stack.Docker as Docker
5354
import Stack.Dot
54-
import Stack.Ghci (GhciOpts(..))
55+
import Stack.Ghci (GhciOpts (..))
5556
import Stack.Init
5657
import Stack.New
5758
import Stack.Nix
@@ -682,7 +683,12 @@ initOptsParser :: Parser InitOpts
682683
initOptsParser =
683684
InitOpts <$> solver <*> omitPackages
684685
<*> overwrite <*> fmap not ignoreSubDirs
686+
<*> searchDirs
685687
where
688+
searchDirs =
689+
many (textArgument
690+
(metavar "DIRS" <>
691+
help "Directories to include, default is current directory."))
686692
ignoreSubDirs = switch (long "ignore-subdirs" <>
687693
help "Do not search for .cabal files in sub directories")
688694
overwrite = switch (long "force" <>

0 commit comments

Comments
 (0)