work around a bug in git
http://marc.info/?l=git&m=140262402204212&w=2 This git bug manifested on FAT and Windows as the test suite failing in 3 places. All involved merge conflict resolution. It turned out that the associated file mappings were getting messed up, and that happened because this git bug lost track of what files were supposed to be symlinks. This commit was sponsored by Eric Kidd.
This commit is contained in:
parent
a7c15d0e51
commit
b30de0dfd2
2 changed files with 29 additions and 6 deletions
|
@ -1,6 +1,6 @@
|
||||||
{- git-annex direct mode
|
{- 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.
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
@ -168,7 +168,7 @@ mergeDirect startbranch oldref branch resolvemerge = do
|
||||||
createDirectoryIfMissing True d
|
createDirectoryIfMissing True d
|
||||||
|
|
||||||
withIndexFile tmpi $ do
|
withIndexFile tmpi $ do
|
||||||
merged <- inRepo (mergein d)
|
merged <- stageMerge d branch
|
||||||
r <- if merged
|
r <- if merged
|
||||||
then return True
|
then return True
|
||||||
else resolvemerge
|
else resolvemerge
|
||||||
|
@ -176,8 +176,23 @@ mergeDirect startbranch oldref branch resolvemerge = do
|
||||||
mergeDirectCommit merged startbranch branch
|
mergeDirectCommit merged startbranch branch
|
||||||
liftIO $ rename tmpi reali
|
liftIO $ rename tmpi reali
|
||||||
return r
|
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 } }
|
g { location = Local { gitdir = Git.localGitDir g, worktree = Just d } }
|
||||||
|
|
||||||
{- Commits after a direct mode merge is complete, and after the work
|
{- Commits after a direct mode merge is complete, and after the work
|
||||||
|
|
|
@ -32,8 +32,16 @@ merge. (I assume this is how `git merge` normally works.) --[[Joey]]
|
||||||
> Seems that a direct mode
|
> Seems that a direct mode
|
||||||
> merge also needs to use a different index file to stage its changes?
|
> merge also needs to use a different index file to stage its changes?
|
||||||
> (Ugh)
|
> (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`
|
> Or could perhaps use `git-merge-tree`
|
||||||
> and avoid staging the merge in the index until the work-tree is updated.
|
> and avoid staging the merge in the index until the work-tree is updated.
|
||||||
>
|
>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue