From fb155b1e3e59cc1f9cf8a4fe7d47cba49d1c81af Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 25 Jun 2025 13:36:19 -0400 Subject: [PATCH] Work around git 2.50 bug that caused it to crash when there is a merge conflict with an unlocked annexed file This fixes several test suite failures with git 2.50. See the bug report for the full, gory details. --- CHANGELOG | 2 ++ Database/Keys.hs | 12 ++++++++++-- doc/bugs/test_suite_fail_with_git_2.50.mdwn | 12 ++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index bf58959309..8af3c1889a 100644 --- 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 Mon, 23 Jun 2025 11:11:29 -0400 diff --git a/Database/Keys.hs b/Database/Keys.hs index cc3f189b99..22962e1372 100644 --- a/Database/Keys.hs +++ b/Database/Keys.hs @@ -1,6 +1,6 @@ {- Sqlite database of information about Keys - - - Copyright 2015-2022 Joey Hess + - Copyright 2015-2025 Joey Hess - - 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 diff --git a/doc/bugs/test_suite_fail_with_git_2.50.mdwn b/doc/bugs/test_suite_fail_with_git_2.50.mdwn index 0838279883..b8940169b6 100644 --- a/doc/bugs/test_suite_fail_with_git_2.50.mdwn +++ b/doc/bugs/test_suite_fail_with_git_2.50.mdwn @@ -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]]