diff options
Diffstat (limited to 'Assistant/Threads/RemoteChecker.hs')
-rw-r--r-- | Assistant/Threads/RemoteChecker.hs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/Assistant/Threads/RemoteChecker.hs b/Assistant/Threads/RemoteChecker.hs new file mode 100644 index 000000000..ea0b578d2 --- /dev/null +++ b/Assistant/Threads/RemoteChecker.hs @@ -0,0 +1,46 @@ +{- git-annex assistant remote checker thread + - + - Copyright 2013 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.RemoteChecker ( + remoteCheckerThread +) where + +import Assistant.Common +import Utility.ThreadScheduler +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Remote +import qualified Types.Remote as Remote +import qualified Git.Fsck +import Assistant.Repair +import qualified Git +import Assistant.RemoteProblem +import Assistant.Sync + +import Data.Function + +{- Waits for problems with remotes, and tries to fsck the remote and repair + - the problem. -} +remoteCheckerThread :: UrlRenderer -> NamedThread +remoteCheckerThread urlrenderer = namedThread "RemoteChecker" $ forever $ do + mapM_ (handleProblem urlrenderer) + =<< liftIO . filterM (checkAvailable True) + =<< nubremotes <$> getRemoteProblems + liftIO $ threadDelaySeconds (Seconds 60) + where + nubremotes = nubBy ((==) `on` Remote.uuid) + +handleProblem :: UrlRenderer -> Remote -> Assistant () +handleProblem urlrenderer rmt + | Git.repoIsLocal r && not (Git.repoIsLocalUnknown r) = do + fsckresults <- showFscking urlrenderer (Just $ Remote.name rmt) $ tryNonAsync $ + Git.Fsck.findBroken True r + whenM (repairWhenNecessary urlrenderer (Remote.uuid rmt) (Just rmt) fsckresults) $ + syncRemote rmt + | otherwise = noop + where + r = Remote.repo rmt |