From 64263a84102a316c2843196ef31f1956ee939fd2 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 25 Jun 2025 11:41:56 -0400 Subject: [PATCH] bug --- doc/bugs/test_suite_fail_with_git_2.50.mdwn | 84 +++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 doc/bugs/test_suite_fail_with_git_2.50.mdwn diff --git a/doc/bugs/test_suite_fail_with_git_2.50.mdwn b/doc/bugs/test_suite_fail_with_git_2.50.mdwn new file mode 100644 index 0000000000..0838279883 --- /dev/null +++ b/doc/bugs/test_suite_fail_with_git_2.50.mdwn @@ -0,0 +1,84 @@ +With git 2.50, there are several test suite failures, all involving +`git-annex sync` run in a situation with a conflict. + +git pull or merge fails with "fatal: stash failed" + +git has a known bug with the same symptom, that affected older versions too, +and was reported upstream with a test case, but never fixed. +See [[bugs/resolvemerge_fails_when_unlocked_empty_files_exist]]. + +That bug only affects unlocked empty annexed files. +The failing parts of the test suite use unlocked files, but not empty +files. + +To run one of the failing tests, without running the rest of the test +suite: + + git-annex test -p '$0=="Tests.Repo Tests v10 unlocked.conflict resolution"' + +The failure is somewhat intermittent. + +Comparing with the same test case run with git 2.47.2, with `GIT_TRACE=1` +and `--test-debug`, the new git has this: + + [2025-06-25 10:55:00.363063271] (Utility.Process) process [3665269] call: git ["--git-dir=.git","--work-tree=.","-c","merge.directoryRenames=false","--literal-pathspecs","-c","annex.debug=true","merge","--no-edit","refs/remotes/r2/master"] + ... + 10:55:00.492909 run-command.c:673 trace: run_command: git stash create + 10:55:00.492924 run-command.c:765 trace: start_command: /usr/lib/git-core/git stash create + 10:55:00.494550 git.c:476 trace: built-in: git stash create + 10:55:00.495283 run-command.c:673 trace: run_command: 'git-annex smudge --clean -- '\''conflictor'\''' + 10:55:00.495304 run-command.c:765 trace: start_command: /bin/sh -c 'git-annex smudge --clean -- '\''conflictor'\''' 'git-annex smudge --clean -- '\''conflictor'\''' + 10:55:00.510128 git.c:476 trace: built-in: git config --null --list + [2025-06-25 10:55:00.514560172] (Utility.Process) process [3665339] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch-check=%(objectname) %(objecttype) %(objectsize)"] + 10:55:00.514833 git.c:476 trace: built-in: git cat-file '--batch-check=%(objectname) %(objecttype) %(objectsize)' + 10:55:00.517739 git.c:476 trace: built-in: git cat-file --batch + [2025-06-25 10:55:00.519817243] (Utility.Process) process [3665342] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch"] + [2025-06-25 10:55:00.524719227] (Utility.Process) process [3665344] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","-c","filter.annex.smudge=","-c","filter.annex.clean=","-c","filter.annex.process=","write-tree"] + [2025-06-25 10:55:00.525956861] (Utility.Process) process [3665344] done ExitFailure 128 + [2025-06-25 10:55:00.526033972] (Database.Keys) reconcileStaged start (in conflict) + [2025-06-25 10:55:00.529125922] (Utility.Process) process [3665346] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","show-ref","--hash","refs/annex/last-index"] + 10:55:00.530711 git.c:476 trace: built-in: git show-ref --hash refs/annex/last-index + [2025-06-25 10:55:00.531264053] (Utility.Process) process [3665346] done ExitSuccess + [2025-06-25 10:55:00.531808824] (Utility.Process) process [3665347] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch-check=%(objectname) %(objecttype) %(objectsize)","--buffer"] + [2025-06-25 10:55:00.534102268] (Utility.Process) process [3665348] chat: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","cat-file","--batch=%(objectname) %(objecttype) %(objectsize)","--buffer"] + 10:55:00.534260 git.c:476 trace: built-in: git cat-file '--batch-check=%(objectname) %(objecttype) %(objectsize)' --buffer + [2025-06-25 10:55:00.537040154] (Utility.Process) process [3665349] read: git ["--git-dir=.git","--work-tree=.","--literal-pathspecs","-c","filter.annex.smudge=","-c","filter.annex.clean=","-c","filter.annex.process=","-c","diff.external=","diff","0fbd88293710b6a33cda68626d317e6ee0e991d5","--staged","--raw","-z","--no-abbrev","-G/annex/objects/","--no-renames","--ignore-submodules=all","--no-textconv","--no-ext-diff"] + 10:55:00.537633 git.c:476 trace: built-in: git cat-file '--batch=%(objectname) %(objecttype) %(objectsize)' --buffer + 10:55:00.537839 git.c:476 trace: built-in: git diff 0fbd88293710b6a33cda68626d317e6ee0e991d5 --staged --raw -z --no-abbrev-G/annex/objects/ --no-renames --ignore-submodules=all --no-textconv --no-ext-diff + [2025-06-25 10:55:00.539717016] (Utility.Process) process [3665349] done ExitSuccess + [2025-06-25 10:55:00.540326407] (Utility.Process) process [3665348] done ExitSuccess + [2025-06-25 10:55:00.540404379] (Utility.Process) process [3665347] done ExitSuccess + [2025-06-25 10:55:00.540459121] (Database.Keys) reconcileStaged end + [2025-06-25 10:55:00.541662584] (Utility.Process) process [3665342] done ExitSuccess + [2025-06-25 10:55:00.542107582] (Utility.Process) process [3665339] done ExitSuccess + fatal: stash failed + [2025-06-25 10:55:00.555752855] (Utility.Process) process [3665269] done ExitFailure 128 + +The old git has: + + 10:52:18.580330 run-command.c:666 trace: run_command: git stash create + 10:52:18.580348 run-command.c:758 trace: start_command: /usr/lib/git-core/git stash create + 10:52:18.581939 git.c:479 trace: built-in: git stash create + 10:52:18.583737 run-command.c:666 trace: run_command: 'git-annex smudge -- '\''conflictor'\''' + 10:52:18.583751 run-command.c:758 trace: start_command: /bin/sh -c 'git-annex smudge -- '\''conflictor'\''' 'git-annex smudge -- '\''conflictor'\''' + 10:52:18.589604 git.c:479 trace: built-in: git config --null --list + Auto-merging conflictor + +So, `git merge` has changed to run the smudge clean hook, on the conflicted +file. + +It seemed possible that git is feeding in a different version of the file +than the one in the working tree, which would make git-annex's smudge clean +filter use the working tree version of the file, which would not be good. +(Why that would cause git to explode I don't know.) So, I instrumented +`git-annex smudge`, and verified that in each case where it uses the +content of the file on disk, that is the same as the file content that was +provided to it on stdin. So that seems to rule out this theory. + +Noticing that `reconcileStaged` is getting run in the new log and not in +the old log, I replaced it with a noop. **That avoids the problem.** + +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..