diff options
-rw-r--r-- | Annex/Direct.hs | 23 | ||||
-rw-r--r-- | doc/bugs/direct_mode_merge_interrupt.mdwn | 12 |
2 files changed, 29 insertions, 6 deletions
diff --git a/Annex/Direct.hs b/Annex/Direct.hs index 5442113af..6e14c6b9b 100644 --- a/Annex/Direct.hs +++ b/Annex/Direct.hs @@ -1,6 +1,6 @@ {- git-annex direct mode - - - Copyright 2012, 2013 Joey Hess <joey@kitenet.net> + - Copyright 2012-2014 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -} @@ -168,7 +168,7 @@ mergeDirect startbranch oldref branch resolvemerge = do createDirectoryIfMissing True d withIndexFile tmpi $ do - merged <- inRepo (mergein d) + merged <- stageMerge d branch r <- if merged then return True else resolvemerge @@ -176,8 +176,23 @@ mergeDirect startbranch oldref branch resolvemerge = do mergeDirectCommit merged startbranch branch liftIO $ rename tmpi reali return r - where - mergein d g = Git.Merge.stageMerge branch $ + +{- Stage a merge into the index, avoiding changing HEAD or the current + - branch. -} +stageMerge :: FilePath -> Git.Branch -> Annex Bool +stageMerge d branch = do + -- XXX A bug in git makes stageMerge unsafe to use if the git repo + -- is configured with core.symlinks=false + -- Using mergeNonInteractive is not ideal though, since it will + -- update the current branch immediately, before the work tree + -- has been updated, which would leave things in an inconsistent + -- state if mergeDirectCleanup is interrupted. + -- <http://marc.info/?l=git&m=140262402204212&w=2> + merger <- ifM (coreSymlinks <$> Annex.getGitConfig) + ( return Git.Merge.stageMerge + , return Git.Merge.mergeNonInteractive + ) + inRepo $ \g -> merger branch $ g { location = Local { gitdir = Git.localGitDir g, worktree = Just d } } {- Commits after a direct mode merge is complete, and after the work diff --git a/doc/bugs/direct_mode_merge_interrupt.mdwn b/doc/bugs/direct_mode_merge_interrupt.mdwn index e64848140..7cbb44208 100644 --- a/doc/bugs/direct_mode_merge_interrupt.mdwn +++ b/doc/bugs/direct_mode_merge_interrupt.mdwn @@ -32,8 +32,16 @@ merge. (I assume this is how `git merge` normally works.) --[[Joey]] > Seems that a direct mode > merge also needs to use a different index file to stage its changes? > (Ugh) -> > [[done]] --[[Joey]] -> +> > done --[[Joey]] + +> > > I had to revert the fix on FAT/Windows due to +> > > a git bug: <http://marc.info/?l=git&m=140262402204212&w=2> +> > > Once that bug's fixed, I can revisit this. --[[Joey]] + +[[!meta title="direct mode merge interrupt (fixed for all except FAT, Windows)"]] + +## other options + > Or could perhaps use `git-merge-tree` > and avoid staging the merge in the index until the work-tree is updated. > |