72 lines
2.1 KiB
Haskell
72 lines
2.1 KiB
Haskell
{- 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 GPL version 3 or higher.
|
|
-}
|
|
|
|
module Logs.Presence (
|
|
module X,
|
|
addLog,
|
|
maybeAddLog,
|
|
readLog,
|
|
logNow,
|
|
currentLog,
|
|
currentLogInfo,
|
|
historicalLogInfo,
|
|
) where
|
|
|
|
import Data.Time.Clock.POSIX
|
|
|
|
import Logs.Presence.Pure as X
|
|
import Annex.Common
|
|
import qualified Annex.Branch
|
|
import Git.Types (RefDate)
|
|
|
|
{- Adds a LogLine to the log, removing any LogLines that are obsoleted by
|
|
- adding it. -}
|
|
addLog :: FilePath -> LogLine -> Annex ()
|
|
addLog file line = Annex.Branch.change file $ \s ->
|
|
showLog $ compactLog (line : parseLog s)
|
|
|
|
{- 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 $ showLog $ mapLog m
|
|
|
|
{- Reads a log file.
|
|
- Note that the LogLines returned may be in any order. -}
|
|
readLog :: FilePath -> Annex [LogLine]
|
|
readLog = parseLog <$$> Annex.Branch.get
|
|
|
|
{- Generates a new LogLine with the current date. -}
|
|
logNow :: LogStatus -> String -> Annex LogLine
|
|
logNow s i = do
|
|
now <- liftIO getPOSIXTime
|
|
return $ LogLine now s i
|
|
|
|
{- Reads a log and returns only the info that is still in effect. -}
|
|
currentLogInfo :: FilePath -> Annex [String]
|
|
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 [String]
|
|
historicalLogInfo refdate file = map info . filterPresent . parseLog
|
|
<$> Annex.Branch.getHistorical refdate file
|