summaryrefslogtreecommitdiff
path: root/LocationLog.hs
blob: 5cbdbb28a1584227f72cbdd7844a8c7be02dd669 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{- git-annex location log
 -
 - git-annex keeps track of which repositories have the contents of annexed
 - files.
 -
 - Repositories record their UUID and the date when they --get or --drop
 - a value.
 - 
 - Copyright 2010-2011 Joey Hess <joey@kitenet.net>
 -
 - Licensed under the GNU GPL version 3 or higher.
 -}

module LocationLog (
	LogStatus(..),
	logChange,
	readLog,
	keyLocations,
	loggedKeys,
	logFile,
	logFileKey
) where

import Common.Annex
import qualified Git
import qualified Annex.Branch
import UUID
import PresenceLog

{- Log a change in the presence of a key's value in a repository. -}
logChange :: Git.Repo -> Key -> UUID -> LogStatus -> Annex ()
logChange repo key u s
	| null u = error $
		"unknown UUID for " ++ Git.repoDescribe repo ++ 
		" (have you run git annex init there?)"
	| otherwise = addLog (logFile key) =<< logNow s u

{- Returns a list of repository UUIDs that, according to the log, have
 - the value of a key. -}
keyLocations :: Key -> Annex [UUID]
keyLocations = currentLog . logFile

{- Finds all keys that have location log information.
 - (There may be duplicate keys in the list.) -}
loggedKeys :: Annex [Key]
loggedKeys = mapMaybe (logFileKey . takeFileName) <$> Annex.Branch.files

{- 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
	| otherwise = Nothing
	where
		(beginning, end) = splitAt (length file - 4) file