summaryrefslogtreecommitdiff
path: root/Logs/Location.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Logs/Location.hs')
-rw-r--r--Logs/Location.hs58
1 files changed, 58 insertions, 0 deletions
diff --git a/Logs/Location.hs b/Logs/Location.hs
new file mode 100644
index 000000000..4e8b2b535
--- /dev/null
+++ b/Logs/Location.hs
@@ -0,0 +1,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 Logs.Location (
+ LogStatus(..),
+ logChange,
+ readLog,
+ keyLocations,
+ loggedKeys,
+ logFile,
+ logFileKey
+) where
+
+import Common.Annex
+import qualified Git
+import qualified Annex.Branch
+import Logs.UUID
+import Logs.Presence
+
+{- 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