1{- git-annex activity log 2 - 3 - Copyright 2015-2021 Joey Hess <id@joeyh.name> 4 - 5 - Licensed under the GNU AGPL version 3 or higher. 6 -} 7 8module Logs.Activity ( 9 Log, 10 Activity(..), 11 allActivities, 12 recordActivity, 13 lastActivities, 14) where 15 16import Annex.Common 17import qualified Annex.Branch 18import Logs 19import Logs.UUIDBased 20 21import qualified Data.ByteString as S 22import qualified Data.Attoparsec.ByteString as A 23import Data.ByteString.Builder 24 25data Activity 26 = Fsck 27 -- Allow for unknown activities to be added later. 28 | UnknownActivity S.ByteString 29 deriving (Eq, Read, Show) 30 31allActivities :: [Activity] 32allActivities = [Fsck] 33 34-- Record an activity. This takes the place of previously recorded activity 35-- for the UUID. 36recordActivity :: Activity -> UUID -> Annex () 37recordActivity act uuid = do 38 c <- currentVectorClock 39 Annex.Branch.change (Annex.Branch.RegardingUUID [uuid]) activityLog $ 40 buildLogOld buildActivity 41 . changeLog c uuid act 42 . parseLogOld parseActivity 43 44-- Most recent activity for each UUID. 45lastActivities :: Maybe Activity -> Annex (Log Activity) 46lastActivities wantact = parseLogOld (onlywanted =<< parseActivity) 47 <$> Annex.Branch.get activityLog 48 where 49 onlywanted a 50 | wanted a = pure a 51 | otherwise = fail "unwanted activity" 52 wanted a = maybe True (a ==) wantact 53 54buildActivity :: Activity -> Builder 55buildActivity (UnknownActivity b) = byteString b 56buildActivity a = byteString $ encodeBS $ show a 57 58parseActivity :: A.Parser Activity 59parseActivity = go <$> A.takeByteString 60 where 61 go b = fromMaybe (UnknownActivity b) (readish $ decodeBS b) 62