summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex.hs2
-rw-r--r--Branch.hs50
2 files changed, 52 insertions, 0 deletions
diff --git a/Annex.hs b/Annex.hs
index 0d6b309cc..bede0cbfb 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -39,6 +39,7 @@ data AnnexState = AnnexState
, quiet :: Bool
, force :: Bool
, fast :: Bool
+ , updated :: Bool
, forcebackend :: Maybe String
, forcenumcopies :: Maybe Int
, defaultkey :: Maybe String
@@ -59,6 +60,7 @@ newState allbackends gitrepo = AnnexState
, quiet = False
, force = False
, fast = False
+ , updated = False
, forcebackend = Nothing
, forcenumcopies = Nothing
, defaultkey = Nothing
diff --git a/Branch.hs b/Branch.hs
new file mode 100644
index 000000000..db8dc23da
--- /dev/null
+++ b/Branch.hs
@@ -0,0 +1,50 @@
+{- git-annex branch management
+ -
+ - Copyright 2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Branch where
+
+import Control.Monad (unless)
+import Control.Monad.State (liftIO)
+
+import GitUnionMerge
+import GitRepo as Git
+import qualified Annex
+import Utility
+import Types
+import Messages
+
+name :: String
+name = "git-annex"
+
+fullname :: String
+fullname = "refs/heads/" ++ name
+
+{- Ensures that the branch is up-to-date; should be called before
+ - data is read from it. Runs only once per git-annex run. -}
+update :: Annex ()
+update = do
+ updated <- Annex.getState Annex.updated
+ unless updated $ do
+ g <- Annex.gitRepo
+ refs <- liftIO $ Git.pipeRead g [Param "show-ref", Param name]
+ mapM_ updateRef $ map (last . words) (lines refs)
+ Annex.changeState $ \s -> s { Annex.updated = True }
+
+{- Ensures that a given ref has been merged into the local git-annex branch. -}
+updateRef :: String -> Annex ()
+updateRef ref
+ | ref == fullname = return ()
+ | otherwise = do
+ g <- Annex.gitRepo
+ diffs <- liftIO $ Git.pipeRead g [
+ Param "log",
+ Param (name++".."++ref),
+ Params "--oneline -n1"
+ ]
+ unless (null diffs) $ do
+ showSideAction "merging " ++ ref ++ " into " ++ name ++ "..."
+ liftIO $ unionMerge g fullname ref fullname