aboutsummaryrefslogtreecommitdiff
path: root/Command/Sync.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Command/Sync.hs')
-rw-r--r--Command/Sync.hs31
1 files changed, 26 insertions, 5 deletions
diff --git a/Command/Sync.hs b/Command/Sync.hs
index c9493b2a4..331f5d03f 100644
--- a/Command/Sync.hs
+++ b/Command/Sync.hs
@@ -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