nice git ack space optimisation when setting the same metadata value for multiple files

This commit is contained in:
Joey Hess 2014-02-13 01:57:43 -04:00
parent 0e9a72b356
commit a18eae9a0f
Failed to extract signature
2 changed files with 22 additions and 14 deletions

View file

@ -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.