yesod devel uses command line

This commit is contained in:
Michael Snoyman 2011-07-17 21:22:06 +03:00
parent 9adf931c67
commit 2e90d0a6b7
3 changed files with 25 additions and 20 deletions

View File

@ -139,6 +139,7 @@ getFolderContents :: FilePath -> IO [FilePath]
getFolderContents fp = do getFolderContents fp = do
cs <- getDirectoryContents fp cs <- getDirectoryContents fp
let notHidden ('.':_) = False let notHidden ('.':_) = False
notHidden "tmp" = False
notHidden _ = True notHidden _ = True
fmap concat $ forM (filter notHidden cs) $ \c -> do fmap concat $ forM (filter notHidden cs) $ \c -> do
let f = fp ++ '/' : c let f = fp ++ '/' : c

View File

@ -5,6 +5,7 @@ module Scaffold.Devel
import qualified Distribution.Simple.Build as B import qualified Distribution.Simple.Build as B
import Distribution.Simple.Configure (configure) import Distribution.Simple.Configure (configure)
import Distribution.Simple (defaultMainArgs)
import Distribution.Simple.Setup (defaultConfigFlags, configConfigurationsFlags, configUserInstall, Flag (..), defaultBuildFlags, defaultCopyFlags, defaultRegisterFlags) import Distribution.Simple.Setup (defaultConfigFlags, configConfigurationsFlags, configUserInstall, Flag (..), defaultBuildFlags, defaultCopyFlags, defaultRegisterFlags)
import Distribution.Simple.Utils (defaultPackageDesc, defaultHookedPackageDesc) import Distribution.Simple.Utils (defaultPackageDesc, defaultHookedPackageDesc)
import Distribution.Simple.Program (defaultProgramConfiguration) import Distribution.Simple.Program (defaultProgramConfiguration)
@ -30,8 +31,9 @@ import Control.Monad (when, forever)
import System.Process (runCommand, terminateProcess, getProcessExitCode, waitForProcess) import System.Process (runCommand, terminateProcess, getProcessExitCode, waitForProcess)
import qualified Data.IORef as I import qualified Data.IORef as I
import qualified Data.ByteString.Lazy.Char8 as L import qualified Data.ByteString.Lazy.Char8 as L
import System.Directory (doesFileExist, removeFile) import System.Directory (doesFileExist, removeFile, getDirectoryContents)
import Distribution.Package (PackageName (..), pkgName) import Distribution.Package (PackageName (..), pkgName)
import Data.Maybe (mapMaybe)
appMessage :: L.ByteString -> IO () appMessage :: L.ByteString -> IO ()
appMessage l = forever $ do appMessage l = forever $ do
@ -43,10 +45,9 @@ swapApp i f = do
I.readIORef i >>= killThread I.readIORef i >>= killThread
f >>= I.writeIORef i f >>= I.writeIORef i
devel :: ([String] -> IO ()) -- ^ configure command devel :: ([String] -> IO ()) -- ^ cabal
-> ([String] -> IO ()) -- ^ build command
-> IO () -> IO ()
devel conf build = do devel cabalCmd = do
e <- doesFileExist "dist/devel-flag" e <- doesFileExist "dist/devel-flag"
when e $ removeFile "dist/devel-flag" when e $ removeFile "dist/devel-flag"
listenThread <- forkIO (appMessage "Initializing, please wait") >>= I.newIORef listenThread <- forkIO (appMessage "Initializing, please wait") >>= I.newIORef
@ -60,10 +61,7 @@ devel conf build = do
Nothing -> return emptyHookedBuildInfo Nothing -> return emptyHookedBuildInfo
Just fp -> readHookedBuildInfo normal fp Just fp -> readHookedBuildInfo normal fp
lbi <- configure (gpd, hooked) (defaultConfigFlags defaultProgramConfiguration) cabalCmd ["configure", "-fdevel"]
{ configConfigurationsFlags = [(FlagName "devel", True)]
, configUserInstall = Flag True
}
let myTry :: IO () -> IO () let myTry :: IO () -> IO ()
myTry f = try f >>= \x -> case x of myTry f = try f >>= \x -> case x of
@ -77,16 +75,10 @@ devel conf build = do
deps <- getDeps deps <- getDeps
touchDeps deps touchDeps deps
B.build cabalCmd ["build"]
(localPkgDescr lbi) defaultMainArgs ["install"]
lbi
defaultBuildFlags
[]
install (localPkgDescr lbi) lbi defaultCopyFlags pi' <- getPackageName
register (localPkgDescr lbi) lbi defaultRegisterFlags
let PackageName pi' = pkgName $ package $ localPkgDescr lbi
writeFile "dist/devel.hs" $ unlines writeFile "dist/devel.hs" $ unlines
[ "{-# LANGUAGE PackageImports #-}" [ "{-# LANGUAGE PackageImports #-}"
, concat , concat
@ -152,3 +144,14 @@ loop oldList getNewApp = do
errApp :: String -> Application errApp :: String -> Application
errApp s _ = return $ ResponseBuilder status500 [("Content-Type", "text/plain")] $ fromString s errApp s _ = return $ ResponseBuilder status500 [("Content-Type", "text/plain")] $ fromString s
getPackageName :: IO String
getPackageName = do
xs <- getDirectoryContents "."
case mapMaybe (toCabal . reverse) xs of
[x] -> return x
[] -> error "No cabal files found"
_ -> error "Too many cabal files found"
where
toCabal ('l':'a':'b':'a':'c':'.':x) = Just $ reverse x
toCabal _ = Nothing

View File

@ -42,13 +42,14 @@ main = do
"--dev":rest -> (True, rest) "--dev":rest -> (True, rest)
_ -> (False, args') _ -> (False, args')
let cmd = if isDev then "cabal-dev" else "cabal" let cmd = if isDev then "cabal-dev" else "cabal"
let conf rest = rawSystem cmd ("configure":rest) >> return () let cabal rest = rawSystem cmd rest >> return ()
let build rest = rawSystem cmd ("build":rest) >> return () let conf rest = cabal $ "configure":rest
let build rest = cabal $ "build":rest
case args of case args of
["init"] -> scaffold ["init"] -> scaffold
"build":rest -> touch >> build rest "build":rest -> touch >> build rest
["touch"] -> touch ["touch"] -> touch
["devel"] -> devel conf build ["devel"] -> devel cabal
"configure":rest -> conf rest "configure":rest -> conf rest
_ -> do _ -> do
putStrLn "Usage: yesod <command>" putStrLn "Usage: yesod <command>"