summaryrefslogtreecommitdiff
path: root/Annex/AutoMerge.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Annex/AutoMerge.hs')
-rw-r--r--Annex/AutoMerge.hs25
1 files changed, 17 insertions, 8 deletions
diff --git a/Annex/AutoMerge.hs b/Annex/AutoMerge.hs
index 074e955d7..e6f2be552 100644
--- a/Annex/AutoMerge.hs
+++ b/Annex/AutoMerge.hs
@@ -23,7 +23,7 @@ import qualified Git.Merge
import qualified Git.Ref
import qualified Git
import qualified Git.Branch
-import Git.Types (BlobType(..))
+import Git.Types (BlobType(..), fromBlobType)
import Git.FilePath
import Config
import Annex.ReplaceFile
@@ -31,6 +31,7 @@ import Annex.VariantFile
import qualified Database.Keys
import Annex.InodeSentinal
import Utility.InodeCache
+import Utility.FileMode
import qualified Data.Set as S
import qualified Data.Map as M
@@ -152,12 +153,12 @@ resolveMerge' unstagedmap (Just us) them inoverlay u = do
-- In either case, keep original filename.
if islocked LsFiles.valUs && islocked LsFiles.valThem
then makesymlink keyUs file
- else makepointer keyUs file
+ else makepointer keyUs file (combinedmodes)
return ([keyUs, keyThem], Just file)
-- Our side is annexed file, other side is not.
(Just keyUs, Nothing) -> resolveby [keyUs] $ do
graftin them file LsFiles.valThem LsFiles.valThem LsFiles.valUs
- makeannexlink keyUs LsFiles.valUs
+ makeannexlink keyUs LsFiles.valUs
-- Our side is not annexed file, other side is.
(Nothing, Just keyThem) -> resolveby [keyThem] $ do
graftin us file LsFiles.valUs LsFiles.valUs LsFiles.valThem
@@ -174,11 +175,19 @@ resolveMerge' unstagedmap (Just us) them inoverlay u = do
islocked select = select (LsFiles.unmergedBlobType u) == Just SymlinkBlob
+ combinedmodes = case catMaybes [ourmode, theirmode] of
+ [] -> Nothing
+ l -> Just (combineModes l)
+ where
+ ourmode = fromBlobType <$> LsFiles.valUs (LsFiles.unmergedBlobType u)
+ theirmode = fromBlobType <$> LsFiles.valThem (LsFiles.unmergedBlobType u)
+
makeannexlink key select
| islocked select = makesymlink key dest
- | otherwise = makepointer key dest
+ | otherwise = makepointer key dest destmode
where
dest = variantFile file key
+ destmode = fromBlobType <$> select (LsFiles.unmergedBlobType u)
stagefile :: FilePath -> Annex FilePath
stagefile f
@@ -194,16 +203,16 @@ resolveMerge' unstagedmap (Just us) them inoverlay u = do
replacewithsymlink dest link = withworktree dest $ \f ->
replaceFile f $ makeGitLink link
- makepointer key dest = do
+ makepointer key dest destmode = do
unless inoverlay $
unlessM (reuseOldFile unstagedmap key file dest) $ do
- r <- linkFromAnnex key dest
+ r <- linkFromAnnex key dest destmode
case r of
LinkAnnexFailed -> liftIO $
- writeFile dest (formatPointer key)
+ writePointerFile dest key destmode
_ -> noop
dest' <- stagefile dest
- stagePointerFile dest' =<< hashPointerFile key
+ stagePointerFile dest' destmode =<< hashPointerFile key
unless inoverlay $
Database.Keys.addAssociatedFile key
=<< inRepo (toTopFilePath dest)