summaryrefslogtreecommitdiff
path: root/Annex/Queue.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-02-15 11:13:13 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-02-15 11:14:19 -0400
commit52c5b164d8dee3761b6ad96e3d636f862a2344e3 (patch)
tree71ef23b51d9bea9361cadec70db135f6bd60152d /Annex/Queue.hs
parentc26db2625934e315163077d19d814bc71df7ef6e (diff)
Added a annex.queuesize setting
useful when adding hundreds of thousands of files on a system with plenty of memory. git add gets quite slow in such a large repository, so if the system has more than the ~32 mb of memory the queue can use by default, it's a useful optimisation to increase the queue size, in order to decrease the number of times git add is run.
Diffstat (limited to 'Annex/Queue.hs')
-rw-r--r--Annex/Queue.hs22
1 files changed, 17 insertions, 5 deletions
diff --git a/Annex/Queue.hs b/Annex/Queue.hs
index f611cf02e..df6ba12a2 100644
--- a/Annex/Queue.hs
+++ b/Annex/Queue.hs
@@ -12,30 +12,42 @@ module Annex.Queue (
) where
import Common.Annex
-import Annex
+import Annex hiding (new)
import qualified Git.Queue
+import qualified Git.Config
{- Adds a git command to the queue. -}
add :: String -> [CommandParam] -> [FilePath] -> Annex ()
add command params files = do
- q <- getState repoqueue
+ q <- get
store $ Git.Queue.add q command params files
{- Runs the queue if it is full. Should be called periodically. -}
flushWhenFull :: Annex ()
flushWhenFull = do
- q <- getState repoqueue
+ q <- get
when (Git.Queue.full q) $ flush False
{- Runs (and empties) the queue. -}
flush :: Bool -> Annex ()
flush silent = do
- q <- getState repoqueue
+ q <- get
unless (0 == Git.Queue.size q) $ do
unless silent $
showSideAction "Recording state in git"
q' <- inRepo $ Git.Queue.flush q
store q'
+get :: Annex Git.Queue.Queue
+get = maybe new return =<< getState repoqueue
+
+new :: Annex Git.Queue.Queue
+new = do
+ q <- Git.Queue.new <$> fromRepo queuesize
+ store q
+ return q
+ where
+ queuesize r = readish =<< Git.Config.getMaybe "annex.queuesize" r
+
store :: Git.Queue.Queue -> Annex ()
-store q = changeState $ \s -> s { repoqueue = q }
+store q = changeState $ \s -> s { repoqueue = Just q }