git-annex/LocationLog.hs

65 lines
1.6 KiB
Haskell
Raw Normal View History

2010-10-09 23:22:40 +00:00
{- git-annex location log
-
2011-04-02 19:50:51 +00:00
- git-annex keeps track of which repositories have the contents of annexed
- files.
2010-10-09 23:22:40 +00:00
-
2010-10-12 22:06:34 +00:00
- Repositories record their UUID and the date when they --get or --drop
2010-10-13 00:04:36 +00:00
- a value.
2010-10-10 16:31:14 +00:00
-
2011-04-02 19:50:51 +00:00
- Copyright 2010-2011 Joey Hess <joey@kitenet.net>
2010-10-27 20:53:54 +00:00
-
- Licensed under the GNU GPL version 3 or higher.
2010-10-09 23:22:40 +00:00
-}
2010-10-11 21:52:46 +00:00
module LocationLog (
2010-10-12 22:25:41 +00:00
LogStatus(..),
logChange,
2011-03-16 15:53:46 +00:00
readLog,
writeLog,
2011-04-02 19:50:51 +00:00
keyLocations,
2011-07-01 21:23:01 +00:00
loggedKeys,
logFile,
logFileKey
2010-10-11 21:52:46 +00:00
) where
2010-10-09 23:22:40 +00:00
2011-04-02 19:50:51 +00:00
import System.FilePath
import Control.Monad (when)
2011-04-02 19:50:51 +00:00
import Data.Maybe
2010-10-16 20:20:49 +00:00
import qualified Git
2011-06-22 20:01:32 +00:00
import qualified Branch
2010-10-12 22:06:34 +00:00
import UUID
2010-10-14 07:18:11 +00:00
import Types
import Locations
import PresenceLog
2010-10-09 23:22:40 +00:00
2011-06-22 20:01:32 +00:00
{- Log a change in the presence of a key's value in a repository. -}
logChange :: Git.Repo -> Key -> UUID -> LogStatus -> Annex ()
2010-10-31 19:50:07 +00:00
logChange repo key u s = do
when (null u) $
error $ "unknown UUID for " ++ Git.repoDescribe repo ++
" (have you run git annex init there?)"
2011-07-01 21:15:46 +00:00
addLog (logFile key) =<< logNow s u
2010-10-12 22:25:41 +00:00
{- Returns a list of repository UUIDs that, according to the log, have
2010-10-13 00:04:36 +00:00
- the value of a key. -}
2011-06-22 20:13:43 +00:00
keyLocations :: Key -> Annex [UUID]
keyLocations key = currentLog $ logFile key
2011-04-02 19:50:51 +00:00
{- Finds all keys that have location log information.
- (There may be duplicate keys in the list.) -}
loggedKeys :: Annex [Key]
loggedKeys = return . mapMaybe (logFileKey . takeFileName) =<< Branch.files
2011-07-01 21:23:01 +00:00
{- The filename of the log file for a given key. -}
logFile :: Key -> String
logFile key = hashDirLower key ++ keyFile key ++ ".log"
{- Converts a log filename into a key. -}
logFileKey :: FilePath -> Maybe Key
logFileKey file
| end == ".log" = fileKey beginning
2011-07-01 21:23:01 +00:00
| otherwise = Nothing
where
(beginning, end) = splitAt (length file - 4) file