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