@@ -17,9 +17,11 @@ import Control.Concurrent (forkIO)
17import Control.Concurrent.MVar (MVar, newEmptyMVar, newMVar, putMVar, readMVar, takeMVar)
17import Control.Concurrent.MVar (MVar, newEmptyMVar, newMVar, putMVar, readMVar, takeMVar)
18import Control.Monad (liftM, liftM2, liftM4)
18import Control.Monad (liftM, liftM2, liftM4)
19import Data.Binary (Binary, get, put, getWord8, putWord8)
19import Data.Binary (Binary, get, put, getWord8, putWord8)
20+import qualified Data.Either as Either
20import qualified Data.Map as Map
21import qualified Data.Map as Map
21import qualified Data.Map.Utils as Map
22import qualified Data.Map.Utils as Map
22import qualified Data.Map.Merge.Strict as Map
23import qualified Data.Map.Merge.Strict as Map
24+import qualified Data.Maybe as Maybe
23import qualified Data.Name as Name
25import qualified Data.Name as Name
24import qualified Data.NonEmptyList as NE
26import qualified Data.NonEmptyList as NE
25import qualified Data.OneOrMore as OneOrMore
27import qualified Data.OneOrMore as OneOrMore
@@ -294,8 +296,10 @@ verifyDependencies env@(Env key root _ _ _ _) time outline solution directDeps =
294 putMVar mvar mvars
296 putMVar mvar mvars
295 deps <- traverse readMVar mvars
297 deps <- traverse readMVar mvars
296 case sequence deps of
298 case sequence deps of
297− Left problem ->
299+ Left _ ->
298− error "TODO verifyDependencies" problem
300+ do home <- Stuff.getElmHome
301+ return $ Left $ Exit.DetailsBadDeps home $
302+ Maybe.catMaybes $ Either.lefts $ Map.elems deps
300 Right artifacts ->
304 Right artifacts ->
@@ -346,13 +350,7 @@ data Artifacts =
348type Dep =
352type Dep =
349− Either Problem Artifacts
353+ Either (Maybe Exit.DetailsBadDep) Artifacts
353− = BadDownload Exit.PackageProblem
358verifyDep :: Env -> MVar (Map.Map Pkg.Name (MVar Dep)) -> Map.Map Pkg.Name Solver.Details -> Pkg.Name -> Solver.Details -> IO Dep
356verifyDep :: Env -> MVar (Map.Map Pkg.Name (MVar Dep)) -> Map.Map Pkg.Name Solver.Details -> Pkg.Name -> Solver.Details -> IO Dep
@@ -367,23 +365,23 @@ verifyDep (Env key _ cache manager _ _) depsMVar solution pkg details@(Solver.De
367 maybeCache <- File.readBinary (Stuff.package cache pkg vsn </> "artifacts.dat")
365 maybeCache <- File.readBinary (Stuff.package cache pkg vsn </> "artifacts.dat")
368 case maybeCache of
366 case maybeCache of
369 Nothing ->
367 Nothing ->
370− build key cache depsMVar pkg details (Set.singleton fingerprint)
368+ build key cache depsMVar pkg details fingerprint Set.empty
372 Just (ArtifactCache fingerprints artifacts) ->
370 Just (ArtifactCache fingerprints artifacts) ->
373 if Set.member fingerprint fingerprints
371 if Set.member fingerprint fingerprints
374 then Reporting.report key Reporting.DBuilt >> return (Right artifacts)
372 then Reporting.report key Reporting.DBuilt >> return (Right artifacts)
375− else build key cache depsMVar pkg details (Set.insert fingerprint fingerprints)
373+ else build key cache depsMVar pkg details fingerprint fingerprints
377 do Reporting.report key Reporting.DRequested
375 do Reporting.report key Reporting.DRequested
378 result <- downloadPackage cache manager pkg vsn
376 result <- downloadPackage cache manager pkg vsn
379 case result of
377 case result of
380− Left p ->
378+ Left problem ->
381 do Reporting.report key (Reporting.DFailed pkg vsn)
379 do Reporting.report key (Reporting.DFailed pkg vsn)
382− return (Left (BadDownload p))
380+ return $ Left $ Just $ Exit.BD_BadDownload pkg vsn problem
384 Right () ->
382 Right () ->
385 do Reporting.report key (Reporting.DReceived pkg vsn)
383 do Reporting.report key (Reporting.DReceived pkg vsn)
386− build key cache depsMVar pkg details (Set.singleton fingerprint)
384+ build key cache depsMVar pkg details fingerprint Set.empty
@@ -405,17 +403,17 @@ type Fingerprint =
408−build :: Reporting.DKey -> Stuff.PackageCache -> MVar (Map.Map Pkg.Name (MVar Dep)) -> Pkg.Name -> Solver.Details -> Set.Set Fingerprint -> IO Dep
406+build :: Reporting.DKey -> Stuff.PackageCache -> MVar (Map.Map Pkg.Name (MVar Dep)) -> Pkg.Name -> Solver.Details -> Fingerprint -> Set.Set Fingerprint -> IO Dep
409−build key cache depsMVar pkg (Solver.Details vsn _) fingerprints =
407+build key cache depsMVar pkg (Solver.Details vsn _) f fs =
410 do eitherOutline <- Outline.read (Stuff.package cache pkg vsn)
408 do eitherOutline <- Outline.read (Stuff.package cache pkg vsn)
411 case eitherOutline of
409 case eitherOutline of
412 Left _ ->
410 Left _ ->
413 do Reporting.report key Reporting.DBroken
411 do Reporting.report key Reporting.DBroken
414− return (Left BadBuild)
412+ return $ Left $ Just $ Exit.BD_BadBuild pkg vsn f
416 Right (Outline.App _) ->
414 Right (Outline.App _) ->
417 do Reporting.report key Reporting.DBroken
415 do Reporting.report key Reporting.DBroken
418− return (Left BadBuild)
416+ return $ Left $ Just $ Exit.BD_BadBuild pkg vsn f
420 Right (Outline.Pkg (Outline.PkgOutline _ _ _ _ exposed deps _ _)) ->
418 Right (Outline.Pkg (Outline.PkgOutline _ _ _ _ exposed deps _ _)) ->
421 do allDeps <- readMVar depsMVar
419 do allDeps <- readMVar depsMVar
@@ -423,7 +421,7 @@ build key cache depsMVar pkg (Solver.Details vsn _) fingerprints =
423 case sequence directDeps of
421 case sequence directDeps of
424 Left _ ->
422 Left _ ->
425 do Reporting.report key Reporting.DBroken
423 do Reporting.report key Reporting.DBroken
426− return (Left BadDependency)
424+ return $ Left $ Nothing
428 Right directArtifacts ->
426 Right directArtifacts ->
429 do let src = Stuff.package cache pkg vsn </> "src"
427 do let src = Stuff.package cache pkg vsn </> "src"
@@ -438,7 +436,7 @@ build key cache depsMVar pkg (Solver.Details vsn _) fingerprints =
438 case sequence maybeStatuses of
436 case sequence maybeStatuses of
439 Nothing ->
437 Nothing ->
440 do Reporting.report key Reporting.DBroken
438 do Reporting.report key Reporting.DBroken
441− return (Left BadBuild)
439+ return $ Left $ Just $ Exit.BD_BadBuild pkg vsn f
443 Just statuses ->
441 Just statuses ->
444 do rmvar <- newEmptyMVar
442 do rmvar <- newEmptyMVar
@@ -448,7 +446,7 @@ build key cache depsMVar pkg (Solver.Details vsn _) fingerprints =
448 case sequence maybeResults of
446 case sequence maybeResults of
449 Nothing ->
447 Nothing ->
450 do Reporting.report key Reporting.DBroken
448 do Reporting.report key Reporting.DBroken
451− return (Left BadBuild)
449+ return $ Left $ Just $ Exit.BD_BadBuild pkg vsn f
453 Just results ->
451 Just results ->
@@ -456,6 +454,7 @@ build key cache depsMVar pkg (Solver.Details vsn _) fingerprints =
456 ifaces = gatherInterfaces exposedDict results
454 ifaces = gatherInterfaces exposedDict results
457 objects = gatherObjects results
455 objects = gatherObjects results
458 artifacts = Artifacts ifaces objects
456 artifacts = Artifacts ifaces objects
457+ fingerprints = Set.insert f fs
460 do writeDocs cache pkg vsn docsStatus results
459 do writeDocs cache pkg vsn docsStatus results
461 File.writeBinary path (ArtifactCache fingerprints artifacts)
460 File.writeBinary path (ArtifactCache fingerprints artifacts)