summaryrefslogtreecommitdiff
path: root/Trust.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-06-23 21:25:39 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-06-23 21:25:39 -0400
commit69d3c1cec9f6be1dba1ffb391bf69464c52f5936 (patch)
tree25409afd87286b599c65bd61e403a597413a86b0 /Trust.hs
parenta61154baf5e205af74766f44fe99cbbd63411f57 (diff)
cache the trustmap
Doubles the speed of fsck, and speeds up drop as well.
Diffstat (limited to 'Trust.hs')
-rw-r--r--Trust.hs19
1 files changed, 12 insertions, 7 deletions
diff --git a/Trust.hs b/Trust.hs
index d328235bf..365186da2 100644
--- a/Trust.hs
+++ b/Trust.hs
@@ -9,15 +9,13 @@ module Trust (
TrustLevel(..),
trustLog,
trustGet,
- trustMap,
- trustMapParse,
trustSet
) where
import Control.Monad.State
import qualified Data.Map as M
-import TrustLevel
+import Types.TrustLevel
import qualified Branch
import Types
import UUID
@@ -35,11 +33,17 @@ trustGet level = do
{- Read the trustLog into a map, overriding with any
- values from forcetrust -}
-trustMap :: Annex (M.Map UUID TrustLevel)
+trustMap :: Annex TrustMap
trustMap = do
- overrides <- Annex.getState Annex.forcetrust
- s <- Branch.get trustLog
- return $ M.fromList $ trustMapParse s ++ overrides
+ cached <- Annex.getState Annex.trustmap
+ case cached of
+ Just m -> return m
+ Nothing -> do
+ overrides <- Annex.getState Annex.forcetrust
+ l <- Branch.get trustLog
+ let m = M.fromList $ trustMapParse l ++ overrides
+ Annex.changeState $ \s -> s { Annex.trustmap = Just m }
+ return m
{- Trust map parser. -}
trustMapParse :: String -> [(UUID, TrustLevel)]
@@ -62,6 +66,7 @@ trustSet uuid level = do
when (M.lookup uuid m /= Just level) $ do
let m' = M.insert uuid level m
Branch.change trustLog (serialize m')
+ Annex.changeState $ \s -> s { Annex.trustmap = Just m' }
where
serialize m = unlines $ map showpair $ M.toList m
showpair (u, t) = u ++ " " ++ show t