summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Command/MetaData.hs18
-rw-r--r--Logs/MetaData.hs18
2 files changed, 22 insertions, 14 deletions
diff --git a/Command/MetaData.hs b/Command/MetaData.hs
index a645b274a..cc0364a30 100644
--- a/Command/MetaData.hs
+++ b/Command/MetaData.hs
@@ -14,6 +14,7 @@ import Logs.MetaData
import Types.MetaData
import qualified Data.Set as S
+import Data.Time.Clock.POSIX
def :: [Command]
def = [withOptions [setOption] $ command "metadata" paramPaths seek
@@ -30,19 +31,20 @@ setOption = Option ['s'] ["set"] (ReqArg mkmod "field[+-]=value") "set metadata"
seek :: CommandSeek
seek ps = do
modmeta <- Annex.getState Annex.modmeta
- withFilesInGit (whenAnnexed $ start modmeta) ps
+ now <- liftIO getPOSIXTime
+ withFilesInGit (whenAnnexed $ start now modmeta) ps
-start :: [ModMeta] -> FilePath -> (Key, Backend) -> CommandStart
-start ms file (k, _) = do
+start :: POSIXTime -> [ModMeta] -> FilePath -> (Key, Backend) -> CommandStart
+start now ms file (k, _) = do
showStart "metadata" file
- next $ perform k ms
+ next $ perform now ms k
-perform :: Key -> [ModMeta] -> CommandPerform
-perform k [] = next $ cleanup k
-perform k ms = do
+perform :: POSIXTime -> [ModMeta] -> Key -> CommandPerform
+perform _ [] k = next $ cleanup k
+perform now ms k = do
oldm <- getCurrentMetaData k
let m = foldl' unionMetaData newMetaData $ map (modMeta oldm) ms
- addMetaData k m
+ addMetaData' k m now
next $ cleanup k
cleanup :: Key -> CommandCleanup
diff --git a/Logs/MetaData.hs b/Logs/MetaData.hs
index 0310ccc17..a959743df 100644
--- a/Logs/MetaData.hs
+++ b/Logs/MetaData.hs
@@ -31,6 +31,7 @@ module Logs.MetaData (
setMetaData,
unsetMetaData,
addMetaData,
+ addMetaData',
currentMetaData,
) where
@@ -70,12 +71,17 @@ setMetaData' isset k field s = addMetaData k $
{- Adds in some metadata, which can override existing values, or unset
- them, but otherwise leaves any existing metadata as-is. -}
addMetaData :: Key -> MetaData -> Annex ()
-addMetaData k metadata = do
- now <- liftIO getPOSIXTime
- Annex.Branch.change (metaDataLogFile k) $
- showLog . simplifyLog
- . S.insert (LogEntry now metadata)
- . parseLog
+addMetaData k metadata = addMetaData' k metadata =<< liftIO getPOSIXTime
+
+{- Reusing the same timestamp when making changes to the metadata
+ - of multiple keys is a nice optimisation. The same metadata lines
+ - will tend to be generated across the different log files, and so
+ - git will be able to pack the data more efficiently. -}
+addMetaData' :: Key -> MetaData -> POSIXTime -> Annex ()
+addMetaData' k metadata now = Annex.Branch.change (metaDataLogFile k) $
+ showLog . simplifyLog
+ . S.insert (LogEntry now metadata)
+ . parseLog
{- Simplify a log, removing historical values that are no longer
- needed.