import Annex.Link
import Annex.Wanted
import Annex.CatFile
+import Annex.Action (quiesce)
import Logs.Group
import Logs.Trust
import Logs.PreferredContent
updateSimRepos st = updateSimRepoStates st >>= initNewSimRepos
updateSimRepoStates :: SimState SimRepo -> IO (SimState SimRepo)
-updateSimRepoStates inst = go inst (M.toList $ simRepoState inst)
+updateSimRepoStates = overSimRepoStates updateSimRepoState
+
+quiesceSim :: SimState SimRepo -> IO (SimState SimRepo)
+quiesceSim = overSimRepoStates go
+ where
+ go st sr = do
+ ((), astrd) <- Annex.run (simRepoAnnex sr) $ doQuietAction $
+ quiesce False
+ return $ sr
+ { simRepoAnnex = astrd
+ , simRepoCurrState = st
+ }
+
+overSimRepoStates :: (SimState SimRepo -> SimRepo -> IO SimRepo) -> SimState SimRepo -> IO (SimState SimRepo)
+overSimRepoStates a inst = go inst (M.toList $ simRepoState inst)
where
go st [] = return st
go st ((u, rst):rest) = case simRepo rst of
Just sr -> do
- sr' <- updateSimRepoState st sr
+ sr' <- a st sr
let rst' = rst { simRepo = Just sr' }
let st' = st
{ simRepoState = M.insert u rst'
suspendSim st = do
-- Update the sim repos before suspending, so that at restore time
-- they are up-to-date.
- st' <- updateSimRepos st
+ st' <- quiesceSim =<< updateSimRepos st
let st'' = st'
- { simRepoState = M.map freeze (simRepoState st)
+ { simRepoState = M.map freeze (simRepoState st')
}
- writeFile (simRootDirectory st </> "state") (show st'')
+ writeFile (simRootDirectory st'' </> "state") (show st'')
where
freeze :: SimRepoState SimRepo -> SimRepoState ()
freeze rst = rst { simRepo = Nothing }
seek ("run":simfile:[]) = startsim' (Just simfile) >>= cleanup
where
cleanup st = do
+ st' <- liftIO $ quiesceSim st
endsim
- when (simFailed st) $ do
- showsim st
+ when (simFailed st') $ do
+ showsim st'
giveup "Simulation shown above had errors."
seek ps = case parseSimCommand ps of
Left err -> giveup err