summaryrefslogtreecommitdiff
path: root/Logs/Schedule.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Logs/Schedule.hs')
-rw-r--r--Logs/Schedule.hs71
1 files changed, 71 insertions, 0 deletions
diff --git a/Logs/Schedule.hs b/Logs/Schedule.hs
new file mode 100644
index 000000000..35745b9f3
--- /dev/null
+++ b/Logs/Schedule.hs
@@ -0,0 +1,71 @@
+{- git-annex scheduled activities log
+ -
+ - Copyright 2013 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Logs.Schedule (
+ scheduleLog,
+ scheduleSet,
+ scheduleAdd,
+ scheduleRemove,
+ scheduleChange,
+ scheduleGet,
+ scheduleMap,
+ getLastRunTimes,
+ setLastRunTime,
+) where
+
+import qualified Data.Map as M
+import qualified Data.Set as S
+import Data.Time.Clock.POSIX
+import Data.Time.LocalTime
+
+import Common.Annex
+import Types.ScheduledActivity
+import qualified Annex.Branch
+import Logs
+import Logs.UUIDBased
+
+scheduleSet :: UUID -> [ScheduledActivity] -> Annex ()
+scheduleSet uuid@(UUID _) activities = do
+ ts <- liftIO getPOSIXTime
+ Annex.Branch.change scheduleLog $
+ showLog id . changeLog ts uuid val . parseLog Just
+ where
+ val = intercalate "; " $ map fromScheduledActivity activities
+scheduleSet NoUUID _ = error "unknown UUID; cannot modify"
+
+scheduleMap :: Annex (M.Map UUID [ScheduledActivity])
+scheduleMap = simpleMap
+ . parseLogWithUUID parser
+ <$> Annex.Branch.get scheduleLog
+ where
+ parser _uuid = Just . mapMaybe toScheduledActivity . split "; "
+
+scheduleGet :: UUID -> Annex (S.Set ScheduledActivity)
+scheduleGet u = do
+ m <- scheduleMap
+ return $ maybe S.empty S.fromList (M.lookup u m)
+
+scheduleRemove :: UUID -> ScheduledActivity -> Annex ()
+scheduleRemove u activity = scheduleChange u $ S.delete activity
+
+scheduleAdd :: UUID -> ScheduledActivity -> Annex ()
+scheduleAdd u activity = scheduleChange u $ S.insert activity
+
+scheduleChange :: UUID -> (S.Set ScheduledActivity -> S.Set ScheduledActivity) -> Annex ()
+scheduleChange u a = scheduleSet u . S.toList . a =<< scheduleGet u
+
+getLastRunTimes :: Annex (M.Map ScheduledActivity LocalTime)
+getLastRunTimes = do
+ f <- fromRepo gitAnnexScheduleState
+ liftIO $ fromMaybe M.empty
+ <$> catchDefaultIO Nothing (readish <$> readFile f)
+
+setLastRunTime :: ScheduledActivity -> LocalTime -> Annex ()
+setLastRunTime activity lastrun = do
+ f <- fromRepo gitAnnexScheduleState
+ liftIO . writeFile f . show . M.insert activity lastrun
+ =<< getLastRunTimes