on master help sign in
thread BuildID logic through Build.hs
884ea20Evan Czaplicki
builder/src/Build.hs+90−74
@@ -66,19 +66,20 @@ data Env =
66 , _root :: FilePath
66 , _root :: FilePath
67 , _pkg :: Pkg.Name
67 , _pkg :: Pkg.Name
68 , _srcDirs :: [FilePath]
68 , _srcDirs :: [FilePath]
69+ , _buildID :: Details.BuildID
69 , _locals :: Map.Map ModuleName.Raw Details.Local
70 , _locals :: Map.Map ModuleName.Raw Details.Local
70 , _foreigns :: Map.Map ModuleName.Raw Details.Foreign
71 , _foreigns :: Map.Map ModuleName.Raw Details.Foreign
71 }
72 }
72
73
73
74
74makeEnv :: Reporting.BKey -> FilePath -> Details.Details -> Env
75makeEnv :: Reporting.BKey -> FilePath -> Details.Details -> Env
75−makeEnv key root (Details.Details _ validOutline locals foreigns _) =
76+makeEnv key root (Details.Details _ validOutline buildID locals foreigns _) =
76 case validOutline of
77 case validOutline of
77 Details.ValidApp srcDirs ->
78 Details.ValidApp srcDirs ->
78− Env key root Pkg.dummyName (NE.toList srcDirs) locals foreigns
79+ Env key root Pkg.dummyName (NE.toList srcDirs) buildID locals foreigns
79
80
80 Details.ValidPkg pkg _ _ ->
81 Details.ValidPkg pkg _ _ ->
81− Env key root pkg ["src"] locals foreigns
82+ Env key root pkg ["src"] buildID locals foreigns
82
83
83
84
84
85
@@ -238,7 +239,7 @@ crawlDeps env mvar deps blockedValue =
238
239
239
240
240crawlModule :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> IO Status
241crawlModule :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> IO Status
241−crawlModule env@(Env _ root pkg srcDirs locals foreigns) mvar docsNeed name =
242+crawlModule env@(Env _ root pkg srcDirs buildID locals foreigns) mvar docsNeed name =
242 do let fileName = ModuleName.toFilePath name <.> "elm"
243 do let fileName = ModuleName.toFilePath name <.> "elm"
243 let inRoot path = File.exists (root </> path)
244 let inRoot path = File.exists (root </> path)
244
245
@@ -251,18 +252,15 @@ crawlModule env@(Env _ root pkg srcDirs locals foreigns) mvar docsNeed name =
251 return $ SBadImport $ Import.Ambiguous path [] dep deps
252 return $ SBadImport $ Import.Ambiguous path [] dep deps
252
253
253 Nothing ->
254 Nothing ->
255+ do newTime <- File.getTime path
254− case Map.lookup name locals of
256+ case Map.lookup name locals of
255− Nothing ->
257+ Nothing ->
256− crawlFile env mvar docsNeed name path =<< File.getTime path
258+ crawlFile env mvar docsNeed name path newTime buildID
257
259
258− Just local@(Details.Local oldPath oldTime deps _) ->
260+ Just local@(Details.Local oldPath oldTime deps _ lastChange _) ->
259− if path /= oldPath
260− then crawlFile env mvar docsNeed name path =<< File.getTime path
261− else
262− do newTime <- File.getTime path
263− if oldTime /= newTime || needsDocs docsNeed
261+ if path /= oldPath || oldTime /= newTime || needsDocs docsNeed
264− then crawlFile env mvar docsNeed name path newTime
262+ then crawlFile env mvar docsNeed name path newTime lastChange
265− else crawlDeps env mvar deps (SCached local)
263+ else crawlDeps env mvar deps (SCached local)
266
264
267 p1:p2:ps ->
265 p1:p2:ps ->
268 return $ SBadImport $ Import.AmbiguousLocal p1 p2 ps
266 return $ SBadImport $ Import.AmbiguousLocal p1 p2 ps
@@ -285,8 +283,8 @@ crawlModule env@(Env _ root pkg srcDirs locals foreigns) mvar docsNeed name =
285 return $ SBadImport Import.NotFound
283 return $ SBadImport Import.NotFound
286
284
287
285
288−crawlFile :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> FilePath -> File.Time -> IO Status
286+crawlFile :: Env -> MVar StatusDict -> DocsNeed -> ModuleName.Raw -> FilePath -> File.Time -> Details.BuildID -> IO Status
289−crawlFile env@(Env _ root pkg _ _ _) mvar docsNeed expectedName path time =
287+crawlFile env@(Env _ root pkg _ buildID _ _) mvar docsNeed expectedName path time lastChange =
290 do source <- File.readUtf8 (root </> path)
288 do source <- File.readUtf8 (root </> path)
291
289
292 case Parse.fromByteString pkg source of
290 case Parse.fromByteString pkg source of
@@ -302,7 +300,7 @@ crawlFile env@(Env _ root pkg _ _ _) mvar docsNeed expectedName path time =
302 if expectedName == actualName then
300 if expectedName == actualName then
303 let
301 let
304 deps = map Src.getImportName imports
302 deps = map Src.getImportName imports
305− local = Details.Local path time deps (any isMain values)
303+ local = Details.Local path time deps (any isMain values) lastChange buildID
306 in
304 in
307 crawlDeps env mvar deps (SChanged local source modul docsNeed)
305 crawlDeps env mvar deps (SChanged local source modul docsNeed)
308 else
306 else
@@ -325,7 +323,7 @@ type ResultDict =
325data Result
323data Result
326 = RNew !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
324 = RNew !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
327 | RSame !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
325 | RSame !Details.Local !I.Interface !Opt.LocalGraph !(Maybe Docs.Module)
328− | RCached Bool (MVar CachedInterface)
326+ | RCached Bool Details.BuildID (MVar CachedInterface)
329 | RNotFound Import.Problem
327 | RNotFound Import.Problem
330 | RProblem Error.Module
328 | RProblem Error.Module
331 | RBlocked
329 | RBlocked
@@ -340,11 +338,11 @@ data CachedInterface
340
338
341
339
342checkModule :: Env -> Dependencies -> MVar ResultDict -> ModuleName.Raw -> Status -> IO Result
340checkModule :: Env -> Dependencies -> MVar ResultDict -> ModuleName.Raw -> Status -> IO Result
343−checkModule env@(Env _ root pkg _ _ _) foreigns resultsMVar name status =
341+checkModule env@(Env _ root pkg _ _ _ _) foreigns resultsMVar name status =
344 case status of
342 case status of
345− SCached local@(Details.Local path time deps hasMain) ->
343+ SCached local@(Details.Local path time deps hasMain lastChange lastCompile) ->
346 do results <- readMVar resultsMVar
344 do results <- readMVar resultsMVar
347− depsStatus <- checkDeps root results deps
345+ depsStatus <- checkDeps root results deps lastCompile
348 case depsStatus of
346 case depsStatus of
349 DepsChange ifaces ->
347 DepsChange ifaces ->
350 do source <- File.readUtf8 path
348 do source <- File.readUtf8 path
@@ -356,7 +354,7 @@ checkModule env@(Env _ root pkg _ _ _) foreigns resultsMVar name status =
356
354
357 DepsSame _ _ ->
355 DepsSame _ _ ->
358 do mvar <- newMVar Unneeded
356 do mvar <- newMVar Unneeded
359− return (RCached hasMain mvar)
357+ return (RCached hasMain lastChange mvar)
360
358
361 DepsBlock ->
359 DepsBlock ->
362 return RBlocked
360 return RBlocked
@@ -371,9 +369,9 @@ checkModule env@(Env _ root pkg _ _ _) foreigns resultsMVar name status =
371 Left err ->
369 Left err ->
372 Error.BadSyntax err
370 Error.BadSyntax err
373
371
374− SChanged local@(Details.Local path time deps _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) docsNeed ->
372+ SChanged local@(Details.Local path time deps _ _ lastCompile) source modul@(Src.Module _ _ _ imports _ _ _ _ _) docsNeed ->
375 do results <- readMVar resultsMVar
373 do results <- readMVar resultsMVar
376− depsStatus <- checkDeps root results deps
374+ depsStatus <- checkDeps root results deps lastCompile
377 case depsStatus of
375 case depsStatus of
378 DepsChange ifaces ->
376 DepsChange ifaces ->
379 compile env docsNeed local source ifaces modul
377 compile env docsNeed local source ifaces modul
@@ -418,29 +416,45 @@ data DepsStatus
418 | DepsNotFound (NE.List (ModuleName.Raw, Import.Problem))
416 | DepsNotFound (NE.List (ModuleName.Raw, Import.Problem))
419
417
420
418
421−checkDeps :: FilePath -> ResultDict -> [ModuleName.Raw] -> IO DepsStatus
419+checkDeps :: FilePath -> ResultDict -> [ModuleName.Raw] -> Details.BuildID -> IO DepsStatus
422−checkDeps root results deps =
420+checkDeps root results deps lastCompile =
423− checkDepsHelp root results deps [] [] [] [] False
421+ checkDepsHelp root results deps [] [] [] [] False 0 lastCompile
424
422
425
423
426type Dep = (ModuleName.Raw, I.Interface)
424type Dep = (ModuleName.Raw, I.Interface)
427type CDep = (ModuleName.Raw, MVar CachedInterface)
425type CDep = (ModuleName.Raw, MVar CachedInterface)
428
426
429
427
430−checkDepsHelp :: FilePath -> ResultDict -> [ModuleName.Raw] -> [Dep] -> [Dep] -> [CDep] -> [(ModuleName.Raw,Import.Problem)] -> Bool -> IO DepsStatus
428+checkDepsHelp :: FilePath -> ResultDict -> [ModuleName.Raw] -> [Dep] -> [Dep] -> [CDep] -> [(ModuleName.Raw,Import.Problem)] -> Bool -> Details.BuildID -> Details.BuildID -> IO DepsStatus
431−checkDepsHelp root results deps new same cached importProblems isBlocked =
429+checkDepsHelp root results deps new same cached importProblems isBlocked lastDepChange lastCompile =
432 case deps of
430 case deps of
433 dep:otherDeps ->
431 dep:otherDeps ->
434 do result <- readMVar (results ! dep)
432 do result <- readMVar (results ! dep)
435 case result of
433 case result of
434+ RNew (Details.Local _ _ _ _ lastChange _) iface _ _ ->
436− RNew _ iface _ _ -> checkDepsHelp root results otherDeps ((dep,iface) : new) same cached importProblems isBlocked
435+ checkDepsHelp root results otherDeps ((dep,iface) : new) same cached importProblems isBlocked (max lastChange lastDepChange) lastCompile
436+
437+ RSame (Details.Local _ _ _ _ lastChange _) iface _ _ ->
437− RSame _ iface _ _ -> checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked
438+ checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked (max lastChange lastDepChange) lastCompile
439+
440+ RCached _ lastChange mvar ->
438− RCached _ mvar -> checkDepsHelp root results otherDeps new same ((dep,mvar) : cached) importProblems isBlocked
441+ checkDepsHelp root results otherDeps new same ((dep,mvar) : cached) importProblems isBlocked (max lastChange lastDepChange) lastCompile
442+
443+ RNotFound prob ->
439− RNotFound prob -> checkDepsHelp root results otherDeps new same cached ((dep,prob) : importProblems) True
444+ checkDepsHelp root results otherDeps new same cached ((dep,prob) : importProblems) True lastDepChange lastCompile
445+
446+ RProblem _ ->
440− RProblem _ -> checkDepsHelp root results otherDeps new same cached importProblems True
447+ checkDepsHelp root results otherDeps new same cached importProblems True lastDepChange lastCompile
448+
449+ RBlocked ->
441− RBlocked -> checkDepsHelp root results otherDeps new same cached importProblems True
450+ checkDepsHelp root results otherDeps new same cached importProblems True lastDepChange lastCompile
451+
452+ RForeign iface ->
442− RForeign iface -> checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked
453+ checkDepsHelp root results otherDeps new ((dep,iface) : same) cached importProblems isBlocked lastDepChange lastCompile
454+
455+ RKernel ->
443− RKernel -> checkDepsHelp root results otherDeps new same cached importProblems isBlocked
456+ checkDepsHelp root results otherDeps new same cached importProblems isBlocked lastDepChange lastCompile
457+
444
458
445 [] ->
459 [] ->
446 case reverse importProblems of
460 case reverse importProblems of
@@ -451,7 +465,7 @@ checkDepsHelp root results deps new same cached importProblems isBlocked =
451 if isBlocked then
465 if isBlocked then
452 return $ DepsBlock
466 return $ DepsBlock
453
467
454− else if null new then
468+ else if null new && lastDepChange <= lastCompile then
455 return $ DepsSame same cached
469 return $ DepsSame same cached
456
470
457 else
471 else
@@ -466,7 +480,7 @@ checkDepsHelp root results deps new same cached importProblems isBlocked =
466
480
467
481
468toImportErrors :: Env -> ResultDict -> [Src.Import] -> NE.List (ModuleName.Raw, Import.Problem) -> NE.List Import.Error
482toImportErrors :: Env -> ResultDict -> [Src.Import] -> NE.List (ModuleName.Raw, Import.Problem) -> NE.List Import.Error
469−toImportErrors (Env _ _ _ _ locals foreigns) results imports problems =
483+toImportErrors (Env _ _ _ _ _ locals foreigns) results imports problems =
470 let
484 let
471 knownModules =
485 knownModules =
472 Set.unions
486 Set.unions
@@ -600,12 +614,12 @@ addToGraph name status graph =
600 let
614 let
601 dependencies =
615 dependencies =
602 case status of
616 case status of
603− SCached (Details.Local _ _ deps _) -> deps
617+ SCached (Details.Local _ _ deps _ _ _) -> deps
604− SChanged (Details.Local _ _ deps _) _ _ _ -> deps
618+ SChanged (Details.Local _ _ deps _ _ _) _ _ _ -> deps
605− SBadImport _ -> []
619+ SBadImport _ -> []
606− SBadSyntax _ _ _ _ -> []
620+ SBadSyntax _ _ _ _ -> []
607− SForeign _ -> []
621+ SForeign _ -> []
608− SKernel -> []
622+ SKernel -> []
609 in
623 in
610 (name, name, dependencies) : graph
624 (name, name, dependencies) : graph
611
625
@@ -633,9 +647,9 @@ checkUniqueMains insides smains =
633mainStatusToNamePathPair :: MainStatus -> Maybe (ModuleName.Raw, OneOrMore.OneOrMore FilePath)
647mainStatusToNamePathPair :: MainStatus -> Maybe (ModuleName.Raw, OneOrMore.OneOrMore FilePath)
634mainStatusToNamePathPair smain =
648mainStatusToNamePathPair smain =
635 case smain of
649 case smain of
636− SInside _ -> Nothing
650+ SInside _ -> Nothing
637− SOutsideOk (Details.Local path _ _ _) _ modul -> Just (Src.getName modul, OneOrMore.one path)
651+ SOutsideOk (Details.Local path _ _ _ _ _) _ modul -> Just (Src.getName modul, OneOrMore.one path)
638− SOutsideErr _ -> Nothing
652+ SOutsideErr _ -> Nothing
639
653
640
654
641checkOutside :: ModuleName.Raw -> OneOrMore.OneOrMore FilePath -> Either Exit.BuildProjectProblem FilePath
655checkOutside :: ModuleName.Raw -> OneOrMore.OneOrMore FilePath -> Either Exit.BuildProjectProblem FilePath
@@ -648,12 +662,12 @@ checkOutside name paths =
648checkInside :: ModuleName.Raw -> FilePath -> Status -> Either Exit.BuildProjectProblem ()
662checkInside :: ModuleName.Raw -> FilePath -> Status -> Either Exit.BuildProjectProblem ()
649checkInside name p1 status =
663checkInside name p1 status =
650 case status of
664 case status of
651− SCached (Details.Local p2 _ _ _) -> Left (Exit.BP_MainNameDuplicate name p1 p2)
665+ SCached (Details.Local p2 _ _ _ _ _) -> Left (Exit.BP_MainNameDuplicate name p1 p2)
652− SChanged (Details.Local p2 _ _ _) _ _ _ -> Left (Exit.BP_MainNameDuplicate name p1 p2)
666+ SChanged (Details.Local p2 _ _ _ _ _) _ _ _ -> Left (Exit.BP_MainNameDuplicate name p1 p2)
653− SBadImport _ -> Right ()
667+ SBadImport _ -> Right ()
654− SBadSyntax _ _ _ _ -> Right ()
668+ SBadSyntax _ _ _ _ -> Right ()
655− SForeign _ -> Right ()
669+ SForeign _ -> Right ()
656− SKernel -> Right ()
670+ SKernel -> Right ()
657
671
658
672
659
673
@@ -661,7 +675,7 @@ checkInside name p1 status =
661
675
662
676
663compile :: Env -> DocsNeed -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO Result
677compile :: Env -> DocsNeed -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO Result
664−compile (Env key root pkg _ _ _) docsNeed local@(Details.Local path time _ _) source ifaces modul =
678+compile (Env key root pkg _ buildID _ _) docsNeed (Details.Local path time deps main lastChange _) source ifaces modul =
665 case Compile.compile pkg ifaces modul of
679 case Compile.compile pkg ifaces modul of
666 Right (Compile.Artifacts canonical annotations objects) ->
680 Right (Compile.Artifacts canonical annotations objects) ->
667 do let name = Src.getName modul
681 do let name = Src.getName modul
@@ -674,12 +688,14 @@ compile (Env key root pkg _ _ _) docsNeed local@(Details.Local path time _ _) so
674 Just oldi | oldi == iface ->
688 Just oldi | oldi == iface ->
675 do -- iface should be fully forced by equality check
689 do -- iface should be fully forced by equality check
676 Reporting.report key Reporting.BDone
690 Reporting.report key Reporting.BDone
691+ let local = Details.Local path time deps main lastChange buildID
677 return (RSame local iface objects docs)
692 return (RSame local iface objects docs)
678
693
679 _ ->
694 _ ->
680 do -- iface may be lazy still
695 do -- iface may be lazy still
681 File.writeBinary elmi iface
696 File.writeBinary elmi iface
682 Reporting.report key Reporting.BDone
697 Reporting.report key Reporting.BDone
698+ let local = Details.Local path time deps main buildID buildID
683 return (RNew local iface objects docs)
699 return (RNew local iface objects docs)
684
700
685 Left err ->
701 Left err ->
@@ -692,9 +708,9 @@ compile (Env key root pkg _ _ _) docsNeed local@(Details.Local path time _ _) so
692
708
693
709
694writeDetails :: FilePath -> Details.Details -> Map.Map ModuleName.Raw Result -> IO ()
710writeDetails :: FilePath -> Details.Details -> Map.Map ModuleName.Raw Result -> IO ()
695−writeDetails root (Details.Details time outline locals foreigns extras) results =
711+writeDetails root (Details.Details time outline buildID locals foreigns extras) results =
696 File.writeBinary (Stuff.details root) $
712 File.writeBinary (Stuff.details root) $
697− Details.Details time outline (Map.foldrWithKey addNewLocal locals results) foreigns extras
713+ Details.Details time outline buildID (Map.foldrWithKey addNewLocal locals results) foreigns extras
698
714
699
715
700addNewLocal :: ModuleName.Raw -> Result -> Map.Map ModuleName.Raw Details.Local -> Map.Map ModuleName.Raw Details.Local
716addNewLocal :: ModuleName.Raw -> Result -> Map.Map ModuleName.Raw Details.Local -> Map.Map ModuleName.Raw Details.Local
@@ -702,7 +718,7 @@ addNewLocal name result locals =
702 case result of
718 case result of
703 RNew local _ _ _ -> Map.insert name local locals
719 RNew local _ _ _ -> Map.insert name local locals
704 RSame local _ _ _ -> Map.insert name local locals
720 RSame local _ _ _ -> Map.insert name local locals
705− RCached _ _ -> locals
721+ RCached _ _ _ -> locals
706 RNotFound _ -> locals
722 RNotFound _ -> locals
707 RProblem _ -> locals
723 RProblem _ -> locals
708 RBlocked -> locals
724 RBlocked -> locals
@@ -731,7 +747,7 @@ addErrors result errors =
731 case result of
747 case result of
732 RNew _ _ _ _ -> errors
748 RNew _ _ _ _ -> errors
733 RSame _ _ _ _ -> errors
749 RSame _ _ _ _ -> errors
734− RCached _ _ -> errors
750+ RCached _ _ _ -> errors
735 RNotFound _ -> errors
751 RNotFound _ -> errors
736 RProblem e -> e:errors
752 RProblem e -> e:errors
737 RBlocked -> errors
753 RBlocked -> errors
@@ -744,7 +760,7 @@ addImportProblems results name problems =
744 case results ! name of
760 case results ! name of
745 RNew _ _ _ _ -> problems
761 RNew _ _ _ _ -> problems
746 RSame _ _ _ _ -> problems
762 RSame _ _ _ _ -> problems
747− RCached _ _ -> problems
763+ RCached _ _ _ -> problems
748 RNotFound p -> (name, p) : problems
764 RNotFound p -> (name, p) : problems
749 RProblem _ -> problems
765 RProblem _ -> problems
750 RBlocked -> problems
766 RBlocked -> problems
@@ -802,7 +818,7 @@ toDocs result =
802 case result of
818 case result of
803 RNew _ _ _ d -> d
819 RNew _ _ _ d -> d
804 RSame _ _ _ d -> d
820 RSame _ _ _ d -> d
805− RCached _ _ -> Nothing
821+ RCached _ _ _ -> Nothing
806 RNotFound _ -> Nothing
822 RNotFound _ -> Nothing
807 RProblem _ -> Nothing
823 RProblem _ -> Nothing
808 RBlocked -> Nothing
824 RBlocked -> Nothing
@@ -831,7 +847,7 @@ data ReplArtifacts =
831fromRepl :: FilePath -> Details.Details -> B.ByteString -> IO (Either Exit.Repl ReplArtifacts)
847fromRepl :: FilePath -> Details.Details -> B.ByteString -> IO (Either Exit.Repl ReplArtifacts)
832fromRepl root details source =
848fromRepl root details source =
833 let
849 let
834− env@(Env _ _ pkg _ _ _) = makeEnv Reporting.ignorer root details
850+ env@(Env _ _ pkg _ _ _ _) = makeEnv Reporting.ignorer root details
835 in
851 in
836 case Parse.fromByteString pkg source of
852 case Parse.fromByteString pkg source of
837 Left syntaxError ->
853 Left syntaxError ->
@@ -857,12 +873,12 @@ fromRepl root details source =
857 putMVar rmvar resultMVars
873 putMVar rmvar resultMVars
858 results <- traverse readMVar resultMVars
874 results <- traverse readMVar resultMVars
859 writeDetails root details results
875 writeDetails root details results
860− depsStatus <- checkDeps root resultMVars deps
876+ depsStatus <- checkDeps root resultMVars deps 0
861 finalizeReplArtifacts env source modul depsStatus resultMVars results
877 finalizeReplArtifacts env source modul depsStatus resultMVars results
862
878
863
879
864finalizeReplArtifacts :: Env -> B.ByteString -> Src.Module -> DepsStatus -> ResultDict -> Map.Map ModuleName.Raw Result -> IO (Either Exit.Repl ReplArtifacts)
880finalizeReplArtifacts :: Env -> B.ByteString -> Src.Module -> DepsStatus -> ResultDict -> Map.Map ModuleName.Raw Result -> IO (Either Exit.Repl ReplArtifacts)
865−finalizeReplArtifacts env@(Env _ root pkg _ _ _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) depsStatus resultMVars results =
881+finalizeReplArtifacts env@(Env _ root pkg _ _ _ _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) depsStatus resultMVars results =
866 let
882 let
867 compileInput ifaces =
883 compileInput ifaces =
868 case Compile.compile pkg ifaces modul of
884 case Compile.compile pkg ifaces modul of
@@ -958,7 +974,7 @@ findLocation env path =
958
974
959
975
960findLoc :: Env -> FilePath -> FilePath -> IO (Either Exit.BuildProjectProblem Location)
976findLoc :: Env -> FilePath -> FilePath -> IO (Either Exit.BuildProjectProblem Location)
961−findLoc (Env _ root _ srcDirs _ _) path absolutePath =
977+findLoc (Env _ root _ srcDirs _ _ _) path absolutePath =
962 let
978 let
963 (dirs, file) = FP.splitFileName absolutePath
979 (dirs, file) = FP.splitFileName absolutePath
964 (final, ext) = FP.splitExtension file
980 (final, ext) = FP.splitExtension file
@@ -1054,7 +1070,7 @@ data MainStatus
1054
1070
1055
1071
1056crawlMain :: Env -> MVar StatusDict -> MainLocation -> IO MainStatus
1072crawlMain :: Env -> MVar StatusDict -> MainLocation -> IO MainStatus
1057−crawlMain env@(Env _ _ pkg _ _ _) mvar given =
1073+crawlMain env@(Env _ _ pkg _ buildID _ _) mvar given =
1058 case given of
1074 case given of
1059 LInside name ->
1075 LInside name ->
1060 do statusMVar <- newEmptyMVar
1076 do statusMVar <- newEmptyMVar
@@ -1069,7 +1085,7 @@ crawlMain env@(Env _ _ pkg _ _ _) mvar given =
1069 case Parse.fromByteString pkg source of
1085 case Parse.fromByteString pkg source of
1070 Right modul@(Src.Module _ _ _ imports values _ _ _ _) ->
1086 Right modul@(Src.Module _ _ _ imports values _ _ _ _) ->
1071 do let deps = map Src.getImportName imports
1087 do let deps = map Src.getImportName imports
1072− let local = Details.Local path time deps (any isMain values)
1088+ let local = Details.Local path time deps (any isMain values) buildID buildID
1073 crawlDeps env mvar deps (SOutsideOk local source modul)
1089 crawlDeps env mvar deps (SOutsideOk local source modul)
1074
1090
1075 Left syntaxError ->
1091 Left syntaxError ->
@@ -1089,7 +1105,7 @@ data MainResult
1089
1105
1090
1106
1091checkMain :: Env -> ResultDict -> MainStatus -> IO MainResult
1107checkMain :: Env -> ResultDict -> MainStatus -> IO MainResult
1092−checkMain env@(Env _ root _ _ _ _) results pendingMain =
1108+checkMain env@(Env _ root _ _ _ _ _) results pendingMain =
1093 case pendingMain of
1109 case pendingMain of
1094 SInside name ->
1110 SInside name ->
1095 return (RInside name)
1111 return (RInside name)
@@ -1097,8 +1113,8 @@ checkMain env@(Env _ root _ _ _ _) results pendingMain =
1097 SOutsideErr err ->
1113 SOutsideErr err ->
1098 return (ROutsideErr err)
1114 return (ROutsideErr err)
1099
1115
1100− SOutsideOk local@(Details.Local path time deps _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
1116+ SOutsideOk local@(Details.Local path time deps _ _ lastCompile) source modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
1101− do depsStatus <- checkDeps root results deps
1117+ do depsStatus <- checkDeps root results deps lastCompile
1102 case depsStatus of
1118 case depsStatus of
1103 DepsChange ifaces ->
1119 DepsChange ifaces ->
1104 compileOutside env local source ifaces modul
1120 compileOutside env local source ifaces modul
@@ -1118,7 +1134,7 @@ checkMain env@(Env _ root _ _ _ _) results pendingMain =
1118
1134
1119
1135
1120compileOutside :: Env -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO MainResult
1136compileOutside :: Env -> Details.Local -> B.ByteString -> Map.Map ModuleName.Raw I.Interface -> Src.Module -> IO MainResult
1121−compileOutside (Env key _ pkg _ _ _) (Details.Local path time _ _) source ifaces modul =
1137+compileOutside (Env key _ pkg _ _ _ _) (Details.Local path time _ _ _ _) source ifaces modul =
1122 let
1138 let
1123 name = Src.getName modul
1139 name = Src.getName modul
1124 in
1140 in
@@ -1141,7 +1157,7 @@ data Main
1141
1157
1142
1158
1143toArtifacts :: Env -> Dependencies -> Map.Map ModuleName.Raw Result -> NE.List MainResult -> Either Exit.BuildProblem Artifacts
1159toArtifacts :: Env -> Dependencies -> Map.Map ModuleName.Raw Result -> NE.List MainResult -> Either Exit.BuildProblem Artifacts
1144−toArtifacts (Env _ _ pkg _ _ _) foreigns results mainResults =
1160+toArtifacts (Env _ _ pkg _ _ _ _) foreigns results mainResults =
1145 case gatherProblemsOrMains results mainResults of
1161 case gatherProblemsOrMains results mainResults of
1146 Left (NE.List e es) ->
1162 Left (NE.List e es) ->
1147 Left (Exit.BuildBadModules e es)
1163 Left (Exit.BuildBadModules e es)
@@ -1178,7 +1194,7 @@ addInside name result modules =
1178 case result of
1194 case result of
1179 RNew _ iface objs _ -> Fresh name iface objs : modules
1195 RNew _ iface objs _ -> Fresh name iface objs : modules
1180 RSame _ iface objs _ -> Fresh name iface objs : modules
1196 RSame _ iface objs _ -> Fresh name iface objs : modules
1181− RCached main mvar -> Cached name main mvar : modules
1197+ RCached main _ mvar -> Cached name main mvar : modules
1182 RNotFound _ -> error (badInside name)
1198 RNotFound _ -> error (badInside name)
1183 RProblem _ -> error (badInside name)
1199 RProblem _ -> error (badInside name)
1184 RBlocked -> error (badInside name)
1200 RBlocked -> error (badInside name)