cfbbda99f4
The last branch ref that the index was updated to is stored in .git/annex/index.lck, and the index only updated when the current branch ref differs. (The .lck file should later be used for locking too.) Some more optimization is still needed, since there is some redundancy in calls to git show-ref.
46 lines
987 B
Haskell
46 lines
987 B
Haskell
{- 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
|
|
|
|
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.gitDir g </> "index.git-union-merge"
|
|
|
|
setup :: Git.Repo -> IO ()
|
|
setup = cleanup -- idempotency
|
|
|
|
cleanup :: Git.Repo -> IO ()
|
|
cleanup g = do
|
|
e' <- doesFileExist (tmpIndex g)
|
|
when e' $ removeFile (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.configRead =<< Git.repoFromCwd
|
|
_ <- Git.useIndex (tmpIndex g)
|
|
setup g
|
|
Git.UnionMerge.merge aref bref g
|
|
_ <- Git.commit "union merge" newref [aref, bref] g
|
|
cleanup g
|