diff options
-rw-r--r-- | Command/MetaData.hs | 18 | ||||
-rw-r--r-- | Logs/MetaData.hs | 18 |
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. |