avoid making post-merge-conflict-resolution commit when no conflicts were resolved
authorJoey Hess <joeyh@joeyh.name>
Thu, 15 Oct 2015 18:22:46 +0000 (14:22 -0400)
committerJoey Hess <joeyh@joeyh.name>
Thu, 15 Oct 2015 18:22:46 +0000 (14:22 -0400)
sync, merge, assistant: When git merge failed for a reason other than a
conflicted merge, such as a crippled filesystem not allowing particular
characters in filenames, git-annex would make a merge commit that could
omit such files or otherwise be bad. Fixed by aborting the whole merge
process when git merge fails for any reason other than a merge conflict.

Annex/AutoMerge.hs
Annex/Direct.hs
debian/changelog

index 825dde443ee577b9c35eed5676d0e1aef2552e84..bfbe71dc28d2f523746d51ce2116aec61509fe2e 100644 (file)
@@ -77,6 +77,10 @@ autoMergeFrom branch currbranch commitmode = do
  - In direct mode, the work tree is not touched here; files are staged to
  - the index, and written to the gitAnnexMergeDir, for later handling by
  - the direct mode merge code.
+ -
+ - Returns false when there are no merge conflicts to resolve.
+ - A git merge can fail for other reasons, and this allows detecting
+ - such failures.
  -}
 resolveMerge :: Maybe Git.Ref -> Git.Ref -> Annex Bool
 resolveMerge us them = do
index 35a5b5013394f4e676d8adcde26b42e751f7f8b5..eb8d4842d5c139396d19c8d5ca5db7331c5b0d66 100644 (file)
@@ -173,16 +173,18 @@ mergeDirect startbranch oldref branch resolvemerge commitmode = exclusively $ do
 
        withIndexFile tmpi $ do
                merged <- stageMerge d branch commitmode
-               r <- if merged
+               ok <- if merged
                        then return True
                        else resolvemerge
-               mergeDirectCleanup d (fromMaybe Git.Sha.emptyTree oldref)
-               mergeDirectCommit merged startbranch branch commitmode
+               if ok
+                       then do
+                               mergeDirectCleanup d (fromMaybe Git.Sha.emptyTree oldref)
+                               mergeDirectCommit merged startbranch branch commitmode
+                               liftIO $ whenM (doesFileExist tmpi) $
+                                       rename tmpi reali
+                       else liftIO $ nukeFile tmpi
 
-               liftIO $ whenM (doesFileExist tmpi) $
-                       rename tmpi reali
-
-               return r
+               return ok
   where
        exclusively = withExclusiveLock gitAnnexMergeLock
 
index 709ae893caec7d1bc74882afe64492a80b385118..5be414bd1df9e887f281af53fd35913762645db9 100644 (file)
@@ -36,6 +36,12 @@ git-annex (5.20150931) UNRELEASED; urgency=medium
   * Avoid unncessary write to the location log when a file is unlocked
     and then added back with unchanged content.
   * S3: Fix support for using https.
+  * sync, merge, assistant: When git merge failed for a reason other
+    than a conflicted merge, such as a crippled filesystem not allowing
+    particular characters in filenames, git-annex would make a merge commit
+    that could omit such files or otherwise be bad. Fixed by aborting the
+    whole merge process when git merge fails for any reason other than a
+    merge conflict.
   * Debian: Add torrent library to build-depends as it's packaged now,
     and stop recommending bittornado | bittorrent.
   * Debian: Remove dependency on transformers library, as it is now