summaryrefslogtreecommitdiff
path: root/Assistant/Fsck.hs
blob: 9d8848ba983c89ea8ce11939c89a5e37220370c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{- git-annex assistant fscking
 -
 - Copyright 2013 Joey Hess <id@joeyh.name>
 -
 - Licensed under the GNU GPL version 3 or higher.
 -}

module Assistant.Fsck where

import Assistant.Common
import Types.ScheduledActivity
import qualified Types.Remote as Remote
import Annex.UUID
import Assistant.Alert
import Assistant.Types.UrlRenderer
import Logs.Schedule
import qualified Annex

import qualified Data.Set as S

{- Displays a nudge in the webapp if a fsck is not configured for
 - the specified remote, or for the local repository. -}
fsckNudge :: UrlRenderer -> Maybe Remote -> Assistant ()
fsckNudge urlrenderer mr
	| maybe True fsckableRemote mr =
		whenM (liftAnnex $ annexFsckNudge <$> Annex.getGitConfig) $
			unlessM (liftAnnex $ checkFscked mr) $
				notFsckedNudge urlrenderer mr
	| otherwise = noop

fsckableRemote :: Remote -> Bool
fsckableRemote = isJust . Remote.remoteFsck

{- Checks if the remote, or the local repository, has a fsck scheduled.
 - Only looks at fscks configured to run via the local repository, not
 - other repositories. -}
checkFscked :: Maybe Remote -> Annex Bool
checkFscked mr = any wanted . S.toList <$> (scheduleGet =<< getUUID)
  where
	wanted = case mr of
		Nothing -> isSelfFsck
		Just r -> flip isFsckOf (Remote.uuid r)

isSelfFsck :: ScheduledActivity -> Bool
isSelfFsck (ScheduledSelfFsck _ _) = True
isSelfFsck _ = False

isFsckOf :: ScheduledActivity -> UUID -> Bool
isFsckOf (ScheduledRemoteFsck u _ _) u' = u == u'
isFsckOf _ _ = False