summaryrefslogtreecommitdiff
path: root/AnnexQueue.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-04-07 13:59:31 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-04-07 13:59:31 -0400
commitbc51387e6dd426f46f9ab0ef23e6e3eefe7a4417 (patch)
tree9627f60c81d1852b731ea57171f4b36887847e9b /AnnexQueue.hs
parent77f45e4e45d45a08bfe1bec210909345adb6f6d8 (diff)
Periodically flush git command queue, to avoid boating memory usage too much.
Since the queue is flushed in between subcommand actions being run, there should be no issues with actions that expect to queue up some stuff and have it run after they do other stuff. So I didn't have to audit for such assumptions.
Diffstat (limited to 'AnnexQueue.hs')
-rw-r--r--AnnexQueue.hs47
1 files changed, 47 insertions, 0 deletions
diff --git a/AnnexQueue.hs b/AnnexQueue.hs
new file mode 100644
index 000000000..58e77a6e8
--- /dev/null
+++ b/AnnexQueue.hs
@@ -0,0 +1,47 @@
+{- git-annex command queue
+ -
+ - Copyright 2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module AnnexQueue (
+ add,
+ flush,
+ flushWhenFull
+) where
+
+import Control.Monad.State (liftIO)
+import Control.Monad (when, unless)
+
+import Annex
+import Messages
+import qualified GitQueue
+import Utility
+
+{- Adds a git command to the queue, possibly running previously queued
+ - actions if enough have accumulated. -}
+add :: String -> [CommandParam] -> FilePath -> Annex ()
+add command params file = do
+ q <- getState repoqueue
+ store $ GitQueue.add q command params file
+
+{- Runs the queue if it is full. Should be called periodically. -}
+flushWhenFull :: Annex ()
+flushWhenFull = do
+ q <- getState repoqueue
+ when (GitQueue.full q) $ flush False
+
+{- Runs (and empties) the queue. -}
+flush :: Bool -> Annex ()
+flush silent = do
+ q <- getState repoqueue
+ unless (0 == GitQueue.size q) $ do
+ unless silent $
+ showSideAction "Recording state in git..."
+ g <- gitRepo
+ q' <- liftIO $ GitQueue.flush g q
+ store q'
+
+store :: GitQueue.Queue -> Annex ()
+store q = changeState $ \s -> s { repoqueue = q }