diff --git a/Stackage/Build.hs b/Stackage/Build.hs index 87094a35..f70ab76a 100644 --- a/Stackage/Build.hs +++ b/Stackage/Build.hs @@ -25,6 +25,7 @@ defaultBuildSettings version = BuildSettings , extraArgs = const ["-fnetwork23"] , testWorkerThreads = 4 , buildDocs = True + , tarballDir = "patching/tarballs" } build :: BuildSettings -> BuildPlan -> IO () @@ -72,6 +73,7 @@ build settings' bp = do putStrLn "Beginning Stackage build" ph <- withBinaryFile "build.log" WriteMode $ \handle -> do + packageList <- mapM (replaceTarball settings) $ bpPackageList bp let args = addCabalArgs settings BSBuild $ "install" : ("--cabal-lib-version=" ++ libVersion) @@ -79,9 +81,7 @@ build settings' bp = do : "--max-backjumps=-1" : "--reorder-goals" : "-j" - : concat - [ bpPackageList bp - ] + : packageList hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args)) runCabal args handle ec <- waitForProcess ph diff --git a/Stackage/Test.hs b/Stackage/Test.hs index ece2290c..6040d60b 100644 --- a/Stackage/Test.hs +++ b/Stackage/Test.hs @@ -97,7 +97,8 @@ runTestSuite settings testdir (packageName, SelectedPackageInfo {..}) = do runGhcPackagePath = runGen True passed <- handle (\TestException -> return False) $ do - getHandle WriteMode $ run "cabal" ["unpack", package] testdir + package' <- replaceTarball settings package + getHandle WriteMode $ run "cabal" ["unpack", package'] testdir getHandle AppendMode $ run "cabal" (addCabalArgs settings BSTest ["configure", "--enable-tests"]) dir when spiHasTests $ do getHandle AppendMode $ run "cabal" ["build"] dir diff --git a/Stackage/Types.hs b/Stackage/Types.hs index a2f8d5e1..a3fa9369 100644 --- a/Stackage/Types.hs +++ b/Stackage/Types.hs @@ -132,6 +132,8 @@ data BuildSettings = BuildSettings -- ^ How many threads to spawn for running test suites. , buildDocs :: Bool -- ^ Build docs as part of the test procedure. + , tarballDir :: FilePath + -- ^ Directory containing replacement tarballs. } -- | A wrapper around a @Map@ providing a better @Monoid@ instance. diff --git a/Stackage/Util.hs b/Stackage/Util.hs index 4ed57ff2..45b20ffa 100644 --- a/Stackage/Util.hs +++ b/Stackage/Util.hs @@ -18,11 +18,11 @@ import Distribution.Version (thisVersion) import Stackage.Types import System.Directory (doesDirectoryExist, removeDirectoryRecursive) -import System.Directory (getAppUserDataDirectory) -import System.Directory (canonicalizePath, - createDirectoryIfMissing) +import System.Directory (getAppUserDataDirectory + ,canonicalizePath, + createDirectoryIfMissing, doesFileExist) import System.Environment (getEnvironment) -import System.FilePath (()) +import System.FilePath ((), (<.>)) -- | Allow only packages with permissive licenses. allowPermissive :: [String] -- ^ list of explicitly allowed packages @@ -148,3 +148,16 @@ fixBuildSettings settings' = do createDirectoryIfMissing True root' root <- canonicalizePath root' return settings' { sandboxRoot = root } + +-- | Check if a tarball exists in the tarball directory and, if so, use that +-- instead of the given name. +replaceTarball :: BuildSettings + -> String + -> IO String +replaceTarball bs pkgname = do + exists <- doesFileExist fp + if exists + then canonicalizePath fp + else return pkgname + where + fp = tarballDir bs pkgname <.> "tar.gz"