add test case & fix conflict resolution bug on Windows & FAT
Fix bug in automatic merge conflict resolution code when used
on a filesystem not supporting symlinks, which resulted in it losing
track of the symlink bit of annexed files.
This was the underlying bug that was causing another test to fail,
which got worked around in 1c997fd08c
.
I've chosen to keep 2 separate test cases since the old test case only
detected the problem accidentially.
Test suite passes on FAT & in windows, as well as on proper unix systems.
This commit was sponsored by Ellis Whitehead.
This commit is contained in:
parent
88003c446b
commit
751f496c11
3 changed files with 42 additions and 10 deletions
|
@ -392,14 +392,10 @@ resolveMerge' u
|
|||
-- Our side is annexed, other side is not.
|
||||
(Just keyUs, Nothing) -> do
|
||||
ifM isDirect
|
||||
-- Move newly added non-annexed object
|
||||
-- out of direct mode merge directory.
|
||||
( do
|
||||
removeoldfile keyUs
|
||||
makelink keyUs
|
||||
d <- fromRepo gitAnnexMergeDir
|
||||
liftIO $ rename (d </> file) file
|
||||
-- cleaup tree after git merge
|
||||
movefromdirectmerge file
|
||||
, do
|
||||
unstageoldfile
|
||||
makelink keyUs
|
||||
|
@ -433,6 +429,31 @@ resolveMerge' u
|
|||
getKey select = case select (LsFiles.unmergedSha u) of
|
||||
Nothing -> return Nothing
|
||||
Just sha -> catKey sha symLinkMode
|
||||
|
||||
{- Move something out of the direct mode merge directory and into
|
||||
- the git work tree.
|
||||
-
|
||||
- On a filesystem not supporting symlinks, this is complicated
|
||||
- because a directory may contain annex links, but just
|
||||
- moving them into the work tree will not let git know they are
|
||||
- symlinks.
|
||||
-
|
||||
- Also, if the content of the file is available, make it available
|
||||
- in direct mode.
|
||||
-}
|
||||
movefromdirectmerge item = do
|
||||
d <- fromRepo gitAnnexMergeDir
|
||||
liftIO $ rename (d </> item) item
|
||||
mapM_ setuplink =<< liftIO (dirContentsRecursive item)
|
||||
setuplink f = do
|
||||
v <- getAnnexLinkTarget f
|
||||
case v of
|
||||
Nothing -> noop
|
||||
Just target -> do
|
||||
unlessM (coreSymlinks <$> Annex.getGitConfig) $
|
||||
addAnnexLink target f
|
||||
maybe noop (flip toDirect f)
|
||||
(fileKey (takeFileName target))
|
||||
|
||||
{- git-merge moves conflicting files away to files
|
||||
- named something like f~HEAD or f~branch, but the
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue