Merge branch 'master' into new-upload

This commit is contained in:
Michael Snoyman 2015-03-15 18:32:36 +02:00
commit c3d3821b87
3 changed files with 48 additions and 15 deletions

View File

@ -28,15 +28,16 @@ setupPackageDatabase
-> FilePath -- ^ documentation root -> FilePath -- ^ documentation root
-> (ByteString -> IO ()) -- ^ logging -> (ByteString -> IO ()) -- ^ logging
-> Map PackageName Version -- ^ packages and versions to be installed -> Map PackageName Version -- ^ packages and versions to be installed
-> (PackageIdentifier -> IO ()) -- ^ callback to be used when unregistering a package
-> IO (Set PackageName) -- ^ packages remaining in the database after cleanup -> IO (Set PackageName) -- ^ packages remaining in the database after cleanup
setupPackageDatabase mdb docDir log' toInstall = do setupPackageDatabase mdb docDir log' toInstall onUnregister = do
registered1 <- getRegisteredPackages flags registered1 <- getRegisteredPackages flags
forM_ registered1 $ \pi@(PackageIdentifier name version) -> forM_ registered1 $ \pi@(PackageIdentifier name version) ->
case lookup name toInstall of case lookup name toInstall of
Just version' | version /= version' -> unregisterPackage log' docDir flags pi Just version' | version /= version' -> unregisterPackage log' onUnregister docDir flags pi
_ -> return () _ -> return ()
broken <- getBrokenPackages flags broken <- getBrokenPackages flags
forM_ broken $ unregisterPackage log' docDir flags forM_ broken $ unregisterPackage log' onUnregister docDir flags
foldMap (\(PackageIdentifier name _) -> singletonSet name) foldMap (\(PackageIdentifier name _) -> singletonSet name)
<$> getRegisteredPackages flags <$> getRegisteredPackages flags
where where
@ -78,13 +79,26 @@ parsePackageIdent = fmap fst .
-- | Unregister a package. -- | Unregister a package.
unregisterPackage :: (ByteString -> IO ()) -- ^ log func unregisterPackage :: (ByteString -> IO ()) -- ^ log func
-> (PackageIdentifier -> IO ()) -- ^ callback to be used when unregistering a package
-> FilePath -- ^ doc directory -> FilePath -- ^ doc directory
-> [String] -> PackageIdentifier -> IO () -> [String] -> PackageIdentifier -> IO ()
unregisterPackage log' docDir flags ident@(PackageIdentifier name _) = do unregisterPackage log' onUnregister docDir flags ident@(PackageIdentifier name _) = do
log' $ "Unregistering " ++ encodeUtf8 (display ident) ++ "\n" log' $ "Unregistering " ++ encodeUtf8 (display ident) ++ "\n"
onUnregister ident
-- Delete libraries
sourceProcessWithConsumer
(proc "ghc-pkg" ("describe" : flags ++ [unpack $ display ident]))
(CT.decodeUtf8
$= CT.lines
$= CL.mapMaybe parseLibraryDir
$= CL.mapM_ (void . tryIO . removeTree))
void (readProcessWithExitCode void (readProcessWithExitCode
"ghc-pkg" "ghc-pkg"
("unregister": flags ++ ["--force", unpack $ display name]) ("unregister": flags ++ ["--force", unpack $ display name])
"") "")
void $ tryIO $ removeTree $ docDir </> fpFromText (display ident) void $ tryIO $ removeTree $ docDir </> fpFromText (display ident)
where
parseLibraryDir = fmap fpFromText . stripPrefix "library-dirs: "

View File

@ -30,7 +30,7 @@ import Stackage.Prelude hiding (pi)
import System.Directory (findExecutable) import System.Directory (findExecutable)
import System.Environment (getEnvironment) import System.Environment (getEnvironment)
import System.IO (IOMode (WriteMode), import System.IO (IOMode (WriteMode),
withBinaryFile) openBinaryFile)
import System.IO.Temp (withSystemTempDirectory) import System.IO.Temp (withSystemTempDirectory)
data BuildException = BuildException (Map PackageName BuildFailure) [Text] data BuildException = BuildException (Map PackageName BuildFailure) [Text]
@ -198,6 +198,7 @@ performBuild' pb@PerformBuild {..} = withBuildDir $ \builddir -> do
(pbDocDir pb) (pbDocDir pb)
pbLog pbLog
(ppVersion <$> bpPackages pbPlan) (ppVersion <$> bpPackages pbPlan)
(deletePreviousResults pb)
forM_ packageMap $ \pi -> void $ async $ singleBuild pb registeredPackages forM_ packageMap $ \pi -> void $ async $ singleBuild pb registeredPackages
SingleBuild SingleBuild
@ -290,11 +291,12 @@ singleBuild pb@PerformBuild {..} registeredPackages SingleBuild {..} =
, display $ ppVersion $ piPlan sbPackageInfo , display $ ppVersion $ piPlan sbPackageInfo
] ]
runIn wdir outH cmd args = runIn wdir getOutH cmd args = do
withCheckedProcess cp $ \ClosedStream UseProvidedHandle UseProvidedHandle -> outH <- getOutH
withCheckedProcess (cp outH) $ \ClosedStream UseProvidedHandle UseProvidedHandle ->
(return () :: IO ()) (return () :: IO ())
where where
cp = (proc (unpack $ asText cmd) (map (unpack . asText) args)) cp outH = (proc (unpack $ asText cmd) (map (unpack . asText) args))
{ cwd = Just $ fpToString wdir { cwd = Just $ fpToString wdir
, std_out = UseHandle outH , std_out = UseHandle outH
, std_err = UseHandle outH , std_err = UseHandle outH
@ -320,8 +322,21 @@ singleBuild pb@PerformBuild {..} registeredPackages SingleBuild {..} =
testRunOut = pbLogDir </> fpFromText namever </> "test-run.out" testRunOut = pbLogDir </> fpFromText namever </> "test-run.out"
wf fp inner' = do wf fp inner' = do
createTree $ parent fp ref <- newIORef Nothing
withBinaryFile (fpToString fp) WriteMode inner' let cleanup = do
mh <- readIORef ref
forM_ mh hClose
getH = do
mh <- readIORef ref
case mh of
Just h -> return h
Nothing -> mask_ $ do
createTree $ parent fp
h <- openBinaryFile (fpToString fp) WriteMode
writeIORef ref $ Just h
return h
inner' getH `finally` cleanup
configArgs = ($ []) $ execWriter $ do configArgs = ($ []) $ execWriter $ do
when pbAllowNewer $ tell' "--allow-newer" when pbAllowNewer $ tell' "--allow-newer"
@ -349,15 +364,15 @@ singleBuild pb@PerformBuild {..} registeredPackages SingleBuild {..} =
PackageConstraints {..} = ppConstraints $ piPlan sbPackageInfo PackageConstraints {..} = ppConstraints $ piPlan sbPackageInfo
buildLibrary = wf libOut $ \outH -> do buildLibrary = wf libOut $ \getOutH -> do
let run a b = do when pbVerbose $ log' (unwords (a : b)) let run a b = do when pbVerbose $ log' (unwords (a : b))
runChild outH a b runChild getOutH a b
isUnpacked <- newIORef False isUnpacked <- newIORef False
let withUnpacked inner = do let withUnpacked inner = do
unlessM (readIORef isUnpacked) $ do unlessM (readIORef isUnpacked) $ do
log' $ "Unpacking " ++ namever log' $ "Unpacking " ++ namever
runParent outH "cabal" ["unpack", namever] runParent getOutH "cabal" ["unpack", namever]
writeIORef isUnpacked True writeIORef isUnpacked True
inner inner
@ -439,8 +454,8 @@ singleBuild pb@PerformBuild {..} registeredPackages SingleBuild {..} =
return withUnpacked return withUnpacked
runTests withUnpacked = wf testOut $ \outH -> do runTests withUnpacked = wf testOut $ \getOutH -> do
let run = runChild outH let run = runChild getOutH
prevTestResult <- getPreviousResult pb Test pident prevTestResult <- getPreviousResult pb Test pident
let needTest = pbEnableTests let needTest = pbEnableTests

View File

@ -1086,6 +1086,10 @@ expected-haddock-failures:
# https://github.com/wereHamster/rethinkdb-client-driver/issues/1 # https://github.com/wereHamster/rethinkdb-client-driver/issues/1
- rethinkdb-client-driver - rethinkdb-client-driver
# Requires build before haddock, which doesn't always happen in incremental
# builds. Could consider special-casing this requirement.
- gtk
# Benchmarks which should not be built. Note that Stackage does *not* generally # Benchmarks which should not be built. Note that Stackage does *not* generally
# build benchmarks. The difference here will be whether dependencies for these # build benchmarks. The difference here will be whether dependencies for these
# benchmarks are included or not. # benchmarks are included or not.