aboutsummaryrefslogtreecommitdiff
path: root/RemoteDaemon/Common.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-04-08 13:41:36 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-04-08 13:42:57 -0400
commit6e47a1412175cbc00f44ea8dc663ad83331cfb6d (patch)
treeecd8cec02d1a56ea38513cfb893b86504c606a3c /RemoteDaemon/Common.hs
parent4772321f6a7359f282270c48be0e73563f8d7ae6 (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 000000000..29aeb00d3
--- /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)