summaryrefslogtreecommitdiff
path: root/git-union-merge.hs
diff options
context:
space:
mode:
Diffstat (limited to 'git-union-merge.hs')
-rw-r--r--git-union-merge.hs48
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