diff options
Diffstat (limited to 'Branch.hs')
-rw-r--r-- | Branch.hs | 50 |
1 files changed, 50 insertions, 0 deletions
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 |