summaryrefslogtreecommitdiff
path: root/RemoteDaemon/Common.hs
diff options
context:
space:
mode:
authorJoey Hess <joey@kitenet.net>2014-04-08 13:41:36 -0400
committerJoey Hess <joey@kitenet.net>2014-04-08 13:42:57 -0400
commitfa0cf81b260abe043d416a7d7ef0da5f44e8ea70 (patch)
treeeaf0d5c0bc39afe5805714e59d45c3471f56f9f7 /RemoteDaemon/Common.hs
parentb3b07ab330a43086fa552983a252d1c0c40c86ab (diff)
cleaned up AnnexState handling in transports
Diffstat (limited to 'RemoteDaemon/Common.hs')
-rw-r--r--RemoteDaemon/Common.hs42
1 files changed, 42 insertions, 0 deletions
diff --git a/RemoteDaemon/Common.hs b/RemoteDaemon/Common.hs
new file mode 100644
index 0000000000..29aeb00d3b
--- /dev/null
+++ b/RemoteDaemon/Common.hs
@@ -0,0 +1,42 @@
+{- git-remote-daemon utilities
+ -
+ - Copyright 2014 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module RemoteDaemon.Common
+ ( liftAnnex
+ , inLocalRepo
+ , checkNewShas
+ ) where
+
+import qualified Annex
+import Common.Annex
+import RemoteDaemon.Types
+import qualified Git
+import Annex.CatFile
+
+import Control.Concurrent
+
+-- Runs an Annex action. Long-running actions should be avoided,
+-- since only one liftAnnex can be running at a time, amoung all
+-- transports.
+liftAnnex :: TransportHandle -> Annex a -> IO a
+liftAnnex (TransportHandle _ annexstate) a = do
+ st <- takeMVar annexstate
+ (r, st') <- Annex.run st a
+ putMVar annexstate st'
+ return r
+
+inLocalRepo :: TransportHandle -> (Git.Repo -> IO a) -> IO a
+inLocalRepo (TransportHandle g _) a = a g
+
+-- Check if any of the shas are actally new in the local git repo,
+-- to avoid unnecessary fetching.
+checkNewShas :: TransportHandle -> [Git.Sha] -> IO Bool
+checkNewShas transporthandle = check
+ where
+ check [] = return True
+ check (r:rs) = maybe (check rs) (const $ return False)
+ =<< liftAnnex transporthandle (catObjectDetails r)