Work around git 2.50 bug that caused it to crash when there is a merge conflict with...
authorJoey Hess <joeyh@joeyh.name>
Wed, 25 Jun 2025 17:36:19 +0000 (13:36 -0400)
committerJoey Hess <joeyh@joeyh.name>
Wed, 25 Jun 2025 17:36:23 +0000 (13:36 -0400)
This fixes several test suite failures with git 2.50.

See the bug report for the full, gory details.

CHANGELOG
Database/Keys.hs
doc/bugs/test_suite_fail_with_git_2.50.mdwn

index bf58959309b2093b49e7724b14c57889f2bc3043..8af3c1889a9b1017a20440b4aad10ed18abc5727 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,8 @@ git-annex (10.20250606) UNRELEASED; urgency=medium
     filesystems like VFAT that don't support such filenames.
   * webapp: Rename "Upgrade Repository" to "Convert Repository"
     to avoid confusion with git-annex upgrade.
+  * Work around git 2.50 bug that caused it to crash when there is a merge
+    conflict with an unlocked annexed file.
 
  -- Joey Hess <id@joeyh.name>  Mon, 23 Jun 2025 11:11:29 -0400
 
index cc3f189b993b31b389c4c548842c461dbb8a2527..22962e13723837da312339d2615250cd1848efda 100644 (file)
@@ -1,6 +1,6 @@
 {- Sqlite database of information about Keys
  -
- - Copyright 2015-2022 Joey Hess <id@joeyh.name>
+ - Copyright 2015-2025 Joey Hess <id@joeyh.name>
  -
  - Licensed under the GNU AGPL version 3 or higher.
  -}
@@ -260,7 +260,7 @@ isInodeKnown i s = or <$> runReaderIO ContentTable
  - is an associated file.
  -}
 reconcileStaged :: Bool -> H.DbQueue -> Annex DbTablesChanged
-reconcileStaged dbisnew qh = ifM isBareRepo
+reconcileStaged dbisnew qh = ifM notneeded
        ( return mempty
        , do
                gitindex <- inRepo currentIndexFile
@@ -335,6 +335,14 @@ reconcileStaged dbisnew qh = ifM isBareRepo
        getindextree = inRepo $ \r -> writeTreeQuiet $ r
                { gitGlobalOpts = gitGlobalOpts r ++ bypassSmudgeConfig }
        
+       notneeded = isBareRepo
+               -- Avoid doing anything when run by the 
+               -- smudge clean filter. When that happens in a conflicted
+               -- merge situation, running git write-tree
+               -- here would cause git merge to fail with an internal
+               -- error. This works around around that bug in git.
+               <||> Annex.getState Annex.insmudgecleanfilter
+       
        diff old new =
                -- Avoid running smudge clean filter, since we want the
                -- raw output, and it would block trying to access the
index 0838279883859c11a28d0febf099eb1267db78ed..b8940169b65131ce2550deb1e4bbc574ffa171bb 100644 (file)
@@ -82,3 +82,15 @@ So, something that reconcileStaged does is making git unhappy when it
 runs the smudge clean filter while creating a stash. It seems logical that
 the problem would involve the index file, which `reconcileStaged` touches,
 and which gets updated when stashing..
+
+> Made reconcileStaged run `git write-tree` but not do anything else, and
+> that is sufficient to make git stash fail. This must be a bug in git,
+> `git write-tree` should be able to be run at any time, even if it exits
+> 1 due to the index being in conflict. Having `git write-tree` affect
+> another process that was already running is not good behavior for git.
+> Since `git write-tree` does need to sometimes update the index,
+> this feels like lacking locking.
+> 
+> I have worked around this by making reconcileStaged avoid doing anything
+> when called by the smudge clean filter. Which I don't think will cause
+> any other problems, fingers crossed. [[done]] --[[Joey]]