Skip to content

Commit dad32be

Browse files
committed
first complete version
1 parent 013173d commit dad32be

File tree

3 files changed

+50
-26
lines changed

3 files changed

+50
-26
lines changed

src/Main.hs

+1-8
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,4 @@ module Main where
33
import Stack2Cabal
44

55
main :: IO ()
6-
main = do
7-
config <- parseConfig
8-
print config
9-
{-
10-
[dir] <- getArgs
11-
withLog ("processing folder '" ++ dir ++ "'") $
12-
writeCabalProject dir
13-
-}
6+
main = parseConfig >>= configCabal

src/Stack2Cabal.hs

+45-17
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1+
{-# LANGUAGE RecordWildCards #-}
2+
13
module Stack2Cabal
2-
( module Stack2Cabal.Compiler
3-
, module Stack2Cabal.Config
4-
, module Stack2Cabal.Constraints
5-
, module Stack2Cabal.Git
6-
, module Stack2Cabal.Packages
7-
, module Stack2Cabal.Util
8-
, writeCabalProject
4+
( parseConfig
5+
, configCabal
96
) where
107

8+
import Control.Monad (when, forM_)
9+
import Data.Maybe (mapMaybe)
1110
import System.Directory (doesPathExist)
1211
import System.FilePath ((</>), (<.>))
1312
import System.IO (withFile, IOMode (WriteMode), hPutStrLn)
@@ -19,14 +18,43 @@ import Stack2Cabal.Git
1918
import Stack2Cabal.Packages
2019
import Stack2Cabal.Util
2120

22-
writeCabalProject :: FilePath -> IO ()
23-
writeCabalProject dir = do
24-
let file = dir </> "cabal" <.> "project"
21+
configCabal :: Config -> IO ()
22+
configCabal cnf@Config{..} =
23+
withLog ("creating cabal config for project folder '" ++ cnfProjectDir ++ "'") $ do
24+
packages <- parseStackYaml cnfProjectDir
25+
writeCabalProject cnf packages
26+
handleGitDependencies cnf packages
27+
28+
writeCabalProject :: Config -> [Package] -> IO ()
29+
writeCabalProject Config{..} packages = do
30+
let file = cnfProjectDir </> "cabal" <.> "project"
2531
b <- doesPathExist file
26-
if b then putLogLn "cabal project file already exists"
27-
else withLog "writing cabal project file" $
28-
withFile file WriteMode $ \h -> do
29-
ps <- writePackagesBlock "git-packages" <$> parseStackYaml dir
30-
cs <- writeCompilerBlock <$> getCompiler dir
31-
ds <- writeConstraintsBlock <$> getConstraints dir
32-
mapM_ (hPutStrLn h) $ ps ++ cs ++ ds
32+
case (b, cnfCabalProject) of
33+
(True, Force) -> wcp file
34+
(True, Yes) -> putLogLn "cabal.project already exists"
35+
(False, Force) -> wcp file
36+
(False, Yes) -> wcp file
37+
(_, No) -> return ()
38+
where
39+
wcp :: FilePath -> IO ()
40+
wcp file = withLog "writing cabal.project" $
41+
withFile file WriteMode $ \h -> do
42+
let ps = writePackagesBlock gitFolder packages -- <$> parseStackYaml cnfProjectDir
43+
cs <- writeCompilerBlock <$> getCompiler cnfProjectDir
44+
ds <- writeConstraintsBlock <$> getConstraints cnfProjectDir
45+
mapM_ (hPutStrLn h) $ ps ++ cs ++ ds
46+
47+
handleGitDependencies :: Config -> [Package] -> IO ()
48+
handleGitDependencies Config{..} packages =
49+
when cnfGitDependencies $ do
50+
let dir = cnfProjectDir </> gitFolder
51+
gs = mapMaybe filterGit packages
52+
forM_ gs $ \git ->
53+
cloneAndCheckoutGit dir git
54+
where
55+
filterGit :: Package -> Maybe Git
56+
filterGit (GitPackage git) = Just git
57+
filterGit (LocalPackage _) = Nothing
58+
59+
gitFolder :: FilePath
60+
gitFolder = ".stack2cabal"

src/Stack2Cabal/Git.hs

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import qualified Data.Attoparsec.Text as A
1414
import Data.Text (Text, pack, unpack)
1515
import GHC.IO.Exception (userError)
1616
import System.FilePath ((</>))
17-
import System.Directory (withCurrentDirectory, doesDirectoryExist)
17+
import System.Directory (withCurrentDirectory,
18+
doesDirectoryExist,
19+
createDirectoryIfMissing)
1820
import System.Process (callProcess)
1921

2022
import Stack2Cabal.Util (withLog, putLogLn)
@@ -44,6 +46,7 @@ gitNameIO git = case gitName git of
4446
cloneAndCheckoutGit :: FilePath -> Git -> IO ()
4547
cloneAndCheckoutGit dir git@Git{..} =
4648
withLog ("handling git " ++ show git) $ do
49+
createDirectoryIfMissing False dir
4750
name <- unpack <$> gitNameIO git
4851
let url = unpack gitUrl
4952
dir' = dir </> name

0 commit comments

Comments
 (0)