summaryrefslogtreecommitdiff
path: root/AnnexQueue.hs
diff options
context:
space:
mode:
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 }