diff options
Diffstat (limited to 'git-union-merge.hs')
-rw-r--r-- | git-union-merge.hs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/git-union-merge.hs b/git-union-merge.hs new file mode 100644 index 000000000..0e4cd644c --- /dev/null +++ b/git-union-merge.hs @@ -0,0 +1,48 @@ +{- git-union-merge program + - + - Copyright 2011 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +import System.Environment + +import Common +import qualified Git.UnionMerge +import qualified Git.Config +import qualified Git.CurrentRepo +import qualified Git.Branch +import qualified Git.Index +import qualified Git + +header :: String +header = "Usage: git-union-merge ref ref newref" + +usage :: IO a +usage = error $ "bad parameters\n\n" ++ header + +tmpIndex :: Git.Repo -> FilePath +tmpIndex g = Git.localGitDir g </> "index.git-union-merge" + +setup :: Git.Repo -> IO () +setup = cleanup -- idempotency + +cleanup :: Git.Repo -> IO () +cleanup g = nukeFile $ tmpIndex g + +parseArgs :: IO [String] +parseArgs = do + args <- getArgs + if length args /= 3 + then usage + else return args + +main :: IO () +main = do + [aref, bref, newref] <- map Git.Ref <$> parseArgs + g <- Git.Config.read =<< Git.CurrentRepo.get + _ <- Git.Index.override $ tmpIndex g + setup g + Git.UnionMerge.merge aref bref g + _ <- Git.Branch.commit "union merge" newref [aref, bref] g + cleanup g |