git-annex/Logs/Presence.hs

72 lines
2.1 KiB
Haskell
Raw Normal View History

{- git-annex presence log
-
- This is used to store presence information in the git-annex branch in
- a way that can be union merged.
-
- A line of the log will look like: "date N INFO"
- Where N=1 when the INFO is present, 0 otherwise.
-
- Copyright 2010-2014 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU AGPL version 3 or higher.
-}
2011-10-15 20:21:08 +00:00
module Logs.Presence (
module X,
2011-07-01 21:15:46 +00:00
addLog,
maybeAddLog,
readLog,
logNow,
currentLog,
currentLogInfo,
historicalLogInfo,
) where
import Logs.Presence.Pure as X
import Annex.Common
import Annex.VectorClock
2011-10-04 04:40:47 +00:00
import qualified Annex.Branch
import Git.Types (RefDate)
{- Adds a LogLine to the log, removing any LogLines that are obsoleted by
- adding it. -}
2011-07-01 21:15:46 +00:00
addLog :: FilePath -> LogLine -> Annex ()
addLog file line = Annex.Branch.change file $ \b ->
buildLog $ compactLog (line : parseLog b)
2011-07-01 21:15:46 +00:00
{- When a LogLine already exists with the same status and info, but an
- older timestamp, that LogLine is preserved, rather than updating the log
- with a newer timestamp.
-}
maybeAddLog :: FilePath -> LogLine -> Annex ()
maybeAddLog file line = Annex.Branch.maybeChange file $ \s -> do
m <- insertNewStatus line $ logMap $ parseLog s
return $ buildLog $ mapLog m
{- Reads a log file.
- Note that the LogLines returned may be in any order. -}
readLog :: FilePath -> Annex [LogLine]
2012-06-29 14:00:05 +00:00
readLog = parseLog <$$> Annex.Branch.get
{- Generates a new LogLine with the current time. -}
logNow :: LogStatus -> LogInfo -> Annex LogLine
logNow s i = do
c <- liftIO currentVectorClock
return $ LogLine c s i
{- Reads a log and returns only the info that is still in effect. -}
currentLogInfo :: FilePath -> Annex [LogInfo]
currentLogInfo file = map info <$> currentLog file
currentLog :: FilePath -> Annex [LogLine]
currentLog file = filterPresent <$> readLog file
{- Reads a historical version of a log and returns the info that was in
- effect at that time.
-
- The date is formatted as shown in gitrevisions man page.
-}
historicalLogInfo :: RefDate -> FilePath -> Annex [LogInfo]
historicalLogInfo refdate file = map info . filterPresent . parseLog
<$> Annex.Branch.getHistorical refdate file