mirror of
https://github.com/commercialhaskell/stackage.git
synced 2026-02-13 06:47:28 +01:00
Track down deps (way too complicated)
This commit is contained in:
parent
d150d661c8
commit
12b057bddb
@ -10,6 +10,8 @@ import Control.Exception (Exception, SomeException, handle, throwIO,
|
|||||||
import Control.Monad (replicateM, unless, when, forM_)
|
import Control.Monad (replicateM, unless, when, forM_)
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
import qualified Data.Set as Set
|
import qualified Data.Set as Set
|
||||||
|
import qualified Control.Monad.Trans.Writer as W
|
||||||
|
import Distribution.Package (Dependency (Dependency))
|
||||||
import Data.Version (parseVersion, Version (Version))
|
import Data.Version (parseVersion, Version (Version))
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable (Typeable)
|
||||||
import Stackage.Types
|
import Stackage.Types
|
||||||
@ -22,17 +24,19 @@ import System.Exit (ExitCode (ExitSuccess))
|
|||||||
import System.FilePath ((<.>), (</>), takeDirectory)
|
import System.FilePath ((<.>), (</>), takeDirectory)
|
||||||
import System.IO (IOMode (WriteMode, AppendMode),
|
import System.IO (IOMode (WriteMode, AppendMode),
|
||||||
withBinaryFile)
|
withBinaryFile)
|
||||||
import System.Process (readProcess, runProcess, waitForProcess)
|
import System.Process (readProcess, runProcess, waitForProcess, createProcess, proc, cwd)
|
||||||
import Text.ParserCombinators.ReadP (readP_to_S)
|
import Text.ParserCombinators.ReadP (readP_to_S)
|
||||||
import Data.IORef (IORef, readIORef, atomicModifyIORef, newIORef)
|
import Data.IORef (IORef, readIORef, atomicModifyIORef, newIORef)
|
||||||
|
import qualified Data.ByteString.Lazy as L
|
||||||
|
import qualified Data.ByteString.Lazy.Char8 as L8
|
||||||
|
import qualified Distribution.PackageDescription as PD
|
||||||
|
import Distribution.PackageDescription.Parse (ParseResult (ParseOk),
|
||||||
|
parsePackageDescription)
|
||||||
|
|
||||||
runTestSuites :: BuildSettings -> BuildPlan -> IO ()
|
runTestSuites :: BuildSettings -> BuildPlan -> IO ()
|
||||||
runTestSuites settings' bp = do
|
runTestSuites settings' bp = do
|
||||||
settings <- fixBuildSettings settings'
|
settings <- fixBuildSettings settings'
|
||||||
let selected' = Map.filterWithKey notSkipped $ bpPackages bp
|
let selected' = Map.filterWithKey notSkipped $ bpPackages bp
|
||||||
putStrLn "Determining package dependencies"
|
|
||||||
selected <- mapM (addDependencies settings) $ Map.toList selected'
|
|
||||||
putStrLn "Running test suites"
|
|
||||||
let testdir = "runtests"
|
let testdir = "runtests"
|
||||||
docdir = "haddock"
|
docdir = "haddock"
|
||||||
rm_r testdir
|
rm_r testdir
|
||||||
@ -40,6 +44,11 @@ runTestSuites settings' bp = do
|
|||||||
createDirectory testdir
|
createDirectory testdir
|
||||||
createDirectory docdir
|
createDirectory docdir
|
||||||
|
|
||||||
|
putStrLn "Determining package dependencies"
|
||||||
|
selected <- mapM (addDependencies settings (Map.keysSet selected') testdir)
|
||||||
|
$ Map.toList selected'
|
||||||
|
putStrLn "Running test suites"
|
||||||
|
|
||||||
copyBuiltInHaddocks docdir
|
copyBuiltInHaddocks docdir
|
||||||
|
|
||||||
cabalVersion <- getCabalVersion
|
cabalVersion <- getCabalVersion
|
||||||
@ -55,19 +64,42 @@ runTestSuites settings' bp = do
|
|||||||
notSkipped p _ = p `Set.notMember` bpSkippedTests bp
|
notSkipped p _ = p `Set.notMember` bpSkippedTests bp
|
||||||
|
|
||||||
addDependencies :: BuildSettings
|
addDependencies :: BuildSettings
|
||||||
|
-> Set PackageName -- ^ all packages to be installed
|
||||||
|
-> FilePath -- ^ testdir
|
||||||
-> (PackageName, SelectedPackageInfo)
|
-> (PackageName, SelectedPackageInfo)
|
||||||
-> IO (PackageName, Set PackageName, SelectedPackageInfo)
|
-> IO (PackageName, Set PackageName, SelectedPackageInfo)
|
||||||
addDependencies settings (packageName, spi) = do
|
addDependencies settings allPackages testdir (packageName, spi) = do
|
||||||
package' <- replaceTarball (tarballDir settings) package
|
package' <- replaceTarball (tarballDir settings) package
|
||||||
deps <- handle (\e -> print (e :: IOException) >> return Set.empty)
|
deps <- handle (\e -> print (e :: IOException) >> return Set.empty)
|
||||||
$ getDeps package'
|
$ getDeps allPackages testdir packageName package package'
|
||||||
return (packageName, Set.empty, spi) -- FIXME
|
print (packageName, deps, spi)
|
||||||
|
return (packageName, deps, spi)
|
||||||
where
|
where
|
||||||
package = packageVersionString (packageName, spiVersion spi)
|
package = packageVersionString (packageName, spiVersion spi)
|
||||||
|
|
||||||
getDeps :: String -> IO (Set PackageName)
|
getDeps :: Set PackageName -- ^ all packages to be installed
|
||||||
getDeps name = do
|
-> FilePath -> PackageName -> String -> String -> IO (Set PackageName)
|
||||||
return Set.empty -- FIXME
|
getDeps allPackages testdir (PackageName name) nameVer loc = do
|
||||||
|
(Nothing, Nothing, Nothing, ph) <- createProcess
|
||||||
|
(proc "cabal" ["unpack", loc, "--verbose=0"]) { cwd = Just testdir }
|
||||||
|
ec <- waitForProcess ph
|
||||||
|
unless (ec == ExitSuccess) $ error $ "Unable to unpack: " ++ loc
|
||||||
|
lbs <- L.readFile $ testdir </> nameVer </> name <.> "cabal"
|
||||||
|
case parsePackageDescription $ L8.unpack lbs of
|
||||||
|
ParseOk _ gpd -> return $ Set.intersection allPackages $ allLibraryDeps gpd
|
||||||
|
_ -> return Set.empty
|
||||||
|
|
||||||
|
allLibraryDeps :: PD.GenericPackageDescription -> Set PackageName
|
||||||
|
allLibraryDeps =
|
||||||
|
maybe Set.empty (W.execWriter . goTree) . PD.condLibrary
|
||||||
|
where
|
||||||
|
goTree tree = do
|
||||||
|
mapM_ goDep $ PD.condTreeConstraints tree
|
||||||
|
forM_ (PD.condTreeComponents tree) $ \(_, y, z) -> do
|
||||||
|
goTree y
|
||||||
|
maybe (return ()) goTree z
|
||||||
|
|
||||||
|
goDep (Dependency pn _) = W.tell $ Set.singleton pn
|
||||||
|
|
||||||
getCabalVersion :: IO CabalVersion
|
getCabalVersion :: IO CabalVersion
|
||||||
getCabalVersion = do
|
getCabalVersion = do
|
||||||
@ -168,8 +200,6 @@ runTestSuite cabalVersion settings testdir docdir
|
|||||||
unless (ec == ExitSuccess) $ throwIO TestException
|
unless (ec == ExitSuccess) $ throwIO TestException
|
||||||
|
|
||||||
passed <- handle (\TestException -> return False) $ do
|
passed <- handle (\TestException -> return False) $ do
|
||||||
package' <- replaceTarball (tarballDir settings) package
|
|
||||||
getHandle WriteMode $ run "cabal" ["unpack", package'] testdir
|
|
||||||
case cabalFileDir settings of
|
case cabalFileDir settings of
|
||||||
Nothing -> return ()
|
Nothing -> return ()
|
||||||
Just cfd -> do
|
Just cfd -> do
|
||||||
@ -179,7 +209,7 @@ runTestSuite cabalVersion settings testdir docdir
|
|||||||
dst = cfd </> basename
|
dst = cfd </> basename
|
||||||
createDirectoryIfMissing True cfd
|
createDirectoryIfMissing True cfd
|
||||||
copyFile src dst
|
copyFile src dst
|
||||||
getHandle AppendMode $ run "cabal" (addCabalArgs settings BSTest ["configure", "--enable-tests"]) dir
|
getHandle WriteMode $ run "cabal" (addCabalArgs settings BSTest ["configure", "--enable-tests"]) dir
|
||||||
|
|
||||||
-- Try building docs first in case tests have an expected failure.
|
-- Try building docs first in case tests have an expected failure.
|
||||||
when (buildDocs settings) $ do
|
when (buildDocs settings) $ do
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user