2011-11-26 23:39:47 +11:00
|
|
|
{-# LANGUAGE BangPatterns #-}
|
|
|
|
|
2010-10-09 19:22:40 -04:00
|
|
|
{- git-annex location log
|
|
|
|
-
|
2011-04-02 15:50:51 -04:00
|
|
|
- git-annex keeps track of which repositories have the contents of annexed
|
|
|
|
- files.
|
2010-10-09 19:22:40 -04:00
|
|
|
-
|
2010-10-12 18:06:34 -04:00
|
|
|
- Repositories record their UUID and the date when they --get or --drop
|
2010-10-12 20:04:36 -04:00
|
|
|
- a value.
|
2010-10-10 12:31:14 -04:00
|
|
|
-
|
2015-01-21 12:50:09 -04:00
|
|
|
- Copyright 2010-2014 Joey Hess <id@joeyh.name>
|
2010-10-27 16:53:54 -04:00
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
2010-10-09 19:22:40 -04:00
|
|
|
-}
|
|
|
|
|
2011-10-15 16:21:08 -04:00
|
|
|
module Logs.Location (
|
2010-10-12 18:25:41 -04:00
|
|
|
LogStatus(..),
|
2012-12-12 19:20:38 -04:00
|
|
|
logStatus,
|
2010-10-13 15:55:18 -04:00
|
|
|
logChange,
|
2012-01-10 13:11:16 -04:00
|
|
|
loggedLocations,
|
2014-02-06 12:43:56 -04:00
|
|
|
loggedLocationsHistorical,
|
2011-07-01 17:23:01 -04:00
|
|
|
loggedKeys,
|
2011-10-29 17:49:37 -04:00
|
|
|
loggedKeysFor,
|
2010-10-11 17:52:46 -04:00
|
|
|
) where
|
2010-10-09 19:22:40 -04:00
|
|
|
|
2011-10-05 16:02:51 -04:00
|
|
|
import Common.Annex
|
2011-10-04 00:40:47 -04:00
|
|
|
import qualified Annex.Branch
|
2013-08-29 18:51:22 -04:00
|
|
|
import Logs
|
2011-10-15 16:21:08 -04:00
|
|
|
import Logs.Presence
|
2012-12-12 19:20:38 -04:00
|
|
|
import Annex.UUID
|
2014-02-06 12:43:56 -04:00
|
|
|
import Git.Types (RefDate)
|
2015-01-28 17:17:26 -04:00
|
|
|
import qualified Annex
|
2012-12-12 19:20:38 -04:00
|
|
|
|
|
|
|
{- Log a change in the presence of a key's value in current repository. -}
|
|
|
|
logStatus :: Key -> LogStatus -> Annex ()
|
2013-09-04 21:37:13 -04:00
|
|
|
logStatus key s = do
|
2012-12-12 19:20:38 -04:00
|
|
|
u <- getUUID
|
2013-09-04 21:37:13 -04:00
|
|
|
logChange key u s
|
2010-10-09 19:22:40 -04:00
|
|
|
|
2011-06-22 16:01:32 -04:00
|
|
|
{- Log a change in the presence of a key's value in a repository. -}
|
2011-11-09 01:15:51 -04:00
|
|
|
logChange :: Key -> UUID -> LogStatus -> Annex ()
|
2015-01-28 17:17:26 -04:00
|
|
|
logChange key (UUID u) s = do
|
|
|
|
config <- Annex.getGitConfig
|
|
|
|
addLog (locationLogFile config key) =<< logNow s u
|
2012-04-21 23:32:33 -04:00
|
|
|
logChange _ NoUUID _ = noop
|
2010-10-12 18:25:41 -04:00
|
|
|
|
|
|
|
{- Returns a list of repository UUIDs that, according to the log, have
|
2014-02-06 12:43:56 -04:00
|
|
|
- the value of a key. -}
|
2012-01-10 13:11:16 -04:00
|
|
|
loggedLocations :: Key -> Annex [UUID]
|
2014-02-06 12:43:56 -04:00
|
|
|
loggedLocations = getLoggedLocations currentLog
|
|
|
|
|
|
|
|
{- Gets the location log on a particular date. -}
|
|
|
|
loggedLocationsHistorical :: RefDate -> Key -> Annex [UUID]
|
|
|
|
loggedLocationsHistorical = getLoggedLocations . historicalLog
|
|
|
|
|
|
|
|
getLoggedLocations :: (FilePath -> Annex [String]) -> Key -> Annex [UUID]
|
2015-01-28 17:17:26 -04:00
|
|
|
getLoggedLocations getter key = do
|
|
|
|
config <- Annex.getGitConfig
|
|
|
|
map toUUID <$> (getter . locationLogFile config) key
|
2011-04-02 15:50:51 -04:00
|
|
|
|
2011-04-02 20:36:01 -04:00
|
|
|
{- Finds all keys that have location log information.
|
|
|
|
- (There may be duplicate keys in the list.) -}
|
2011-06-22 23:24:14 -04:00
|
|
|
loggedKeys :: Annex [Key]
|
2013-08-29 18:51:22 -04:00
|
|
|
loggedKeys = mapMaybe locationLogFileKey <$> Annex.Branch.files
|
2011-07-01 17:23:01 -04:00
|
|
|
|
2011-10-29 17:49:37 -04:00
|
|
|
{- Finds all keys that have location log information indicating
|
|
|
|
- they are present for the specified repository. -}
|
|
|
|
loggedKeysFor :: UUID -> Annex [Key]
|
|
|
|
loggedKeysFor u = filterM isthere =<< loggedKeys
|
2012-11-11 00:51:07 -04:00
|
|
|
where
|
|
|
|
{- This should run strictly to avoid the filterM
|
|
|
|
- building many thunks containing keyLocations data. -}
|
|
|
|
isthere k = do
|
|
|
|
us <- loggedLocations k
|
|
|
|
let !there = u `elem` us
|
|
|
|
return there
|